diff --git a/detail.go b/detail.go index a310d5c..7f922e4 100644 --- a/detail.go +++ b/detail.go @@ -2,6 +2,7 @@ package sqlread import ( "errors" + "strings" ) type InsertDetailParser struct { @@ -82,7 +83,7 @@ func stringValue(c LexItem) (string, error) { d := v[0] m := len(v) - 2 - s := "" + var s strings.Builder i := 0 for { i++ @@ -125,22 +126,22 @@ func stringValue(c LexItem) (string, error) { } i++ - s += string(x) + s.WriteString(string(x)) continue } if v[i] == d { if i+1 < m && v[i+1] == d { i++ - s += string(d) + s.WriteString(string(d)) continue } else { return "", errorInvalidString } } - s += string(v[i]) + s.WriteString(string(v[i])) } - return s, nil + return s.String(), nil } diff --git a/go.mod b/go.mod index 510a138..740e6f8 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/donatj/sqlread -go 1.24 - -toolchain go1.24.4 +go 1.26 require ( github.com/avvmoto/buf-readerat v0.0.0-20171115124131-a17c8cb89270 diff --git a/parser.go b/parser.go index 2a62ccd..0bbacb0 100644 --- a/parser.go +++ b/parser.go @@ -3,6 +3,7 @@ package sqlread import ( "fmt" "slices" + "strings" ) // Parser is a state based SQL Parser that reads LexItems on a channel @@ -47,12 +48,12 @@ func (p *Parser) Run(start parseState) error { } func (p *Parser) errorUnexpectedLex(f LexItem, e ...lexItemType) { - s := "" + var s strings.Builder for _, ei := range e { - s += "'" + ei.String() + "' " + s.WriteString("'" + ei.String() + "' ") } - p.err = fmt.Errorf("found '%s'; expected %s at byte: %d", f.Type.String(), s, f.Pos) + p.err = fmt.Errorf("found '%s'; expected %s at byte: %d", f.Type.String(), s.String(), f.Pos) } func (p *Parser) errorUnexpectedEOF() { @@ -63,12 +64,12 @@ func (p *Parser) errorUnexpectedEOF() { // It includes the last position scanned to help with debugging // lastPos is the position of the last valid scanned item func (p *Parser) errorUnexpectedEOFExpectedLexItemType(lastPos int64, e ...lexItemType) { - s := "" + var s strings.Builder for _, ei := range e { - s += "'" + ei.String() + "' " + s.WriteString("'" + ei.String() + "' ") } - p.err = fmt.Errorf("unexpected eof; expected %s starting at byte: %d", s, lastPos+1) + p.err = fmt.Errorf("unexpected eof; expected %s starting at byte: %d", s.String(), lastPos+1) } func isOfAny(c LexItem, l ...lexItemType) bool { diff --git a/scanner.go b/scanner.go index 017eadf..cb416c5 100644 --- a/scanner.go +++ b/scanner.go @@ -2,6 +2,7 @@ package sqlread import ( "io" + "slices" "strings" "unicode/utf8" ) @@ -158,13 +159,7 @@ func (l *lexer) accept(bs []byte) (c int) { for { n := l.next() - found := false - for _, b := range bs { - if b == n { - found = true - break - } - } + found := slices.Contains(bs, n) if !found { l.rewind() @@ -281,11 +276,5 @@ func (l *lexer) emit(t lexItemType) LexItem { } func in(b byte, bs []byte) bool { - for _, bb := range bs { - if b == bb { - return true - } - } - - return false + return slices.Contains(bs, b) }