func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error { var ses query.Session switch queryLanguage { case "sexp": ses = sexp.NewSession(h.QuadStore) case "mql": ses = mql.NewSession(h.QuadStore) case "gremlin": fallthrough default: ses = gremlin.NewSession(h.QuadStore, cfg.Timeout, true) } term, err := terminal(history) if os.IsNotExist(err) { fmt.Printf("creating new history file: %q\n", history) } defer persist(term, history) var ( prompt = ps1 code string ) for { if len(code) == 0 { prompt = ps1 } else { prompt = ps2 } line, err := term.Prompt(prompt) if err != nil { if err == io.EOF { fmt.Println() return nil } return err } term.AppendHistory(line) line = strings.TrimSpace(line) if len(line) == 0 || line[0] == '#' { continue } if code == "" { cmd, args := splitLine(line) switch cmd { case ":debug": args = strings.TrimSpace(args) var debug bool switch args { case "t": debug = true case "f": // Do nothing. default: debug, err = strconv.ParseBool(args) if err != nil { fmt.Printf("Error: cannot parse %q as a valid boolean - acceptable values: 't'|'true' or 'f'|'false'\n", args) continue } } ses.Debug(debug) fmt.Printf("Debug set to %t\n", debug) continue case ":a": quad, err := cquads.Parse(args) if err != nil { fmt.Printf("Error: not a valid quad: %v\n", err) continue } h.QuadWriter.WriteQuad(quad) continue case ":d": quad, err := cquads.Parse(args) if err != nil { fmt.Printf("Error: not a valid quad: %v\n", err) continue } err = h.QuadWriter.RemoveQuad(quad) if err != nil { fmt.Printf("error deleting: %v\n", err) } continue case "exit": term.Close() os.Exit(0) default: if cmd[0] == ':' { fmt.Printf("Unknown command: %q\n", cmd) continue } } } code += line result, err := ses.Parse(code) switch result { case query.Parsed: Run(code, ses) code = "" case query.ParseFail: fmt.Println("Error: ", err) code = "" case query.ParseMore: } } }
func Repl(ts graph.TripleStore, queryLanguage string, cfg *config.Config) error { var ses query.Session switch queryLanguage { case "sexp": ses = sexp.NewSession(ts) case "mql": ses = mql.NewSession(ts) case "gremlin": fallthrough default: ses = gremlin.NewSession(ts, cfg.Timeout, true) } buf := bufio.NewReader(os.Stdin) var line []byte for { if len(line) == 0 { fmt.Print("cayley> ") } else { fmt.Print("... ") } l, prefix, err := buf.ReadLine() if err == io.EOF { if len(line) != 0 { line = line[:0] } else { return nil } } if err != nil { line = line[:0] } if prefix { return errors.New("line too long") } line = append(line, l...) if len(line) == 0 { continue } line = bytes.TrimSpace(line) if len(line) == 0 || line[0] == '#' { line = line[:0] continue } if bytes.HasPrefix(line, []byte(":debug")) { ses.ToggleDebug() fmt.Println("Debug Toggled") line = line[:0] continue } if bytes.HasPrefix(line, []byte(":a")) { var tripleStmt = line[3:] triple, err := cquads.Parse(string(tripleStmt)) if !triple.IsValid() { if err != nil { fmt.Printf("not a valid triple: %v\n", err) } line = line[:0] continue } ts.AddTriple(triple) line = line[:0] continue } if bytes.HasPrefix(line, []byte(":d")) { var tripleStmt = line[3:] triple, err := cquads.Parse(string(tripleStmt)) if !triple.IsValid() { if err != nil { fmt.Printf("not a valid triple: %v\n", err) } line = line[:0] continue } ts.RemoveTriple(triple) line = line[:0] continue } result, err := ses.InputParses(string(line)) switch result { case query.Parsed: Run(string(line), ses) line = line[:0] case query.ParseFail: fmt.Println("Error: ", err) line = line[:0] case query.ParseMore: } } }
func Repl(h *graph.Handle, queryLanguage string, cfg *config.Config) error { var ses query.Session switch queryLanguage { case "sexp": ses = sexp.NewSession(h.QuadStore) case "mql": ses = mql.NewSession(h.QuadStore) case "gremlin": fallthrough default: ses = gremlin.NewSession(h.QuadStore, cfg.Timeout, true) } term, err := terminal(history) if os.IsNotExist(err) { fmt.Printf("creating new history file: %q\n", history) } defer persist(term, history) var ( prompt = ps1 code string ) for { if len(code) == 0 { prompt = ps1 } else { prompt = ps2 } line, err := term.Prompt(prompt) if err != nil { if err == io.EOF { fmt.Println() return nil } return err } term.AppendHistory(line) line = strings.TrimSpace(line) if len(line) == 0 || line[0] == '#' { continue } if code == "" { switch { case strings.HasPrefix(line, ":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) } 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) } continue } h.QuadWriter.RemoveQuad(quad) continue } } code += line result, err := ses.InputParses(code) switch result { case query.Parsed: Run(code, ses) code = "" case query.ParseFail: fmt.Println("Error: ", err) code = "" case query.ParseMore: } } }