From 295a379ed79ad80c892c2952fc6d3b20cd4deb69 Mon Sep 17 00:00:00 2001 From: bcleenders Date: Mon, 29 Dec 2014 00:00:31 +0100 Subject: [PATCH] Implements helper to split command from arguments Also tests the helper function (ofc...) --- db/repl.go | 47 ++++++++++++++++++++++++++++------------ db/repl_test.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 db/repl_test.go diff --git a/db/repl.go b/db/repl.go index 6722299..afddf80 100644 --- a/db/repl.go +++ b/db/repl.go @@ -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() diff --git a/db/repl_test.go b/db/repl_test.go new file mode 100644 index 0000000..412796c --- /dev/null +++ b/db/repl_test.go @@ -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 . # comments here`, + expectedCommand: ":d", + expectedArguments: ` . # 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) + } + } +}