Skip to content

Commit

Permalink
make separator customizable
Browse files Browse the repository at this point in the history
  • Loading branch information
apstndb committed Mar 13, 2023
1 parent e8b7286 commit 2bd1350
Show file tree
Hide file tree
Showing 4 changed files with 567 additions and 29 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.18

require (
cloud.google.com/go/spanner v1.44.0
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e
github.com/google/uuid v1.3.0
github.com/hashicorp/go-multierror v1.1.1
github.com/spf13/cobra v1.2.1
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
Expand Down
69 changes: 40 additions & 29 deletions pkg/spanner/separator.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,43 +21,37 @@ package spanner

import (
"strings"
)

type delimiter int

const (
delimiterUndefined delimiter = iota
delimiterHorizontal
// temporary use
"github.com/chzyer/readline/runes"
)

type inputStatement struct {
statement string
delim delimiter
}

func (d delimiter) String() string {
switch d {
case delimiterUndefined:
return ""
case delimiterHorizontal:
return ";"
}
return ""
statement string
terminator string
}

func separateInput(input string) []inputStatement {
return newSeparator(input).separate()
func separateInput(input string, customTerminators ...string) []inputStatement {
return newSeparator(input, customTerminators).separate()
}

type separator struct {
str []rune // remaining input
sb *strings.Builder
// terms is custom terminators.
// It isn't []string to minimize string-rune conversions.
terms [][]rune
}

func newSeparator(s string) *separator {
func newSeparator(s string, terms []string) *separator {
var runeTerms [][]rune
for _, delimiter := range terms {
runeTerms = append(runeTerms, []rune(delimiter))
}
return &separator{
str: []rune(s),
sb: &strings.Builder{},
str: []rune(s),
sb: &strings.Builder{},
terms: runeTerms,
}
}

Expand Down Expand Up @@ -261,23 +255,40 @@ func (s *separator) separate() []inputStatement {
// horizontal delim
case ';':
statements = append(statements, inputStatement{
statement: strings.TrimSpace(s.sb.String()),
delim: delimiterHorizontal,
statement: strings.TrimSpace(s.sb.String()),
terminator: ";",
})
s.sb.Reset()
s.str = s.str[1:]
default:
s.sb.WriteRune(s.str[0])
s.str = s.str[1:]
// TODO: may need some optimization
var found bool
for _, delimiter := range s.terms {
if runes.HasPrefix(s.str, delimiter) {
statements = append(statements, inputStatement{
statement: strings.TrimSpace(s.sb.String()),
terminator: string(delimiter),
})
s.sb.Reset()
s.str = s.str[len(delimiter):]
found = true
break
}
}

if !found {
s.sb.WriteRune(s.str[0])
s.str = s.str[1:]
}
}
}

// flush remained
if s.sb.Len() > 0 {
if str := strings.TrimSpace(s.sb.String()); len(str) > 0 {
statements = append(statements, inputStatement{
statement: str,
delim: delimiterUndefined,
statement: str,
terminator: "",
})
s.sb.Reset()
}
Expand Down
Loading

0 comments on commit 2bd1350

Please sign in to comment.