Skip to content

Commit

Permalink
Migrate to reeflective/readline
Browse files Browse the repository at this point in the history
  • Loading branch information
apstndb committed Oct 20, 2024
1 parent 681dba8 commit fb6b9d4
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 85 deletions.
43 changes: 30 additions & 13 deletions cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ import (

"cloud.google.com/go/spanner"
pb "cloud.google.com/go/spanner/apiv1/spannerpb"
"github.com/chzyer/readline"
"github.com/olekukonko/tablewriter"
"github.com/reeflective/readline"
"google.golang.org/api/option"
"google.golang.org/grpc/codes"
)
Expand Down Expand Up @@ -103,14 +103,24 @@ func NewCli(projectId, instanceId, databaseId, prompt, historyFile string, crede
}

func (c *Cli) RunInteractive() int {
rl, err := readline.NewEx(&readline.Config{
Stdin: c.InStream,
HistoryFile: c.HistoryFile,
})
if err != nil {
return c.ExitOnError(err)
shell := readline.NewShell()
shell.AcceptMultiline = func(line []rune) (accept bool) {
statements := separateInput(string(line))
switch len(statements) {
case 0:
return false
case 1:
if statements[0].delim != delimiterUndefined {
return true
}
default:
return true
}
return false
}

shell.History.AddFromFile("history name", c.HistoryFile)

exists, err := c.Session.DatabaseExists()
if err != nil {
return c.ExitOnError(err)
Expand All @@ -123,9 +133,17 @@ func (c *Cli) RunInteractive() int {

for {
prompt := c.getInterpolatedPrompt()
rl.SetPrompt(prompt)

input, err := readInteractiveInput(rl, prompt)
shell.Prompt.Primary(func() string {
return prompt
})

// TODO: Currently not work
shell.Prompt.Secondary(func() string {
return "->"
})

input, err := readInteractiveInput(shell, prompt)
if err == io.EOF {
return c.Exit()
}
Expand Down Expand Up @@ -321,9 +339,7 @@ func createSession(projectId string, instanceId string, databaseId string, crede
return NewSession(projectId, instanceId, databaseId, priority, role, directedRead, opts...)
}

func readInteractiveInput(rl *readline.Instance, prompt string) (*inputStatement, error) {
defer rl.SetPrompt(prompt)

func readInteractiveInput(rl *readline.Shell, prompt string) (*inputStatement, error) {
var input string
for {
line, err := rl.Readline()
Expand All @@ -350,8 +366,9 @@ func readInteractiveInput(rl *readline.Instance, prompt string) (*inputStatement
if l := len(prompt); l >= 3 {
margin = strings.Repeat(" ", l-3)
}
rl.SetPrompt(margin + "-> ")
_ = margin
}

}

func printResult(out io.Writer, result *Result, mode DisplayMode, interactive, verbose bool) {
Expand Down
73 changes: 1 addition & 72 deletions cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,11 @@ import (
"bytes"
"fmt"
"io"
"io/ioutil"
"strings"
"testing"
"time"

sppb "cloud.google.com/go/spanner/apiv1/spannerpb"
"github.com/chzyer/readline"
"github.com/google/go-cmp/cmp"
)

Expand Down Expand Up @@ -112,76 +110,7 @@ func TestBuildCommands(t *testing.T) {
}
}

func TestReadInteractiveInput(t *testing.T) {
for _, tt := range []struct {
desc string
input string
want *inputStatement
wantError bool
}{
{
desc: "single line",
input: "SELECT 1;\n",
want: &inputStatement{
statement: "SELECT 1",
statementWithoutComments: "SELECT 1",
delim: delimiterHorizontal,
},
},
{
desc: "multi lines",
input: "SELECT\n* FROM\n t1\n;\n",
want: &inputStatement{
statement: "SELECT\n* FROM\n t1",
statementWithoutComments: "SELECT\n* FROM\n t1",
delim: delimiterHorizontal,
},
},
{
desc: "multi lines with vertical delimiter",
input: "SELECT\n* FROM\n t1\\G\n",
want: &inputStatement{
statement: "SELECT\n* FROM\n t1",
statementWithoutComments: "SELECT\n* FROM\n t1",
delim: delimiterVertical,
},
},
{
desc: "multi lines with multiple comments",
input: "SELECT\n/* comment */1,\n# comment\n2;\n",
want: &inputStatement{
statement: "SELECT\n/* comment */1,\n# comment\n2",
statementWithoutComments: "SELECT\n 1,\n 2",
delim: delimiterHorizontal,
},
},
{
desc: "multiple statements",
input: "SELECT 1; SELECT 2;",
want: nil,
wantError: true,
},
} {
t.Run(tt.desc, func(t *testing.T) {
rl, err := readline.NewEx(&readline.Config{
Stdin: ioutil.NopCloser(strings.NewReader(tt.input)),
Stdout: ioutil.Discard,
Stderr: ioutil.Discard,
})
if err != nil {
t.Fatalf("unexpected readline.NewEx() error: %v", err)
}

got, err := readInteractiveInput(rl, "")
if err != nil && !tt.wantError {
t.Errorf("readInteractiveInput(%q) got error: %v", tt.input, err)
}
if diff := cmp.Diff(tt.want, got, cmp.AllowUnexported(inputStatement{})); diff != "" {
t.Errorf("difference in statement: (-want +got):\n%s", diff)
}
})
}
}
// TODO: Consider test of readline

func TestPrintResult(t *testing.T) {
t.Run("DisplayModeTable", func(t *testing.T) {
Expand Down
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/google/go-cmp v0.6.0
github.com/jessevdk/go-flags v1.4.0
github.com/olekukonko/tablewriter v0.0.5
github.com/reeflective/readline v1.0.15
github.com/xlab/treeprint v1.0.1-0.20200715141336-10e0bc383e01
google.golang.org/api v0.180.0
google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda
Expand Down Expand Up @@ -42,6 +43,7 @@ require (
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
github.com/googleapis/gax-go/v2 v2.12.4 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
Expand All @@ -54,6 +56,7 @@ require (
golang.org/x/oauth2 v0.21.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/term v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.5.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -880,7 +880,11 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/reeflective/readline v1.0.15 h1:uB/M1sAc2yZGO14Ujgr/imLwQXqGdOhDDWAEHF+MBaE=
github.com/reeflective/readline v1.0.15/go.mod h1:3iOe/qyb2jEy0KqLrNlb/CojBVqxga9ACqz/VU22H6A=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
Expand Down Expand Up @@ -1205,6 +1209,8 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down

0 comments on commit fb6b9d4

Please sign in to comment.