diff --git a/MODERNIZATION.md b/MODERNIZATION.md index f2b00b2..0f667d4 100644 --- a/MODERNIZATION.md +++ b/MODERNIZATION.md @@ -10,24 +10,9 @@ Replaced all occurrences of `interface{}` with `any` across every `.go` file in --- -## 2. Replace `jonbodner/multierr` with `errors.Join` (Go 1.20+) +## ~~2. Replace `jonbodner/multierr` with `errors.Join` (Go 1.20+)~~ (DONE) -Go 1.20 added `errors.Join`, which collects multiple errors into a single error value. This is a direct replacement for the `multierr.Append` pattern used in `proteus.go`. - -**Files affected:** `proteus.go` (lines 100, 116, 135, 142, 187, 201, 222, 229) - -**Before:** -```go -import "github.com/jonbodner/multierr" -out = multierr.Append(out, err) -``` - -**After:** -```go -out = errors.Join(out, err) -``` - -This removes the `jonbodner/multierr` dependency entirely. +Replaced all 8 occurrences of `multierr.Append` with `errors.Join` in `proteus.go` and removed the `jonbodner/multierr` dependency from `go.mod`. --- @@ -212,7 +197,7 @@ Several dependencies are significantly out of date: | `go-sql-driver/mysql` | v1.5.0 (2020) | v1.8+ | Major version behind | | `google/go-cmp` | v0.4.0 | v0.6+ | Test-only dep | | `jonbodner/dbtimer` | 2017 commit | - | Pinned to a 2017 commit hash | -| `jonbodner/multierr` | v1.0.0 | - | Replace with `errors.Join` (see #2) | +| ~~`jonbodner/multierr`~~ | ~~v1.0.0~~ | - | ~~Replaced with `errors.Join` (see #2)~~ *(DONE)* | | `jonbodner/stackerr` | v1.0.0 | - | Replace with stdlib (see #3) | | `pkg/profile` | v1.7.0 | - | Only used in `speed/speed.go`; consider removing or moving to a build-tagged file | @@ -405,7 +390,7 @@ If `Build` returns an error, `productDao` will have nil function fields. Subsequ **Medium priority (idiomatic modernization):** - ~~#1 — `interface{}` to `any`~~ *(DONE)* -- #2 — Replace `multierr` with `errors.Join` +- ~~#2 — Replace `multierr` with `errors.Join`~~ *(DONE)* - #3 — Replace `stackerr` with stdlib error handling - #4 — Fix slog usage for proper structured logging - #11 — Update dependencies diff --git a/go.mod b/go.mod index 483213d..e4d47c2 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/go-sql-driver/mysql v1.5.0 github.com/google/go-cmp v0.4.0 github.com/jonbodner/dbtimer v0.0.0-20170410163237-7002f3758ae1 - github.com/jonbodner/multierr v1.0.0 github.com/jonbodner/stackerr v1.0.0 github.com/lib/pq v1.10.9 github.com/pkg/profile v1.7.0 diff --git a/go.sum b/go.sum index 08c995d..b91678b 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,6 @@ github.com/google/pprof v0.0.0-20230429030804-905365eefe3e/go.mod h1:79YE0hCXdHa github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/jonbodner/dbtimer v0.0.0-20170410163237-7002f3758ae1 h1:mgFL7UFb88FOlSVgVoIRGJ4yKlkfp8KcXHqy7no+lEU= github.com/jonbodner/dbtimer v0.0.0-20170410163237-7002f3758ae1/go.mod h1:PjOlFbeJKs+4b2CvuN9FFF8Ed8cZ6FHWPb5tLK2QKOM= -github.com/jonbodner/multierr v1.0.0 h1:qgMyn9QNDnIKuPVOxAh4/kE8E0KBVtREEpzgQ+z6nR8= -github.com/jonbodner/multierr v1.0.0/go.mod h1:BN5BmT8XsFrnRDB/uErUiXlda9UQs2YhrlFFtf74JaM= github.com/jonbodner/stackerr v1.0.0 h1:rAe+Fh13cfC9IGuKE4YWiVCzwt9zce9Saldpc8fYEIM= github.com/jonbodner/stackerr v1.0.0/go.mod h1:In1ShJr570PDuDHbYfymEQle+H7PgY9KpT+alyk0nEM= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= diff --git a/proteus.go b/proteus.go index 52d897d..9ee140a 100644 --- a/proteus.go +++ b/proteus.go @@ -2,13 +2,12 @@ package proteus import ( "context" + "errors" + "fmt" "log/slog" "reflect" - - "fmt" "strings" - "github.com/jonbodner/multierr" "github.com/jonbodner/stackerr" ) @@ -97,7 +96,7 @@ func ShouldBuild(ctx context.Context, dao any, paramAdapter ParamAdapter, mapper pv := reflect.New(curField.Type) embeddedErrs := ShouldBuild(ctx, pv.Interface(), paramAdapter, mappers...) if embeddedErrs != nil { - out = multierr.Append(out, embeddedErrs) + out = errors.Join(out, embeddedErrs) } else { funcs[i] = pv.Elem() } @@ -113,7 +112,7 @@ func ShouldBuild(ctx context.Context, dao any, paramAdapter ParamAdapter, mapper //validate to make sure that the function matches what we expect hasCtx, err := validateFunction(funcType) if err != nil { - out = multierr.Append(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) + out = errors.Join(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) continue } @@ -132,13 +131,13 @@ func ShouldBuild(ctx context.Context, dao any, paramAdapter ParamAdapter, mapper //check to see if the query is in a QueryMapper query, err = lookupQuery(query, mappers) if err != nil { - out = multierr.Append(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) + out = errors.Join(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) continue } implementation, err := makeImplementation(ctx, funcType, query, paramAdapter, nameOrderMap) if err != nil { - out = multierr.Append(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) + out = errors.Join(out, Error{FuncName: curField.Name, FieldOrder: i, OriginalError: err}) continue } funcs[i] = reflect.MakeFunc(funcType, implementation) @@ -184,7 +183,7 @@ func Build(dao any, paramAdapter ParamAdapter, mappers ...QueryMapper) error { pv := reflect.New(curField.Type) err := Build(pv.Interface(), paramAdapter, mappers...) if err != nil { - outErr = multierr.Append(outErr, err) + outErr = errors.Join(outErr, err) } else { daoValue.Field(i).Set(pv.Elem()) } @@ -201,7 +200,7 @@ func Build(dao any, paramAdapter ParamAdapter, mappers ...QueryMapper) error { hasCtx, err := validateFunction(funcType) if err != nil { slog.Log(ctx, slog.LevelWarn, fmt.Sprintln("skipping function", curField.Name, "due to error:", err.Error())) - outErr = multierr.Append(outErr, err) + outErr = errors.Join(outErr, err) continue } @@ -221,14 +220,14 @@ func Build(dao any, paramAdapter ParamAdapter, mappers ...QueryMapper) error { query, err = lookupQuery(query, mappers) if err != nil { slog.Log(ctx, slog.LevelWarn, fmt.Sprintln("skipping function", curField.Name, "due to error:", err.Error())) - outErr = multierr.Append(outErr, err) + outErr = errors.Join(outErr, err) continue } implementation, err := makeImplementation(ctx, funcType, query, paramAdapter, nameOrderMap) if err != nil { slog.Log(ctx, slog.LevelWarn, fmt.Sprintln("skipping function", curField.Name, "due to error:", err.Error())) - outErr = multierr.Append(outErr, err) + outErr = errors.Join(outErr, err) continue } fieldValue := daoValue.Field(i)