Implements helper to split command from arguments

Also tests the helper function (ofc...)
This commit is contained in:
bcleenders 2014-12-29 00:00:31 +01:00
parent 1177852de7
commit 8efb94d2b7
2 changed files with 99 additions and 14 deletions

View file

@ -118,29 +118,28 @@ func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error {
}
if code == "" {
switch {
case strings.HasPrefix(line, ":debug"):
command, arguments := splitLine(line)
switch command {
case ":debug":
ses.ToggleDebug()
fmt.Println("Debug Toggled")
continue
case strings.HasPrefix(line, ":a "):
quad, err := cquads.Parse(line[3:])
if !quad.IsValid() {
if err != nil {
fmt.Printf("not a valid quad: %v\n", err)
}
case ":a":
quad, err := cquads.Parse(arguments)
if err != nil {
fmt.Printf("Error: not a valid quad: %v\n", err)
continue
}
h.QuadWriter.AddQuad(quad)
continue
case strings.HasPrefix(line, ":d "):
quad, err := cquads.Parse(line[3:])
if !quad.IsValid() {
if err != nil {
fmt.Printf("not a valid quad: %v\n", err)
}
case ":d":
quad, err := cquads.Parse(arguments)
if err != nil {
fmt.Printf("Error: not a valid quad: %v\n", err)
continue
}
h.QuadWriter.RemoveQuad(quad)
@ -163,6 +162,26 @@ func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error {
}
}
// Splits a line into a command and its arguments
// e.g. ":a b c d ." will be split into ":a" and " b c d ."
func splitLine(line string) (string, string) {
var command, arguments string
line = strings.TrimSpace(line)
// An empty line/a line consisting of whitespace contains neither command nor arguments
if len(line) > 0 {
command = strings.Fields(line)[0]
// A line containing only a command has no arguments
if len(line) > len(command) {
arguments = line[len(command):]
}
}
return command, arguments
}
func terminal(path string) (*liner.State, error) {
term := liner.NewLiner()

66
db/repl_test.go Normal file
View file

@ -0,0 +1,66 @@
// Copyright 2014 The Cayley Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package db
import (
"testing"
)
var testSplitLines = []struct {
line string
expectedCommand string
expectedArguments string
err error
}{
{
line: ":a arg1 arg2 arg3 .",
expectedCommand: ":a",
expectedArguments: " arg1 arg2 arg3 .",
},
{
line: ":debug",
expectedCommand: ":debug",
// expectedArguments is nil
},
{
line: "",
// expectedCommand is nil
// expectedArguments is nil
},
{
line: `:d <http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> . # comments here`,
expectedCommand: ":d",
expectedArguments: ` <http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> . # comments here`,
},
{
line: ` :a subject "predicate with spaces" object . `,
expectedCommand: ":a",
expectedArguments: ` subject "predicate with spaces" object .`,
},
}
func TestSplitLines(t *testing.T) {
for _, testcase := range testSplitLines {
command, arguments := splitLine(testcase.line)
if testcase.expectedCommand != command {
t.Errorf("Error splitting lines: got: %v expected: %v", command, testcase.expectedCommand)
}
if testcase.expectedArguments != arguments {
t.Errorf("Error splitting lines: got: %v expected: %v", arguments, testcase.expectedArguments)
}
}
}