diff --git a/MODERNIZATION.md b/MODERNIZATION.md index 2a0ddb1..1b398dd 100644 --- a/MODERNIZATION.md +++ b/MODERNIZATION.md @@ -78,7 +78,7 @@ Also fix the test files: --- -## 5. Use `strings.ReplaceAll` instead of `strings.Replace(..., -1)` (Go 1.12+) +## ~~5. Use `strings.ReplaceAll` instead of `strings.Replace(..., -1)` (Go 1.12+)~~ (DONE) `strings.ReplaceAll` is a clearer, more idiomatic function for replacing all occurrences. @@ -104,7 +104,7 @@ Also applies to `bench_test.go` lines 229-230. --- -## 6. Use `strings.Builder` instead of `bytes.Buffer` for String Building +## ~~6. Use `strings.Builder` instead of `bytes.Buffer` for String Building~~ (DONE) `strings.Builder` (Go 1.10+) is purpose-built for building strings and avoids the `[]byte` to `string` copy that `bytes.Buffer.String()` performs. @@ -396,8 +396,8 @@ If `Build` returns an error, `productDao` will have nil function fields. Subsequ - #11 — Update dependencies **Lower priority (cleanup):** -- #5 — `strings.ReplaceAll` -- #6 — `strings.Builder` +- ~~#5 — `strings.ReplaceAll`~~ *(DONE)* +- ~~#6 — `strings.Builder`~~ *(DONE)* - #9 — Delete `cmp/errors.go` - #10 — Deprecation annotations - #12 — Testing improvements diff --git a/bench_test.go b/bench_test.go index 008e21f..3a35660 100644 --- a/bench_test.go +++ b/bench_test.go @@ -226,8 +226,8 @@ func (spd standardPersonDao) GetByAge(db *sql.DB, id int, ages []int, name strin inClause := strings.Join(params, ",") - finalQuery := strings.Replace(startQuery, ":ages:", inClause, -1) - finalQuery = strings.Replace(finalQuery, ":id:", fmt.Sprintf("$%d", len(ages)+2), -1) + finalQuery := strings.ReplaceAll(startQuery, ":ages:", inClause) + finalQuery = strings.ReplaceAll(finalQuery, ":id:", fmt.Sprintf("$%d", len(ages)+2)) args := make([]any, 0, len(ages)+2) args = append(args, name) diff --git a/builder.go b/builder.go index 092dc0d..dbdd44f 100644 --- a/builder.go +++ b/builder.go @@ -1,7 +1,6 @@ package proteus import ( - "bytes" "context" "fmt" "go/scanner" @@ -64,7 +63,7 @@ type posType interface { } func buildFixedQueryAndParamOrder(ctx context.Context, query string, nameOrderMap map[string]int, funcType posType, pa ParamAdapter) (queryHolder, []paramInfo, error) { - var out bytes.Buffer + var out strings.Builder var paramOrder []paramInfo @@ -73,7 +72,7 @@ func buildFixedQueryAndParamOrder(ctx context.Context, query string, nameOrderMa // ending on a single \ means the \ is ignored inEscape := false inVar := false - curVar := []rune{} + var curVar strings.Builder hasSlice := false for k, v := range query { if inEscape { @@ -86,11 +85,11 @@ func buildFixedQueryAndParamOrder(ctx context.Context, query string, nameOrderMa inEscape = true case ':': if inVar { - if len(curVar) == 0 { + if curVar.Len() == 0 { //error! must have a something return nil, nil, stackerr.Errorf("empty variable declaration at position %d", k) } - curVarS := string(curVar) + curVarS := curVar.String() id, err := validIdentifier(ctx, curVarS) if err != nil { //error, identifier must be valid go identifier with . for path @@ -137,13 +136,13 @@ func buildFixedQueryAndParamOrder(ctx context.Context, query string, nameOrderMa } inVar = false - curVar = []rune{} + curVar.Reset() } else { inVar = true } default: if inVar { - curVar = append(curVar, v) + curVar.WriteRune(v) } else { out.WriteRune(v) } @@ -187,7 +186,7 @@ func doFinalize(ctx context.Context, queryString string, paramOrder []paramInfo, sliceMap[fixNameForTemplate(v.name)] = 1 } } - var b bytes.Buffer + var b strings.Builder err = temp.Execute(&b, sliceMap) if err != nil { return "", err @@ -207,7 +206,7 @@ const ( func joinFactory(startPos int, paramAdapter ParamAdapter) func(int) string { return func(total int) string { - var b bytes.Buffer + var b strings.Builder for i := 0; i < total; i++ { if i > 0 { b.WriteString(", ") @@ -221,10 +220,10 @@ func joinFactory(startPos int, paramAdapter ParamAdapter) func(int) string { func fixNameForTemplate(name string) string { //need to make sure that foo.bar and fooDOTbar don't collide, however unlikely - name = strings.Replace(name, "DOT", "DOTDOT", -1) - name = strings.Replace(name, ".", "DOT", -1) - name = strings.Replace(name, "DOLLAR", "DOLLARDOLLAR", -1) - name = strings.Replace(name, "$", "DOLLAR", -1) + name = strings.ReplaceAll(name, "DOT", "DOTDOT") + name = strings.ReplaceAll(name, ".", "DOT") + name = strings.ReplaceAll(name, "DOLLAR", "DOLLARDOLLAR") + name = strings.ReplaceAll(name, "$", "DOLLAR") return name } diff --git a/line_logger.go b/line_logger.go index 1c1ef14..e1dc715 100644 --- a/line_logger.go +++ b/line_logger.go @@ -1,7 +1,6 @@ package proteus import ( - "bytes" "log/slog" "strings" "testing" @@ -12,7 +11,7 @@ func RegisterLineLogger(t *testing.T) func() []string { t.Cleanup(func() { slog.SetDefault(defaultLogger) }) - var buf bytes.Buffer + var buf strings.Builder logger := slog.New(slog.NewTextHandler(&buf, &slog.HandlerOptions{ Level: slog.LevelDebug, })) diff --git a/template_test.go b/template_test.go index e8e56d1..fc26cce 100644 --- a/template_test.go +++ b/template_test.go @@ -1,9 +1,9 @@ package proteus import ( - "bytes" "fmt" "html/template" + "strings" "testing" ) @@ -19,7 +19,7 @@ func TestTemplate(t *testing.T) { t.Error(err) return } - var b bytes.Buffer + var b strings.Builder err = tmpl.Execute(&b, map[string]any{"vals": 3}) if err != nil {