diff --git a/bfcodegen/csid-generate.go b/bfcodegen/csid-generate.go index 4167f2b..3a5b9ad 100644 --- a/bfcodegen/csid-generate.go +++ b/bfcodegen/csid-generate.go @@ -5,11 +5,11 @@ import ( _ "embed" "errors" "fmt" - "go/format" "git.blackforestbytes.com/BlackForestBytes/goext" "git.blackforestbytes.com/BlackForestBytes/goext/cryptext" "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/rext" + "go/format" "io" "os" "path" @@ -64,16 +64,17 @@ func GenerateCharsetIDSpecs(sourceDir string, destFile string, opt CSIDGenOption files = langext.ArrFilter(files, func(v os.DirEntry) bool { return !strings.HasSuffix(v.Name(), "_gen.go") }) langext.SortBy(files, func(v os.DirEntry) string { return v.Name() }) - newChecksumStr := goext.GoextVersion + var newChecksumStr strings.Builder + newChecksumStr.WriteString(goext.GoextVersion) for _, f := range files { content, err := os.ReadFile(path.Join(sourceDir, f.Name())) if err != nil { return err } - newChecksumStr += "\n" + f.Name() + "\t" + cryptext.BytesSha256(content) + newChecksumStr.WriteString("\n" + f.Name() + "\t" + cryptext.BytesSha256(content)) } - newChecksum := cryptext.BytesSha256([]byte(newChecksumStr)) + newChecksum := cryptext.BytesSha256([]byte(newChecksumStr.String())) if newChecksum != oldChecksum { fmt.Printf("[CSIDGenerate] Checksum has changed ( %s -> %s ), will generate new file\n\n", oldChecksum, newChecksum) diff --git a/bfcodegen/enum-generate.go b/bfcodegen/enum-generate.go index 21eb3f1..ecb6406 100644 --- a/bfcodegen/enum-generate.go +++ b/bfcodegen/enum-generate.go @@ -95,16 +95,17 @@ func _generateEnumSpecs(sourceDir string, destFile string, oldChecksum string, g files = langext.ArrFilter(files, func(v os.DirEntry) bool { return !strings.HasSuffix(v.Name(), "_gen.go") }) langext.SortBy(files, func(v os.DirEntry) string { return v.Name() }) - newChecksumStr := goext.GoextVersion + var newChecksumStr strings.Builder + newChecksumStr.WriteString(goext.GoextVersion) for _, f := range files { content, err := os.ReadFile(path.Join(sourceDir, f.Name())) if err != nil { return "", "", false, err } - newChecksumStr += "\n" + f.Name() + "\t" + cryptext.BytesSha256(content) + newChecksumStr.WriteString("\n" + f.Name() + "\t" + cryptext.BytesSha256(content)) } - newChecksum := cryptext.BytesSha256([]byte(newChecksumStr)) + newChecksum := cryptext.BytesSha256([]byte(newChecksumStr.String())) if newChecksum != oldChecksum { fmt.Printf("[EnumGenerate] Checksum has changed ( %s -> %s ), will generate new file\n\n", oldChecksum, newChecksum) @@ -213,7 +214,7 @@ func processEnumFile(basedir string, fn string, debugOutput bool) ([]EnumDef, st var descr *string = nil var data *map[string]any = nil if comment != nil { - comment = langext.Ptr(strings.TrimSpace(*comment)) + comment = new(strings.TrimSpace(*comment)) if strings.HasPrefix(*comment, "{") { if v, ok := tryParseDataComment(*comment); ok { data = &v @@ -278,7 +279,7 @@ func tryParseDataComment(s string) (map[string]any, bool) { rv := reflect.ValueOf(v) - if rv.Kind() == reflect.Ptr && rv.IsNil() { + if rv.Kind() == reflect.Pointer && rv.IsNil() { continue } if rv.Kind() == reflect.Bool { diff --git a/bfcodegen/id-generate.go b/bfcodegen/id-generate.go index 8f7bd7b..ffa499e 100644 --- a/bfcodegen/id-generate.go +++ b/bfcodegen/id-generate.go @@ -5,11 +5,11 @@ import ( _ "embed" "errors" "fmt" - "go/format" "git.blackforestbytes.com/BlackForestBytes/goext" "git.blackforestbytes.com/BlackForestBytes/goext/cryptext" "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/rext" + "go/format" "io" "os" "path" @@ -63,16 +63,17 @@ func GenerateIDSpecs(sourceDir string, destFile string, opt IDGenOptions) error files = langext.ArrFilter(files, func(v os.DirEntry) bool { return !strings.HasSuffix(v.Name(), "_gen.go") }) langext.SortBy(files, func(v os.DirEntry) string { return v.Name() }) - newChecksumStr := goext.GoextVersion + var newChecksumStr strings.Builder + newChecksumStr.WriteString(goext.GoextVersion) for _, f := range files { content, err := os.ReadFile(path.Join(sourceDir, f.Name())) if err != nil { return err } - newChecksumStr += "\n" + f.Name() + "\t" + cryptext.BytesSha256(content) + newChecksumStr.WriteString("\n" + f.Name() + "\t" + cryptext.BytesSha256(content)) } - newChecksum := cryptext.BytesSha256([]byte(newChecksumStr)) + newChecksum := cryptext.BytesSha256([]byte(newChecksumStr.String())) if newChecksum != oldChecksum { fmt.Printf("[IDGenerate] Checksum has changed ( %s -> %s ), will generate new file\n\n", oldChecksum, newChecksum) diff --git a/cmdext/builder.go b/cmdext/builder.go index 0ab5bcb..1380019 100644 --- a/cmdext/builder.go +++ b/cmdext/builder.go @@ -61,12 +61,12 @@ func (r *CommandRunner) Envs(env []string) *CommandRunner { } func (r *CommandRunner) EnsureExitcode(arg ...int) *CommandRunner { - r.enforceExitCodes = langext.Ptr(langext.ForceArray(arg)) + r.enforceExitCodes = new(langext.ForceArray(arg)) return r } func (r *CommandRunner) FailOnExitCode() *CommandRunner { - r.enforceExitCodes = langext.Ptr([]int{0}) + r.enforceExitCodes = new([]int{0}) return r } diff --git a/cmdext/cmdrunner.go b/cmdext/cmdrunner.go index ce20774..5ade34a 100644 --- a/cmdext/cmdrunner.go +++ b/cmdext/cmdrunner.go @@ -37,7 +37,7 @@ func run(opt CommandRunner) (CommandResult, error) { } preader := pipeReader{ - lineBufferSize: langext.Ptr(128 * 1024 * 1024), // 128MB max size of a single line, is hopefully enough.... + lineBufferSize: new(128 * 1024 * 1024), // 128MB max size of a single line, is hopefully enough.... stdout: stdoutPipe, stderr: stderrPipe, } @@ -66,7 +66,7 @@ func run(opt CommandRunner) (CommandResult, error) { if opt.enforceNoStderr { listener = append(listener, genericCommandListener{ - _readRawStderr: langext.Ptr(func(v []byte) { + _readRawStderr: new(func(v []byte) { if len(v) > 0 { stderrFailChan <- true } diff --git a/cmdext/pipereader.go b/cmdext/pipereader.go index a1e945a..9dc19cb 100644 --- a/cmdext/pipereader.go +++ b/cmdext/pipereader.go @@ -4,6 +4,7 @@ import ( "bufio" "git.blackforestbytes.com/BlackForestBytes/goext/syncext" "io" + "strings" "sync" ) @@ -29,14 +30,14 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, wg.Add(1) stdoutBufferReader, stdoutBufferWriter := io.Pipe() - stdout := "" + var stdout strings.Builder go func() { buf := make([]byte, 128) for { n, err := pr.stdout.Read(buf) if n > 0 { txt := string(buf[:n]) - stdout += txt + stdout.WriteString(txt) _, _ = stdoutBufferWriter.Write(buf[:n]) for _, lstr := range listener { lstr.ReadRawStdout(buf[:n]) @@ -58,7 +59,7 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, wg.Add(1) stderrBufferReader, stderrBufferWriter := io.Pipe() - stderr := "" + var stderr strings.Builder go func() { buf := make([]byte, 128) for { @@ -66,7 +67,7 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, if n > 0 { txt := string(buf[:n]) - stderr += txt + stderr.WriteString(txt) _, _ = stderrBufferWriter.Write(buf[:n]) for _, lstr := range listener { lstr.ReadRawStderr(buf[:n]) @@ -88,8 +89,7 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, // [3] collect stdout line-by-line - wg.Add(1) - go func() { + wg.Go(func() { scanner := bufio.NewScanner(stdoutBufferReader) if pr.lineBufferSize != nil { scanner.Buffer([]byte{}, *pr.lineBufferSize) @@ -105,13 +105,11 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, errch <- err } combch <- combevt{"", true} - wg.Done() - }() + }) // [4] collect stderr line-by-line - wg.Add(1) - go func() { + wg.Go(func() { scanner := bufio.NewScanner(stderrBufferReader) if pr.lineBufferSize != nil { scanner.Buffer([]byte{}, *pr.lineBufferSize) @@ -127,13 +125,12 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, errch <- err } combch <- combevt{"", true} - wg.Done() - }() + }) // [5] combine stdcombined wg.Add(1) - stdcombined := "" + var stdcombined strings.Builder go func() { stopctr := 0 for stopctr < 2 { @@ -141,7 +138,7 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, if vvv.stop { stopctr++ } else { - stdcombined += vvv.line + "\n" // this comes from bufio.Scanner and has no newlines... + stdcombined.WriteString(vvv.line + "\n") // this comes from bufio.Scanner and has no newlines... } } wg.Done() @@ -154,5 +151,5 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string, return "", "", "", err } - return stdout, stderr, stdcombined, nil + return stdout.String(), stderr.String(), stdcombined.String(), nil } diff --git a/confext/confParser.go b/confext/confParser.go index a0f362a..dd6601a 100644 --- a/confext/confParser.go +++ b/confext/confParser.go @@ -101,11 +101,11 @@ func processEnvOverrides(rval reflect.Value, delim string, prefix string) error } func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (reflect.Value, error) { - if rvtype == reflect.TypeOf("") { + if rvtype == reflect.TypeFor[string]() { return reflect.ValueOf(envval), nil - } else if rvtype == reflect.TypeOf(int(0)) { + } else if rvtype == reflect.TypeFor[int]() { envint, err := strconv.ParseInt(envval, 10, bits.UintSize) if err != nil { @@ -114,7 +114,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.ValueOf(int(envint)), nil - } else if rvtype == reflect.TypeOf(int64(0)) { + } else if rvtype == reflect.TypeFor[int64]() { envint, err := strconv.ParseInt(envval, 10, 64) if err != nil { @@ -123,7 +123,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.ValueOf(int64(envint)), nil - } else if rvtype == reflect.TypeOf(int32(0)) { + } else if rvtype == reflect.TypeFor[int32]() { envint, err := strconv.ParseInt(envval, 10, 32) if err != nil { @@ -132,7 +132,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.ValueOf(int32(envint)), nil - } else if rvtype == reflect.TypeOf(int8(0)) { + } else if rvtype == reflect.TypeFor[int8]() { envint, err := strconv.ParseInt(envval, 10, 8) if err != nil { @@ -141,7 +141,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.ValueOf(int8(envint)), nil - } else if rvtype == reflect.TypeOf(time.Duration(0)) { + } else if rvtype == reflect.TypeFor[time.Duration]() { dur, err := timeext.ParseDurationShortString(envval) if err != nil { @@ -159,7 +159,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.ValueOf(tim), nil - } else if rvtype.ConvertibleTo(reflect.TypeOf(int(0))) { + } else if rvtype.ConvertibleTo(reflect.TypeFor[int]()) { envint, err := strconv.ParseInt(envval, 10, 8) if err != nil { @@ -170,7 +170,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return envcvl, nil - } else if rvtype.ConvertibleTo(reflect.TypeOf(false)) { + } else if rvtype.ConvertibleTo(reflect.TypeFor[bool]()) { if strings.TrimSpace(strings.ToLower(envval)) == "true" { return reflect.ValueOf(true).Convert(rvtype), nil @@ -184,7 +184,7 @@ func parseEnvToValue(envval string, fullEnvKey string, rvtype reflect.Type) (ref return reflect.Value{}, errors.New(fmt.Sprintf("Failed to parse env-config variable '%s' to <%s, ,bool> (value := '%s')", rvtype.Name(), fullEnvKey, envval)) } - } else if rvtype.ConvertibleTo(reflect.TypeOf("")) { + } else if rvtype.ConvertibleTo(reflect.TypeFor[string]()) { envcvl := reflect.ValueOf(envval).Convert(rvtype) return envcvl, nil diff --git a/cryptext/passHash_test.go b/cryptext/passHash_test.go index e70d44c..ee79339 100644 --- a/cryptext/passHash_test.go +++ b/cryptext/passHash_test.go @@ -1,7 +1,6 @@ package cryptext import ( - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/totpext" "git.blackforestbytes.com/BlackForestBytes/goext/tst" "testing" @@ -32,7 +31,7 @@ func TestPassHashTOTP(t *testing.T) { tst.AssertFalse(t, ph.Verify("test123", nil)) tst.AssertFalse(t, ph.Verify("test124", nil)) - tst.AssertTrue(t, ph.Verify("test123", langext.Ptr(totpext.TOTP(sec)))) + tst.AssertTrue(t, ph.Verify("test123", new(totpext.TOTP(sec)))) tst.AssertFalse(t, ph.Verify("test124", nil)) } @@ -141,7 +140,7 @@ func TestPassHashUpgrade_V3_TOTP(t *testing.T) { tst.AssertFalse(t, ph.Verify("test123", nil)) tst.AssertFalse(t, ph.Verify("test124", nil)) - tst.AssertTrue(t, ph.Verify("test123", langext.Ptr(totpext.TOTP(sec)))) + tst.AssertTrue(t, ph.Verify("test123", new(totpext.TOTP(sec)))) tst.AssertFalse(t, ph.Verify("test124", nil)) ph, err = ph.Upgrade("test123") @@ -153,7 +152,7 @@ func TestPassHashUpgrade_V3_TOTP(t *testing.T) { tst.AssertFalse(t, ph.Verify("test123", nil)) tst.AssertFalse(t, ph.Verify("test124", nil)) - tst.AssertTrue(t, ph.Verify("test123", langext.Ptr(totpext.TOTP(sec)))) + tst.AssertTrue(t, ph.Verify("test123", new(totpext.TOTP(sec)))) tst.AssertFalse(t, ph.Verify("test124", nil)) } @@ -193,7 +192,7 @@ func TestPassHashUpgrade_V4_TOTP(t *testing.T) { tst.AssertFalse(t, ph.Verify("test123", nil)) tst.AssertFalse(t, ph.Verify("test124", nil)) - tst.AssertTrue(t, ph.Verify("test123", langext.Ptr(totpext.TOTP(sec)))) + tst.AssertTrue(t, ph.Verify("test123", new(totpext.TOTP(sec)))) tst.AssertFalse(t, ph.Verify("test124", nil)) ph, err = ph.Upgrade("test123") @@ -205,6 +204,6 @@ func TestPassHashUpgrade_V4_TOTP(t *testing.T) { tst.AssertFalse(t, ph.Verify("test123", nil)) tst.AssertFalse(t, ph.Verify("test124", nil)) - tst.AssertTrue(t, ph.Verify("test123", langext.Ptr(totpext.TOTP(sec)))) + tst.AssertTrue(t, ph.Verify("test123", new(totpext.TOTP(sec)))) tst.AssertFalse(t, ph.Verify("test124", nil)) } diff --git a/cryptext/pronouncablePassword_test.go b/cryptext/pronouncablePassword_test.go index c534b06..975d1ec 100644 --- a/cryptext/pronouncablePassword_test.go +++ b/cryptext/pronouncablePassword_test.go @@ -7,21 +7,21 @@ import ( ) func TestPronouncablePasswordExt(t *testing.T) { - for i := 0; i < 20; i++ { + for i := range 20 { pw, entropy := PronouncablePasswordExt(rand.New(rand.NewSource(int64(i))), 16) fmt.Printf("[%.2f] => %s\n", entropy, pw) } } func TestPronouncablePasswordSeeded(t *testing.T) { - for i := 0; i < 20; i++ { + for i := range 20 { pw := PronouncablePasswordSeeded(int64(i), 8) fmt.Printf("%s\n", pw) } } func TestPronouncablePassword(t *testing.T) { - for i := 0; i < 20; i++ { + for i := range 20 { pw := PronouncablePassword(i + 1) fmt.Printf("%s\n", pw) } diff --git a/dataext/delayedCombiningInvoker.go b/dataext/delayedCombiningInvoker.go index b8c0c7f..8f97a85 100644 --- a/dataext/delayedCombiningInvoker.go +++ b/dataext/delayedCombiningInvoker.go @@ -97,10 +97,7 @@ func (d *DelayedCombiningInvoker) run() { for { d.syncLock.Lock() - timeOut := min(d.maxDelay-time.Since(d.initialRequestTime), d.delay-time.Since(d.lastRequestTime)) - if timeOut < 0 { - timeOut = 0 - } + timeOut := max(min(d.maxDelay-time.Since(d.initialRequestTime), d.delay-time.Since(d.lastRequestTime)), 0) d.syncLock.Unlock() immediately := false diff --git a/dataext/merge.go b/dataext/merge.go index 0ad5156..dbef781 100644 --- a/dataext/merge.go +++ b/dataext/merge.go @@ -14,7 +14,7 @@ func ObjectMerge[T1 any, T2 any](base T1, override T2) T1 { fieldBase := reflBase.Field(i) fieldOvrd := reflOvrd.Field(i) - if fieldBase.Kind() != reflect.Ptr || fieldOvrd.Kind() != reflect.Ptr { + if fieldBase.Kind() != reflect.Pointer || fieldOvrd.Kind() != reflect.Pointer { continue } diff --git a/dataext/merge_test.go b/dataext/merge_test.go index a40a0ef..ee177ad 100644 --- a/dataext/merge_test.go +++ b/dataext/merge_test.go @@ -1,7 +1,6 @@ package dataext import ( - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/tst" "testing" ) @@ -26,17 +25,17 @@ func TestObjectMerge(t *testing.T) { valueA := A{ Field1: nil, - Field2: langext.Ptr("99"), - Field3: langext.Ptr(12.2), + Field2: new("99"), + Field3: new(12.2), Field4: nil, OnlyA: 1, DiffType: 2, } valueB := B{ - Field1: langext.Ptr(12), + Field1: new(12), Field2: nil, - Field3: langext.Ptr(13.2), + Field3: new(13.2), Field4: nil, OnlyB: 1, DiffType: "X", diff --git a/dataext/stack.go b/dataext/stack.go index ca5511e..76b587e 100644 --- a/dataext/stack.go +++ b/dataext/stack.go @@ -2,7 +2,6 @@ package dataext import ( "errors" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "sync" ) @@ -64,7 +63,7 @@ func (s *Stack[T]) OptPop() *T { result := s.data[l-1] s.data = s.data[:l-1] - return langext.Ptr(result) + return new(result) } func (s *Stack[T]) Peek() (T, error) { @@ -94,7 +93,7 @@ func (s *Stack[T]) OptPeek() *T { return nil } - return langext.Ptr(s.data[l-1]) + return new(s.data[l-1]) } func (s *Stack[T]) Length() int { diff --git a/dataext/structHash.go b/dataext/structHash.go index d3ec5aa..eea8ba3 100644 --- a/dataext/structHash.go +++ b/dataext/structHash.go @@ -82,7 +82,7 @@ func binarize(writer io.Writer, dat reflect.Value, opt StructHashOptions) error err = binary.Write(writer, binary.LittleEndian, uint8(dat.Kind())) switch dat.Kind() { - case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice, reflect.Interface: + case reflect.Pointer, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice, reflect.Interface: if dat.IsNil() { err = binary.Write(writer, binary.LittleEndian, uint64(0)) if err != nil { diff --git a/dataext/structHash_test.go b/dataext/structHash_test.go index 57894f7..9195c85 100644 --- a/dataext/structHash_test.go +++ b/dataext/structHash_test.go @@ -1,7 +1,6 @@ package dataext import ( - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/tst" "testing" ) @@ -46,7 +45,7 @@ func TestStructHashSimpleStruct(t *testing.T) { tst.AssertHexEqual(t, "5d09090dc34ac59dd645f197a255f653387723de3afa1b614721ea5a081c675f", noErrStructHash(t, t0{ F1: 10, F2: []string{"1", "2", "3"}, - F3: langext.Ptr(99), + F3: new(99), })) } diff --git a/enums/enum.go b/enums/enum.go index 28ab66c..71d1270 100644 --- a/enums/enum.go +++ b/enums/enum.go @@ -1,5 +1,7 @@ package enums +import "maps" + import "encoding/json" type Enum interface { @@ -45,9 +47,7 @@ type EnumDataMetaValue struct { func (v EnumDataMetaValue) MarshalJSON() ([]byte, error) { m := make(map[string]any, 8) - for k, dv := range v.Data { - m[k] = dv - } + maps.Copy(m, v.Data) m["varName"] = v.VarName m["value"] = v.Value diff --git a/excelext/mapper.go b/excelext/mapper.go index 237034f..e0eee38 100644 --- a/excelext/mapper.go +++ b/excelext/mapper.go @@ -78,7 +78,7 @@ func (em *ExcelMapper[T]) InitNewFile(sheetName string) (*excelize.File, error) func (em *ExcelMapper[T]) InitStyles(f *excelize.File) error { styleDate, err := f.NewStyle(&excelize.Style{ - CustomNumFmt: langext.Ptr("dd.mm.yyyy"), + CustomNumFmt: new("dd.mm.yyyy"), }) if err != nil { return err diff --git a/exerr/builder.go b/exerr/builder.go index 7b70051..ecf8738 100644 --- a/exerr/builder.go +++ b/exerr/builder.go @@ -277,11 +277,11 @@ func (b *Builder) Ints32(key string, val []int32) *Builder { return b.addMeta(key, MDTInt32Array, val) } -func (b *Builder) Type(key string, cls interface{}) *Builder { +func (b *Builder) Type(key string, cls any) *Builder { return b.addMeta(key, MDTString, fmt.Sprintf("%T", cls)) } -func (b *Builder) Interface(key string, val interface{}) *Builder { +func (b *Builder) Interface(key string, val any) *Builder { return b.addMeta(key, MDTAny, newAnyWrap(val)) } @@ -566,7 +566,7 @@ func (b *Builder) doLogFatal() { // ---------------------------------------------------------------------------- -func (b *Builder) addMeta(key string, mdtype metaDataType, val interface{}) *Builder { +func (b *Builder) addMeta(key string, mdtype metaDataType, val any) *Builder { b.errorData.Meta.add(key, mdtype, val) return b } diff --git a/exerr/constructor.go b/exerr/constructor.go index d150610..9e17a90 100644 --- a/exerr/constructor.go +++ b/exerr/constructor.go @@ -3,13 +3,14 @@ package exerr import ( "encoding/json" "fmt" - "go.mongodb.org/mongo-driver/bson/primitive" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "go.mongodb.org/mongo-driver/bson/primitive" + "maps" "reflect" "time" ) -var reflectTypeStr = reflect.TypeOf("") +var reflectTypeStr = reflect.TypeFor[string]() func FromError(err error) *ExErr { @@ -152,20 +153,18 @@ func getForeignMeta(err error) (mm MetaMap) { }() rval := reflect.ValueOf(err) - if rval.Kind() == reflect.Interface || rval.Kind() == reflect.Ptr { + if rval.Kind() == reflect.Interface || rval.Kind() == reflect.Pointer { rval = reflect.ValueOf(err).Elem() } mm.add("foreign.errortype", MDTString, rval.Type().String()) - for k, v := range addMetaPrefix("foreign", getReflectedMetaValues(err, 8)) { - mm[k] = v - } + maps.Copy(mm, addMetaPrefix("foreign", getReflectedMetaValues(err, 8))) return mm } -func getReflectedMetaValues(value interface{}, remainingDepth int) map[string]MetaValue { +func getReflectedMetaValues(value any, remainingDepth int) map[string]MetaValue { if remainingDepth <= 0 { return map[string]MetaValue{} @@ -177,7 +176,7 @@ func getReflectedMetaValues(value interface{}, remainingDepth int) map[string]Me rval := reflect.ValueOf(value) - if rval.Type().Kind() == reflect.Ptr { + if rval.Type().Kind() == reflect.Pointer { if rval.IsNil() { return map[string]MetaValue{"*": {DataType: MDTNil, Value: nil}} @@ -237,9 +236,7 @@ func getReflectedMetaValues(value interface{}, remainingDepth int) map[string]Me fieldname := fieldtype.Name if fieldtype.IsExported() { - for k, v := range addMetaPrefix(fieldname, getReflectedMetaValues(rval.Field(i).Interface(), remainingDepth-1)) { - m[k] = v - } + maps.Copy(m, addMetaPrefix(fieldname, getReflectedMetaValues(rval.Field(i).Interface(), remainingDepth-1))) } } return m diff --git a/exerr/dataCategory.go b/exerr/dataCategory.go index f2aef8f..f1fd396 100644 --- a/exerr/dataCategory.go +++ b/exerr/dataCategory.go @@ -54,7 +54,7 @@ func (e ErrorCategory) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (e ErrorCategory) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -66,7 +66,7 @@ func (e ErrorCategory) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -76,7 +76,7 @@ func (e ErrorCategory) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&e)) } else { val.Set(reflect.ValueOf(e)) diff --git a/exerr/dataSeverity.go b/exerr/dataSeverity.go index 18a6529..21b75c8 100644 --- a/exerr/dataSeverity.go +++ b/exerr/dataSeverity.go @@ -56,7 +56,7 @@ func (e ErrorSeverity) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (e ErrorSeverity) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -68,7 +68,7 @@ func (e ErrorSeverity) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -78,7 +78,7 @@ func (e ErrorSeverity) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&e)) } else { val.Set(reflect.ValueOf(e)) diff --git a/exerr/dataType.go b/exerr/dataType.go index 8e3b4dc..2d591d2 100644 --- a/exerr/dataType.go +++ b/exerr/dataType.go @@ -7,7 +7,6 @@ import ( "reflect" "git.blackforestbytes.com/BlackForestBytes/goext/dataext" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -21,42 +20,42 @@ type ErrorType struct { //goland:noinspection GoUnusedGlobalVariable var ( - TypeInternal = NewType("INTERNAL_ERROR", langext.Ptr(500)) - TypePanic = NewType("PANIC", langext.Ptr(500)) - TypeNotImplemented = NewType("NOT_IMPLEMENTED", langext.Ptr(500)) - TypeAssert = NewType("ASSERT", langext.Ptr(500)) + TypeInternal = NewType("INTERNAL_ERROR", new(500)) + TypePanic = NewType("PANIC", new(500)) + TypeNotImplemented = NewType("NOT_IMPLEMENTED", new(500)) + TypeAssert = NewType("ASSERT", new(500)) - TypeMongoQuery = NewType("MONGO_QUERY", langext.Ptr(500)) - TypeCursorTokenDecode = NewType("CURSOR_TOKEN_DECODE", langext.Ptr(500)) - TypeMongoFilter = NewType("MONGO_FILTER", langext.Ptr(500)) - TypeMongoReflection = NewType("MONGO_REFLECTION", langext.Ptr(500)) - TypeMongoInvalidOpt = NewType("MONGO_INVALIDOPT", langext.Ptr(500)) + TypeMongoQuery = NewType("MONGO_QUERY", new(500)) + TypeCursorTokenDecode = NewType("CURSOR_TOKEN_DECODE", new(500)) + TypeMongoFilter = NewType("MONGO_FILTER", new(500)) + TypeMongoReflection = NewType("MONGO_REFLECTION", new(500)) + TypeMongoInvalidOpt = NewType("MONGO_INVALIDOPT", new(500)) - TypeSQLQuery = NewType("SQL_QUERY", langext.Ptr(500)) - TypeSQLBuild = NewType("SQL_BUILD", langext.Ptr(500)) - TypeSQLDecode = NewType("SQL_DECODE", langext.Ptr(500)) + TypeSQLQuery = NewType("SQL_QUERY", new(500)) + TypeSQLBuild = NewType("SQL_BUILD", new(500)) + TypeSQLDecode = NewType("SQL_DECODE", new(500)) TypeWrap = NewType("Wrap", nil) - TypeBindFailURI = NewType("BINDFAIL_URI", langext.Ptr(400)) - TypeBindFailQuery = NewType("BINDFAIL_QUERY", langext.Ptr(400)) - TypeBindFailJSON = NewType("BINDFAIL_JSON", langext.Ptr(400)) - TypeBindFailFormData = NewType("BINDFAIL_FORMDATA", langext.Ptr(400)) - TypeBindFailHeader = NewType("BINDFAIL_HEADER", langext.Ptr(400)) + TypeBindFailURI = NewType("BINDFAIL_URI", new(400)) + TypeBindFailQuery = NewType("BINDFAIL_QUERY", new(400)) + TypeBindFailJSON = NewType("BINDFAIL_JSON", new(400)) + TypeBindFailFormData = NewType("BINDFAIL_FORMDATA", new(400)) + TypeBindFailHeader = NewType("BINDFAIL_HEADER", new(400)) - TypeMarshalEntityID = NewType("MARSHAL_ENTITY_ID", langext.Ptr(400)) - TypeInvalidCSID = NewType("INVALID_CSID", langext.Ptr(400)) + TypeMarshalEntityID = NewType("MARSHAL_ENTITY_ID", new(400)) + TypeInvalidCSID = NewType("INVALID_CSID", new(400)) - TypeGoogleStatuscode = NewType("GOOGLE_STATUSCODE", langext.Ptr(400)) - TypeGoogleResponse = NewType("GOOGLE_RESPONSE", langext.Ptr(400)) + TypeGoogleStatuscode = NewType("GOOGLE_STATUSCODE", new(400)) + TypeGoogleResponse = NewType("GOOGLE_RESPONSE", new(400)) - TypeUnauthorized = NewType("UNAUTHORIZED", langext.Ptr(401)) - TypeAuthFailed = NewType("AUTH_FAILED", langext.Ptr(401)) + TypeUnauthorized = NewType("UNAUTHORIZED", new(401)) + TypeAuthFailed = NewType("AUTH_FAILED", new(401)) - TypeInvalidImage = NewType("IMAGEEXT_INVALID_IMAGE", langext.Ptr(400)) - TypeInvalidMimeType = NewType("IMAGEEXT_INVALID_MIMETYPE", langext.Ptr(400)) + TypeInvalidImage = NewType("IMAGEEXT_INVALID_IMAGE", new(400)) + TypeInvalidMimeType = NewType("IMAGEEXT_INVALID_MIMETYPE", new(400)) - TypeWebsocket = NewType("WEBSOCKET", langext.Ptr(500)) + TypeWebsocket = NewType("WEBSOCKET", new(500)) // other values come from the downstream application that uses goext ) @@ -113,7 +112,7 @@ func (e ErrorType) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (e ErrorType) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -125,7 +124,7 @@ func (e ErrorType) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -135,7 +134,7 @@ func (e ErrorType) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&e)) } else { val.Set(reflect.ValueOf(e)) diff --git a/exerr/exerr.go b/exerr/exerr.go index 8a9367d..7d513b3 100644 --- a/exerr/exerr.go +++ b/exerr/exerr.go @@ -2,9 +2,9 @@ package exerr import ( "fmt" + "git.blackforestbytes.com/BlackForestBytes/goext/langext" "github.com/rs/xid" "github.com/rs/zerolog" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "reflect" "strings" "time" @@ -125,35 +125,37 @@ func (ee *ExErr) FormatLog(lvl LogPrintLevel) string { } else if lvl == LogPrintOverview { - str := "[" + ee.RecursiveType().Key + "] <" + ee.UniqueID + "> " + strings.ReplaceAll(ee.RecursiveMessage(), "\n", " ") + "\n" + var str strings.Builder + str.WriteString("[" + ee.RecursiveType().Key + "] <" + ee.UniqueID + "> " + strings.ReplaceAll(ee.RecursiveMessage(), "\n", " ") + "\n") for exk, exv := range ee.Extra { - str += fmt.Sprintf(" # [[[ %s ==> %v ]]]\n", exk, exv) + str.WriteString(fmt.Sprintf(" # [[[ %s ==> %v ]]]\n", exk, exv)) } - indent := "" + var indent strings.Builder for curr := ee; curr != nil; curr = curr.OriginalError { - indent += " " + indent.WriteString(" ") - str += indent - str += "-> " + str.WriteString(indent).String() + str.WriteString("-> ") strmsg := strings.Trim(curr.Message, " \r\n\t") if lbidx := strings.Index(curr.Message, "\n"); lbidx >= 0 { strmsg = strmsg[0:lbidx] } strmsg = langext.StrLimit(strmsg, 61, "...") - str += strmsg - str += "\n" + str.WriteString(strmsg) + str.WriteString("\n") } - return str + return str.String() } else if lvl == LogPrintFull { - str := "[" + ee.RecursiveType().Key + "] <" + ee.UniqueID + "> " + strings.ReplaceAll(ee.RecursiveMessage(), "\n", " ") + "\n" + var str strings.Builder + str.WriteString("[" + ee.RecursiveType().Key + "] <" + ee.UniqueID + "> " + strings.ReplaceAll(ee.RecursiveMessage(), "\n", " ") + "\n") for exk, exv := range ee.Extra { - str += fmt.Sprintf(" # [[[ %s ==> %v ]]]\n", exk, exv) + str.WriteString(fmt.Sprintf(" # [[[ %s ==> %v ]]]\n", exk, exv)) } indent := "" @@ -165,33 +167,33 @@ func (ee *ExErr) FormatLog(lvl LogPrintLevel) string { etype = "~" } - str += indent - str += "-> [" - str += etype + str.WriteString(indent) + str.WriteString("-> [") + str.WriteString(etype) if curr.Category == CatForeign { - str += "|Foreign" + str.WriteString("|Foreign") } - str += "] " - str += strings.ReplaceAll(curr.Message, "\n", " ") + str.WriteString("] ") + str.WriteString(strings.ReplaceAll(curr.Message, "\n", " ")) if curr.Caller != "" { - str += " (@ " - str += curr.Caller - str += ")" + str.WriteString(" (@ ") + str.WriteString(curr.Caller) + str.WriteString(")") } - str += "\n" + str.WriteString("\n") if curr.Meta.Any() { meta := indent + " {" + curr.Meta.FormatOneLine(240) + "}" if len(meta) < 200 { - str += meta - str += "\n" + str.WriteString(meta) + str.WriteString("\n") } else { - str += curr.Meta.FormatMultiLine(indent+" ", " ", 1024) - str += "\n" + str.WriteString(curr.Meta.FormatMultiLine(indent+" ", " ", 1024)) + str.WriteString("\n") } } } - return str + return str.String() } else { @@ -201,7 +203,7 @@ func (ee *ExErr) FormatLog(lvl LogPrintLevel) string { } func (ee *ExErr) ShortLog(evt *zerolog.Event) { - ee.Meta.Apply(evt, langext.Ptr(240)).Msg(ee.FormatLog(LogPrintShort)) + ee.Meta.Apply(evt, new(240)).Msg(ee.FormatLog(LogPrintShort)) } // RecursiveMessage returns the message to show @@ -254,7 +256,7 @@ func (ee *ExErr) RecursiveType() ErrorType { func (ee *ExErr) RecursiveStatuscode() *int { for curr := ee; curr != nil; curr = curr.OriginalError { if curr.StatusCode != nil { - return langext.Ptr(*curr.StatusCode) + return new(*curr.StatusCode) } } @@ -279,7 +281,7 @@ func (ee *ExErr) RecursiveCategory() ErrorCategory { func (ee *ExErr) RecursiveMeta(key string) *MetaValue { for curr := ee; curr != nil; curr = curr.OriginalError { if metaval, ok := curr.Meta[key]; ok { - return langext.Ptr(metaval) + return new(metaval) } } diff --git a/exerr/gin.go b/exerr/gin.go index 662ecb4..e4e3945 100644 --- a/exerr/gin.go +++ b/exerr/gin.go @@ -1,6 +1,8 @@ package exerr import ( + "maps" + json "git.blackforestbytes.com/BlackForestBytes/goext/gojson" "git.blackforestbytes.com/BlackForestBytes/goext/langext" "github.com/gin-gonic/gin" @@ -50,9 +52,7 @@ func (ee *ExErr) toJson(depth int, applyExtendListener bool, outputMeta bool) la ginJson["meta"] = metaJson extraJson := langext.H{} - for extraKey, extraVal := range ee.Extra { - extraJson[extraKey] = extraVal - } + maps.Copy(extraJson, ee.Extra) ginJson["extra"] = extraJson } diff --git a/exerr/meta.go b/exerr/meta.go index e16b495..b2078b7 100644 --- a/exerr/meta.go +++ b/exerr/meta.go @@ -49,13 +49,13 @@ const ( type MetaValue struct { DataType metaDataType `json:"dataType"` - Value interface{} `json:"value"` + Value any `json:"value"` } type metaValueSerialization struct { DataType metaDataType `bson:"dataType"` Value string `bson:"value"` - Raw interface{} `bson:"raw"` + Raw any `bson:"raw"` } func (v MetaValue) SerializeValue() (string, error) { @@ -379,7 +379,7 @@ func (v *MetaValue) Deserialize(value string, datatype metaDataType) error { v.DataType = datatype return nil } else { - v.Value = langext.Ptr(value[1:]) + v.Value = new(value[1:]) v.DataType = datatype return nil } @@ -694,28 +694,28 @@ func (v MetaValue) rawValueForJson() any { } func (mm MetaMap) FormatOneLine(singleMaxLen int) string { - r := "" + var r strings.Builder i := 0 for key, val := range mm { if i > 0 { - r += ", " + r.WriteString(", ") } - r += "\"" + key + "\"" - r += ": " - r += "\"" + val.ShortString(singleMaxLen) + "\"" + r.WriteString("\"" + key + "\"") + r.WriteString(": ") + r.WriteString("\"" + val.ShortString(singleMaxLen) + "\"") i++ } - return r + return r.String() } func (mm MetaMap) FormatMultiLine(indentFront string, indentKeys string, maxLenValue int) string { - r := "" + var r strings.Builder - r += indentFront + "{" + "\n" + r.WriteString(indentFront + "{" + "\n") for key, val := range mm { if key == "gin.body" { continue @@ -724,16 +724,16 @@ func (mm MetaMap) FormatMultiLine(indentFront string, indentKeys string, maxLenV continue } - r += indentFront - r += indentKeys - r += "\"" + key + "\"" - r += ": " - r += "\"" + val.ShortString(maxLenValue) + "\"" - r += ",\n" + r.WriteString(indentFront) + r.WriteString(indentKeys) + r.WriteString("\"" + key + "\"") + r.WriteString(": ") + r.WriteString("\"" + val.ShortString(maxLenValue) + "\"") + r.WriteString(",\n") } - r += indentFront + "}" + r.WriteString(indentFront + "}") - return r + return r.String() } func (mm MetaMap) Any() bool { @@ -747,7 +747,7 @@ func (mm MetaMap) Apply(evt *zerolog.Event, limitLen *int) *zerolog.Event { return evt } -func (mm MetaMap) add(key string, mdtype metaDataType, val interface{}) { +func (mm MetaMap) add(key string, mdtype metaDataType, val any) { if _, ok := mm[key]; !ok { mm[key] = MetaValue{DataType: mdtype, Value: val} return diff --git a/ginext/preContext.go b/ginext/preContext.go index 298a289..94ef00a 100644 --- a/ginext/preContext.go +++ b/ginext/preContext.go @@ -4,11 +4,11 @@ import ( "bytes" "context" "fmt" - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" "git.blackforestbytes.com/BlackForestBytes/goext/dataext" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" "io" "runtime/debug" "time" @@ -84,7 +84,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailURI). Str("struct_type", fmt.Sprintf("%T", pctx.uri)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "URI", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "URI", err)) } } @@ -94,7 +94,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailQuery). Str("struct_type", fmt.Sprintf("%T", pctx.query)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "QUERY", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "QUERY", err)) } } @@ -108,7 +108,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailJSON). Str("struct_type", fmt.Sprintf("%T", pctx.body)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) } } if err := pctx.ginCtx.ShouldBindJSON(pctx.body); err != nil { @@ -116,14 +116,14 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailJSON). Str("struct_type", fmt.Sprintf("%T", pctx.body)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) } } else { if !pctx.ignoreWrongContentType { err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body"). Str("struct_type", fmt.Sprintf("%T", pctx.body)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "JSON", err)) } } } @@ -132,14 +132,14 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { if brc, ok := pctx.ginCtx.Request.Body.(dataext.BufferedReadCloser); ok { v, err := brc.BufferedAll() if err != nil { - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "BODY", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "BODY", err)) } *pctx.rawbody = v } else { buf := &bytes.Buffer{} _, err := io.Copy(buf, pctx.ginCtx.Request.Body) if err != nil { - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "BODY", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "BODY", err)) } *pctx.rawbody = buf.Bytes() } @@ -152,7 +152,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailFormData). Str("struct_type", fmt.Sprintf("%T", pctx.form)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) } } else if pctx.ginCtx.ContentType() == "application/x-www-form-urlencoded" { if err := pctx.ginCtx.ShouldBindWith(pctx.form, binding.Form); err != nil { @@ -160,14 +160,14 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailFormData). Str("struct_type", fmt.Sprintf("%T", pctx.form)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) } } else { if !pctx.ignoreWrongContentType { err := exerr.New(exerr.TypeBindFailFormData, "missing form body"). Str("struct_type", fmt.Sprintf("%T", pctx.form)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "FORM", err)) } } } @@ -178,7 +178,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { WithType(exerr.TypeBindFailHeader). Str("struct_type", fmt.Sprintf("%T", pctx.query)). Build() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "HEADER", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "HEADER", err)) } } @@ -190,7 +190,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) { err := pctx.persistantData.sessionObj.Init(pctx.ginCtx, actx) if err != nil { actx.Cancel() - return CreateBackgroundAppContext(), nil, langext.Ptr(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "INIT", err)) + return CreateBackgroundAppContext(), nil, new(pctx.wrapper.buildRequestBindError(pctx.ginCtx, "INIT", err)) } } diff --git a/ginext/responseData.go b/ginext/responseData.go index f2c43a4..cef2877 100644 --- a/ginext/responseData.go +++ b/ginext/responseData.go @@ -1,8 +1,8 @@ package ginext import ( - "github.com/gin-gonic/gin" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" ) type dataHTTPResponse struct { @@ -42,7 +42,7 @@ func (j dataHTTPResponse) Statuscode() int { } func (j dataHTTPResponse) BodyString(*gin.Context) *string { - return langext.Ptr(string(j.data)) + return new(string(j.data)) } func (j dataHTTPResponse) ContentType() string { diff --git a/ginext/responseDownload.go b/ginext/responseDownload.go index 1d0a2f2..dd09561 100644 --- a/ginext/responseDownload.go +++ b/ginext/responseDownload.go @@ -2,8 +2,8 @@ package ginext import ( "fmt" - "github.com/gin-gonic/gin" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" ) type downloadDataHTTPResponse struct { @@ -48,7 +48,7 @@ func (j downloadDataHTTPResponse) Statuscode() int { } func (j downloadDataHTTPResponse) BodyString(*gin.Context) *string { - return langext.Ptr(string(j.data)) + return new(string(j.data)) } func (j downloadDataHTTPResponse) ContentType() string { diff --git a/ginext/responseFile.go b/ginext/responseFile.go index 1d79941..5d18187 100644 --- a/ginext/responseFile.go +++ b/ginext/responseFile.go @@ -2,8 +2,8 @@ package ginext import ( "fmt" - "github.com/gin-gonic/gin" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" "os" ) @@ -53,7 +53,7 @@ func (j fileHTTPResponse) BodyString(*gin.Context) *string { if err != nil { return nil } - return langext.Ptr(string(data)) + return new(string(data)) } func (j fileHTTPResponse) ContentType() string { diff --git a/ginext/responseSeekable.go b/ginext/responseSeekable.go index b8037c8..67f751b 100644 --- a/ginext/responseSeekable.go +++ b/ginext/responseSeekable.go @@ -1,9 +1,9 @@ package ginext import ( - "github.com/gin-gonic/gin" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" "io" "net/http" "time" @@ -56,7 +56,7 @@ func (j seekableResponse) Statuscode() int { } func (j seekableResponse) BodyString(*gin.Context) *string { - return langext.Ptr("(seekable)") + return new("(seekable)") } func (j seekableResponse) ContentType() string { diff --git a/ginext/responseText.go b/ginext/responseText.go index 9faf560..bc904b8 100644 --- a/ginext/responseText.go +++ b/ginext/responseText.go @@ -1,8 +1,8 @@ package ginext import ( - "github.com/gin-gonic/gin" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/gin-gonic/gin" ) type textHTTPResponse struct { @@ -41,7 +41,7 @@ func (j textHTTPResponse) Statuscode() int { } func (j textHTTPResponse) BodyString(*gin.Context) *string { - return langext.Ptr(j.data) + return new(j.data) } func (j textHTTPResponse) ContentType() string { diff --git a/go.mod b/go.mod index ae8a797..d8d0e25 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ module git.blackforestbytes.com/BlackForestBytes/goext -go 1.25.0 +go 1.26.0 require ( github.com/gin-gonic/gin v1.12.0 github.com/glebarez/go-sqlite v1.22.0 // only needed for tests -.- github.com/jmoiron/sqlx v1.4.0 github.com/rs/xid v1.6.0 - github.com/rs/zerolog v1.35.0 + github.com/rs/zerolog v1.35.1 go.mongodb.org/mongo-driver v1.17.9 golang.org/x/crypto v0.50.0 golang.org/x/sys v0.43.0 @@ -20,7 +20,6 @@ require ( github.com/gorilla/websocket v1.5.3 github.com/jung-kurt/gofpdf v1.16.2 github.com/xuri/excelize/v2 v2.10.1 - golang.org/x/net v0.53.0 golang.org/x/sync v0.20.0 ) @@ -38,7 +37,7 @@ require ( github.com/goccy/go-json v0.10.6 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/golang/snappy v1.0.0 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.5 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect @@ -49,6 +48,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/montanaflynn/stats v0.9.0 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect github.com/pelletier/go-toml/v2 v2.3.0 // indirect github.com/quic-go/qpack v0.6.0 // indirect github.com/quic-go/quic-go v0.59.0 // indirect @@ -64,13 +64,14 @@ require ( github.com/xuri/efp v0.0.1 // indirect github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect - go.mongodb.org/mongo-driver/v2 v2.5.0 // indirect + go.mongodb.org/mongo-driver/v2 v2.5.1 // indirect golang.org/x/arch v0.26.0 // indirect golang.org/x/image v0.39.0 // indirect + golang.org/x/net v0.53.0 // indirect golang.org/x/text v0.36.0 // indirect google.golang.org/protobuf v1.36.11 // indirect - modernc.org/libc v1.37.6 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.7.2 // indirect - modernc.org/sqlite v1.28.0 // indirect + modernc.org/libc v1.72.0 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect + modernc.org/sqlite v1.49.1 // indirect ) diff --git a/go.sum b/go.sum index 1e32b75..f0a4401 100644 --- a/go.sum +++ b/go.sum @@ -3,19 +3,14 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4 github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks= github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= -github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= -github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= -github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI= github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -25,8 +20,6 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= -github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= -github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= github.com/gin-contrib/sse v1.1.1 h1:uGYpNwTacv5R68bSGMapo62iLTRa9l5zxGCps4hK6ko= github.com/gin-contrib/sse v1.1.1/go.mod h1:QXzuVkA0YO7o/gun03UI1Q+FTI8ZV/n5t03kIQAI89s= github.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8= @@ -39,8 +32,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= -github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= github.com/go-playground/validator/v10 v10.30.2 h1:JiFIMtSSHb2/XBUbWM4i/MpeQm9ZK2xqPNk8vgvu5JQ= github.com/go-playground/validator/v10 v10.30.2/go.mod h1:mAf2pIOVXjTEBrwUMGKkCWKKPs9NheYGabeB04txQSc= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -49,18 +40,19 @@ github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU= github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -68,8 +60,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.16.2 h1:jgbatWHfRlPYiK85qgevsZTHviWXKwB1TTiKdz5PtRc= github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= @@ -78,13 +68,8 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= @@ -96,17 +81,14 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/montanaflynn/stats v0.8.2 h1:52wnefTJnPI5FoHif1DQh2soKRw0yYs+4AVyvtcZCH0= -github.com/montanaflynn/stats v0.8.2/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.9.0 h1:tsBJ0RXwph9BmAuFoCmqGv6e8xa0MENQ8m0ptKq29mQ= github.com/montanaflynn/stats v0.9.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= @@ -115,21 +97,14 @@ github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SA github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= -github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/mscfb v1.0.6 h1:eN3bvvZCp00bs7Zf52bxNwAx5lJDBK1tCuH19qq5aC8= github.com/richardlehane/mscfb v1.0.6/go.mod h1:pe0+IUIc0AHh0+teNzBlJCtSyZdFOGgV4ZK9bsoV+Jo= -github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= -github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.6 h1:9BvkpjvD+iUBalUY4esMwv6uBkfOip/Lzvd93jvR9gg= github.com/richardlehane/msoleps v1.0.6/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= -github.com/rs/zerolog v1.35.0 h1:VD0ykx7HMiMJytqINBsKcbLS+BJ4WYjz+05us+LRTdI= -github.com/rs/zerolog v1.35.0/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= +github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI= +github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -144,8 +119,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo= -github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I= github.com/tiendc/go-deepcopy v1.7.2 h1:Ut2yYR7W9tWjTQitganoIue4UGxZwCcJy3orjrrIj44= github.com/tiendc/go-deepcopy v1.7.2/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -160,12 +133,8 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw= -github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s= github.com/xuri/excelize/v2 v2.10.1 h1:V62UlqopMqha3kOpnlHy2CcRVw1V8E63jFoWUmMzxN0= github.com/xuri/excelize/v2 v2.10.1/go.mod h1:iG5tARpgaEeIhTqt3/fgXCGoBRt4hNXgCp3tfXKoOIc= -github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q= -github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 h1:+C0TIdyyYmzadGaL/HBLbf3WdLgC29pgyhTjAT/0nuE= github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= @@ -173,32 +142,26 @@ github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfS github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= -go.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE= -go.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= +go.mongodb.org/mongo-driver/v2 v2.5.1 h1:j2U/Qp+wvueSpqitLCSZPT/+ZpVc1xzuwdHWwl7d8ro= +go.mongodb.org/mongo-driver/v2 v2.5.1/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= -golang.org/x/arch v0.25.0 h1:qnk6Ksugpi5Bz32947rkUgDt9/s5qvqDPl/gBKdMJLE= -golang.org/x/arch v0.25.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= golang.org/x/arch v0.26.0 h1:jZ6dpec5haP/fUv1kLCbuJy6dnRrfX6iVK08lZBFpk4= golang.org/x/arch v0.26.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.37.0 h1:ZiRjArKI8GwxZOoEtUfhrBtaCN+4b/7709dlT6SSnQA= -golang.org/x/image v0.37.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= golang.org/x/image v0.39.0 h1:skVYidAEVKgn8lZ602XO75asgXBgLj9G/FE3RbuPFww= golang.org/x/image v0.39.0/go.mod h1:sIbmppfU+xFLPIG0FoVUTvyBMmgng1/XAMhQ2ft0hpA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -210,30 +173,23 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= -golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= @@ -241,11 +197,31 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/cc/v4 v4.27.3 h1:uNCgn37E5U09mTv1XgskEVUJ8ADKpmFMPxzGJ0TSo+U= +modernc.org/cc/v4 v4.27.3/go.mod h1:3YjcbCqhoTTHPycJDRl2WZKKFj0nwcOIPBfEZK0Hdk8= +modernc.org/ccgo/v4 v4.32.4 h1:L5OB8rpEX4ZsXEQwGozRfJyJSFHbbNVOoQ59DU9/KuU= +modernc.org/ccgo/v4 v4.32.4/go.mod h1:lY7f+fiTDHfcv6YlRgSkxYfhs+UvOEEzj49jAn2TOx0= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= +modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.72.0 h1:IEu559v9a0XWjw0DPoVKtXpO2qt5NVLAnFaBbjq+n8c= +modernc.org/libc v1.72.0/go.mod h1:tTU8DL8A+XLVkEY3x5E/tO7s2Q/q42EtnNWda/L5QhQ= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.49.1 h1:dYGHTKcX1sJ+EQDnUzvz4TJ5GbuvhNJa8Fg6ElGx73U= +modernc.org/sqlite v1.49.1/go.mod h1:m0w8xhwYUVY3H6pSDwc3gkJ/irZT/0YEXwBlhaxQEew= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/gojson/decode_test.go b/gojson/decode_test.go index f5b4467..0ef912b 100644 --- a/gojson/decode_test.go +++ b/gojson/decode_test.go @@ -108,11 +108,11 @@ func (u unmarshalerText) MarshalText() ([]byte, error) { } func (u *unmarshalerText) UnmarshalText(b []byte) error { - pos := bytes.IndexByte(b, ':') - if pos == -1 { + before, after, ok := bytes.Cut(b, []byte{':'}) + if !ok { return errors.New("missing separator") } - u.A, u.B = string(b[:pos]), string(b[pos+1:]) + u.A, u.B = string(before), string(after) return nil } @@ -126,7 +126,7 @@ type ustructText struct { type u8marshal uint8 func (u8 u8marshal) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf("u%d", u8)), nil + return fmt.Appendf(nil, "u%d", u8), nil } var errMissingU8Prefix = errors.New("missing 'u' prefix") @@ -275,7 +275,7 @@ func (unexportedWithMethods) F() {} type byteWithMarshalJSON byte func (b byteWithMarshalJSON) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"Z%.2x"`, byte(b))), nil + return fmt.Appendf(nil, `"Z%.2x"`, byte(b)), nil } func (b *byteWithMarshalJSON) UnmarshalJSON(data []byte) error { @@ -303,7 +303,7 @@ func (b *byteWithPtrMarshalJSON) UnmarshalJSON(data []byte) error { type byteWithMarshalText byte func (b byteWithMarshalText) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf(`Z%.2x`, byte(b))), nil + return fmt.Appendf(nil, `Z%.2x`, byte(b)), nil } func (b *byteWithMarshalText) UnmarshalText(data []byte) error { @@ -331,7 +331,7 @@ func (b *byteWithPtrMarshalText) UnmarshalText(data []byte) error { type intWithMarshalJSON int func (b intWithMarshalJSON) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"Z%.2x"`, int(b))), nil + return fmt.Appendf(nil, `"Z%.2x"`, int(b)), nil } func (b *intWithMarshalJSON) UnmarshalJSON(data []byte) error { @@ -359,7 +359,7 @@ func (b *intWithPtrMarshalJSON) UnmarshalJSON(data []byte) error { type intWithMarshalText int func (b intWithMarshalText) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf(`Z%.2x`, int(b))), nil + return fmt.Appendf(nil, `Z%.2x`, int(b)), nil } func (b *intWithMarshalText) UnmarshalText(data []byte) error { diff --git a/gojson/encode.go b/gojson/encode.go index 4dbda60..ad166d0 100644 --- a/gojson/encode.go +++ b/gojson/encode.go @@ -177,7 +177,7 @@ type IndentOpt struct { // MarshalSafeCollections is like Marshal except it will marshal nil maps and // slices as '{}' and '[]' respectfully instead of 'null' -func MarshalSafeCollections(v interface{}, nilSafeSlices bool, nilSafeMaps bool, indent *IndentOpt, filter *string) ([]byte, error) { +func MarshalSafeCollections(v any, nilSafeSlices bool, nilSafeMaps bool, indent *IndentOpt, filter *string) ([]byte, error) { e := &encodeState{} err := e.marshal(v, encOpts{escapeHTML: true, nilSafeSlices: nilSafeSlices, nilSafeMaps: nilSafeMaps, filter: filter}) if err != nil { @@ -891,7 +891,7 @@ func (se sliceEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { // Here we use a struct to memorize the pointer to the first element of the slice // and its length. ptr := struct { - ptr interface{} // always an unsafe.Pointer, but avoids a dependency on package unsafe + ptr any // always an unsafe.Pointer, but avoids a dependency on package unsafe len int }{v.UnsafePointer(), v.Len()} if _, ok := e.ptrSeen[ptr]; ok { @@ -923,7 +923,7 @@ type arrayEncoder struct { func (ae arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { e.WriteByte('[') n := v.Len() - for i := 0; i < n; i++ { + for i := range n { if i > 0 { e.WriteByte(',') } @@ -1075,10 +1075,7 @@ func appendString[Bytes []byte | string](dst []byte, src Bytes, escapeHTML bool) // For now, cast only a small portion of byte slices to a string // so that it can be stack allocated. This slows down []byte slightly // due to the extra copy, but keeps string performance roughly the same. - n := len(src) - i - if n > utf8.UTFMax { - n = utf8.UTFMax - } + n := min(len(src)-i, utf8.UTFMax) c, size := utf8.DecodeRuneInString(string(src[i : i+n])) if c == utf8.RuneError && size == 1 { dst = append(dst, src[start:i]...) @@ -1130,12 +1127,7 @@ type field struct { type jsonfilter []string func (j jsonfilter) Contains(t string) bool { - for _, tag := range j { - if t == tag { - return true - } - } - return false + return slices.Contains(j, t) } // typeFields returns a list of fields that JSON should recognize for the given type. diff --git a/gojson/encode_test.go b/gojson/encode_test.go index 68fb7a9..dd71b65 100644 --- a/gojson/encode_test.go +++ b/gojson/encode_test.go @@ -41,7 +41,7 @@ type Optionals struct { Uo uint `json:"uo,omitempty"` Str struct{} `json:"str"` - Sto struct{} `json:"sto,omitempty"` + Sto struct{} `json:"sto"` } func TestOmitEmpty(t *testing.T) { @@ -1166,8 +1166,7 @@ func TestMarshalUncommonFieldNames(t *testing.T) { } func TestMarshalerError(t *testing.T) { - s := "test variable" - st := reflect.TypeOf(s) + st := reflect.TypeFor[string]() const errText = "json: test error" tests := []struct { @@ -1222,18 +1221,18 @@ func TestIssue63379(t *testing.T) { func TestMarshalSafeCollections(t *testing.T) { var ( - nilSlice []interface{} - pNilSlice *[]interface{} - nilMap map[string]interface{} - pNilMap *map[string]interface{} + nilSlice []any + pNilSlice *[]any + nilMap map[string]any + pNilMap *map[string]any ) type ( nilSliceStruct struct { - NilSlice []interface{} `json:"nil_slice"` + NilSlice []any `json:"nil_slice"` } nilMapStruct struct { - NilMap map[string]interface{} `json:"nil_map"` + NilMap map[string]any `json:"nil_map"` } testWithFilter struct { Test1 string `json:"test1" jsonfilter:"FILTERONE"` @@ -1242,19 +1241,19 @@ func TestMarshalSafeCollections(t *testing.T) { ) tests := []struct { - in interface{} + in any want string }{ {nilSlice, "[]"}, - {[]interface{}{}, "[]"}, - {make([]interface{}, 0), "[]"}, + {[]any{}, "[]"}, + {make([]any, 0), "[]"}, {[]int{1, 2, 3}, "[1,2,3]"}, {pNilSlice, "null"}, {nilSliceStruct{}, "{\"nil_slice\":[]}"}, {nilMap, "{}"}, - {map[string]interface{}{}, "{}"}, - {make(map[string]interface{}, 0), "{}"}, - {map[string]interface{}{"1": 1, "2": 2, "3": 3}, "{\"1\":1,\"2\":2,\"3\":3}"}, + {map[string]any{}, "{}"}, + {make(map[string]any, 0), "{}"}, + {map[string]any{"1": 1, "2": 2, "3": 3}, "{\"1\":1,\"2\":2,\"3\":3}"}, {pNilMap, "null"}, {nilMapStruct{}, "{\"nil_map\":{}}"}, {testWithFilter{}, "{\"test1\":\"\"}"}, diff --git a/gojson/fuzz_test.go b/gojson/fuzz_test.go index 778664c..f019603 100644 --- a/gojson/fuzz_test.go +++ b/gojson/fuzz_test.go @@ -28,10 +28,10 @@ func FuzzUnmarshalJSON(f *testing.F) { }`)) f.Fuzz(func(t *testing.T, b []byte) { - for _, typ := range []func() interface{}{ - func() interface{} { return new(interface{}) }, - func() interface{} { return new(map[string]interface{}) }, - func() interface{} { return new([]interface{}) }, + for _, typ := range []func() any{ + func() any { return new(any) }, + func() any { return new(map[string]any) }, + func() any { return new([]any) }, } { i := typ() if err := Unmarshal(b, i); err != nil { diff --git a/gojson/indent.go b/gojson/indent.go index 01bfdf6..2a5d490 100644 --- a/gojson/indent.go +++ b/gojson/indent.go @@ -90,7 +90,7 @@ func appendCompact(dst, src []byte, escape bool) ([]byte, error) { func appendNewline(dst []byte, prefix, indent string, depth int) []byte { dst = append(dst, '\n') dst = append(dst, prefix...) - for i := 0; i < depth; i++ { + for range depth { dst = append(dst, indent...) } return dst diff --git a/gojson/scanner_test.go b/gojson/scanner_test.go index 068439d..bbd3d73 100644 --- a/gojson/scanner_test.go +++ b/gojson/scanner_test.go @@ -210,10 +210,7 @@ func diff(t *testing.T, a, b []byte) { t.Helper() for i := 0; ; i++ { if i >= len(a) || i >= len(b) || a[i] != b[i] { - j := i - 10 - if j < 0 { - j = 0 - } + j := max(i-10, 0) t.Errorf("diverge at %d: «%s» vs «%s»", i, trim(a[j:]), trim(b[j:])) return } @@ -274,10 +271,7 @@ func genString(stddev float64) string { } func genArray(n int) []any { - f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2))) - if f > n { - f = n - } + f := min(int(math.Abs(rand.NormFloat64())*math.Min(10, float64(n/2))), n) if f < 1 { f = 1 } @@ -289,10 +283,7 @@ func genArray(n int) []any { } func genMap(n int) map[string]any { - f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2))) - if f > n { - f = n - } + f := min(int(math.Abs(rand.NormFloat64())*math.Min(10, float64(n/2))), n) if n > 0 && f == 0 { f = 1 } diff --git a/googleapi/oAuth.go b/googleapi/oAuth.go index a52beec..845c6ff 100644 --- a/googleapi/oAuth.go +++ b/googleapi/oAuth.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/timeext" "io" "net/http" @@ -83,8 +82,8 @@ func (c *oauth) AccessToken() (string, error) { } c.lock.Lock() - c.expiryDate = langext.Ptr(reqStartTime.Add(timeext.FromSeconds(r.ExpiresIn - 10))) - c.accessToken = langext.Ptr(r.AccessToken) + c.expiryDate = new(reqStartTime.Add(timeext.FromSeconds(r.ExpiresIn - 10))) + c.accessToken = new(r.AccessToken) c.lock.Unlock() return r.AccessToken, nil diff --git a/langext/array.go b/langext/array.go index 5a6dc3f..6202daf 100644 --- a/langext/array.go +++ b/langext/array.go @@ -5,6 +5,8 @@ import ( "fmt" "math/rand" "reflect" + "slices" + "strings" ) func BoolCount(arr ...bool) int { @@ -41,22 +43,12 @@ func ReverseArray[T any](v []T) { } func InArray[T comparable](needle T, haystack []T) bool { - for _, v := range haystack { - if v == needle { - return true - } - } - return false + return slices.Contains(haystack, needle) } // ArrContains checks if the value is contained in the array (same as InArray, but odther name for better findability) func ArrContains[T comparable](haystack []T, needle T) bool { - for _, v := range haystack { - if v == needle { - return true - } - } - return false + return slices.Contains(haystack, needle) } func ArrUnique[T comparable](array []T) []T { @@ -119,12 +111,7 @@ func ArrAllErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) { } func ArrNone[T any](arr []T, fn func(T) bool) bool { - for _, av := range arr { - if fn(av) { - return false - } - } - return true + return !slices.ContainsFunc(arr, fn) } func ArrNoneErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) { @@ -141,12 +128,7 @@ func ArrNoneErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) { } func ArrAny[T any](arr []T, fn func(T) bool) bool { - for _, av := range arr { - if fn(av) { - return true - } - } - return false + return slices.ContainsFunc(arr, fn) } func ArrAnyErr[T any](arr []T, fn func(T) (bool, error)) (bool, error) { @@ -246,7 +228,7 @@ func ArrFirst[T any](arr []T, comp func(v T) bool) (T, bool) { func ArrFirstOrNil[T any](arr []T, comp func(v T) bool) *T { for _, v := range arr { if comp(v) { - return Ptr(v) + return new(v) } } return nil @@ -274,7 +256,7 @@ func ArrLastOrNil[T any](arr []T, comp func(v T) bool) *T { } } if found { - return Ptr(result) + return new(result) } else { return nil } @@ -319,10 +301,8 @@ func ArrLastIndexFunc[T any](arr []T, comp func(v T) bool) int { } func AddToSet[T comparable](set []T, add T) []T { - for _, v := range set { - if v == add { - return set - } + if slices.Contains(set, add) { + return set } return append(set, add) } @@ -522,7 +502,7 @@ func ArrAppend[T any](arr []T, add ...T) []T { func ArrPrepend[T any](arr []T, add ...T) []T { out := make([]T, len(arr)+len(add)) copy(out[len(add):], arr) - for i := 0; i < len(add); i++ { + for i := range add { out[len(add)-i-1] = add[i] } return out @@ -558,8 +538,8 @@ func ArrExcept[T comparable](arr []T, needles ...T) []T { return r } -func ArrayToInterface[T any](t []T) []interface{} { - res := make([]interface{}, 0, len(t)) +func ArrayToInterface[T any](t []T) []any { + res := make([]any, 0, len(t)) for i, _ := range t { res = append(res, t[i]) } @@ -567,15 +547,15 @@ func ArrayToInterface[T any](t []T) []interface{} { } func JoinString(arr []string, delimiter string) string { - str := "" + var str strings.Builder for i, v := range arr { - str += v + str.WriteString(v) if i < len(arr)-1 { - str += delimiter + str.WriteString(delimiter) } } - return str + return str.String() } // ArrChunk splits the array into buckets of max-size `chunkSize` @@ -595,10 +575,7 @@ func ArrChunk[T any](arr []T, chunkSize int) [][]T { i := 0 for i < len(arr) { - right := i + chunkSize - if right >= len(arr) { - right = len(arr) - } + right := min(i+chunkSize, len(arr)) res = append(res, arr[i:right]) diff --git a/langext/base58.go b/langext/base58.go index ff14d60..ea26ac0 100644 --- a/langext/base58.go +++ b/langext/base58.go @@ -44,8 +44,8 @@ func newBase58Encoding(alphabet string) *B58Encoding { b58 := make([]byte, 0, 256) - for i := byte(0); i < 32; i++ { - for j := byte(0); j < 8; j++ { + for i := range byte(32) { + for j := range byte(8) { b := i*8 + j @@ -100,7 +100,7 @@ func (enc *B58Encoding) Encode(src []byte) ([]byte, error) { } } else { m := mod.Int64() - for i := 0; i < 10; i++ { + for range 10 { answer = append(answer, enc.alphabet[m%58]) m /= 58 } @@ -137,10 +137,7 @@ func (enc *B58Encoding) Decode(src []byte) ([]byte, error) { scratch := new(big.Int) for t := src; len(t) > 0; { - n := len(t) - if n > 10 { - n = 10 - } + n := min(len(t), 10) total := uint64(0) for _, v := range t[:n] { diff --git a/langext/base62.go b/langext/base62.go index 811de81..dc79ca4 100644 --- a/langext/base62.go +++ b/langext/base62.go @@ -18,18 +18,18 @@ func RandBase62(rlen int) string { randMax := big.NewInt(math.MaxInt64) - r := "" + var r strings.Builder - for i := 0; i < rlen; i++ { + for range rlen { v, err := rand.Int(rand.Reader, randMax) if err != nil { panic(err) } - r += string(base62CharacterSet[v.Mod(v, bi52).Int64()]) + r.WriteString(string(base62CharacterSet[v.Mod(v, bi52).Int64()])) } - return r + return r.String() } func EncodeBase62(num uint64) string { diff --git a/langext/baseAny.go b/langext/baseAny.go index 5d11f1e..612c79f 100644 --- a/langext/baseAny.go +++ b/langext/baseAny.go @@ -5,6 +5,7 @@ import ( "errors" "math" "math/big" + "strings" ) type AnyBaseConverter struct { @@ -25,18 +26,18 @@ func (bc AnyBaseConverter) Rand(rlen int) string { randMax := big.NewInt(math.MaxInt64) - r := "" + var r strings.Builder - for i := 0; i < rlen; i++ { + for range rlen { v, err := rand.Int(rand.Reader, randMax) if err != nil { panic(err) } - r += string(bc.charset[v.Mod(v, biBase).Int64()]) + r.WriteString(string(bc.charset[v.Mod(v, biBase).Int64()])) } - return r + return r.String() } func (bc AnyBaseConverter) EncodeUInt64(num uint64) string { @@ -44,7 +45,7 @@ func (bc AnyBaseConverter) EncodeUInt64(num uint64) string { return "0" } - b := "" + var b strings.Builder // loop as long the num is bigger than zero for num > 0 { @@ -53,10 +54,10 @@ func (bc AnyBaseConverter) EncodeUInt64(num uint64) string { num -= r num /= base62Base - b += string(bc.charset[int(r)]) + b.WriteString(string(bc.charset[int(r)])) } - return b + return b.String() } func (bc AnyBaseConverter) DecodeUInt64(str string) (uint64, error) { diff --git a/langext/bytes.go b/langext/bytes.go index 746d1a3..2608901 100644 --- a/langext/bytes.go +++ b/langext/bytes.go @@ -25,7 +25,7 @@ func BytesXOR(a []byte, b []byte) ([]byte, error) { r := make([]byte, len(a)) - for i := 0; i < len(a); i++ { + for i := range a { r[i] = a[i] ^ b[i] } diff --git a/langext/json.go b/langext/json.go index 5867d8c..9c9d1d5 100644 --- a/langext/json.go +++ b/langext/json.go @@ -85,7 +85,7 @@ func MarshalJsonOrNil(v any) *string { if err != nil { return nil } - return Ptr(string(bin)) + return new(string(bin)) } func MarshalJsonIndentOrPanic(v any, prefix, indent string) string { @@ -109,5 +109,5 @@ func MarshalJsonIndentOrNil(v any, prefix, indent string) *string { if err != nil { return nil } - return Ptr(string(bin)) + return new(string(bin)) } diff --git a/langext/maps.go b/langext/maps.go index f979230..63da691 100644 --- a/langext/maps.go +++ b/langext/maps.go @@ -1,5 +1,7 @@ package langext +import "maps" + import "encoding/json" type MapEntry[T comparable, V any] struct { @@ -60,9 +62,7 @@ func MapToArr[T comparable, V any](v map[T]V) []MapEntry[T, V] { func CopyMap[K comparable, V any](a map[K]V) map[K]V { result := make(map[K]V, len(a)) - for k, v := range a { - result[k] = v - } + maps.Copy(result, a) return result } @@ -90,14 +90,10 @@ func ForceJsonMapOrPanic(v any) map[string]any { func MapMerge[K comparable, V any](base map[K]V, arr ...map[K]V) map[K]V { res := make(map[K]V, len(base)*(1+len(arr))) - for k, v := range base { - res[k] = v - } + maps.Copy(res, base) for _, m := range arr { - for k, v := range m { - res[k] = v - } + maps.Copy(res, m) } return res diff --git a/langext/pointer.go b/langext/pointer.go index 8e2c70d..0fb3680 100644 --- a/langext/pointer.go +++ b/langext/pointer.go @@ -5,16 +5,17 @@ import ( ) // PTrue := &true -var PTrue = Ptr(true) +var PTrue = new(true) // PFalse := &false -var PFalse = Ptr(false) +var PFalse = new(false) // PNil := &nil var PNil = Ptr[any](nil) +//go:fix inline func Ptr[T any](v T) *T { - return &v + return new(v) } func DblPtr[T any](v T) **T { @@ -34,32 +35,37 @@ func DblPtrNil[T any]() **T { return &v } +//go:fix inline func ArrPtr[T any](v ...T) *[]T { - return &v + return new(v) } +//go:fix inline func PtrInt32(v int32) *int32 { - return &v + return new(v) } +//go:fix inline func PtrInt64(v int64) *int64 { - return &v + return new(v) } +//go:fix inline func PtrFloat32(v float32) *float32 { - return &v + return new(v) } +//go:fix inline func PtrFloat64(v float64) *float64 { - return &v + return new(v) } -func IsNil(i interface{}) bool { +func IsNil(i any) bool { if i == nil { return true } switch reflect.TypeOf(i).Kind() { - case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Slice, reflect.Func, reflect.UnsafePointer: + case reflect.Pointer, reflect.Map, reflect.Chan, reflect.Slice, reflect.Func, reflect.UnsafePointer: return reflect.ValueOf(i).IsNil() } return false diff --git a/langext/sort.go b/langext/sort.go index da360c5..84e886c 100644 --- a/langext/sort.go +++ b/langext/sort.go @@ -1,18 +1,16 @@ package langext +import "slices" + import "sort" func Sort[T OrderedConstraint](arr []T) { - sort.Slice(arr, func(i1, i2 int) bool { - return arr[i1] < arr[i2] - }) + slices.Sort(arr) } func AsSorted[T OrderedConstraint](arr []T) []T { arr = ArrCopy(arr) - sort.Slice(arr, func(i1, i2 int) bool { - return arr[i1] < arr[i2] - }) + slices.Sort(arr) return arr } diff --git a/langext/string.go b/langext/string.go index 9be8eae..5f82141 100644 --- a/langext/string.go +++ b/langext/string.go @@ -15,7 +15,7 @@ func StrLimit(val string, maxlen int, suffix string) string { func StrSplit(val string, sep string, allowEmpty bool) []string { var arr []string - for _, k := range strings.Split(val, sep) { + for k := range strings.SplitSeq(val, sep) { if allowEmpty || k != "" { arr = append(arr, k) } @@ -51,7 +51,7 @@ func DeRefStringer(v fmt.Stringer) *string { if v == nil { return nil } else { - return Ptr(v.String()) + return new(v.String()) } } @@ -93,7 +93,7 @@ func Indent(str string, pad string) string { str = str[0 : len(str)-1] } r := "" - for _, v := range strings.Split(str, "\n") { + for v := range strings.SplitSeq(str, "\n") { r += pad + v + "\n" } @@ -113,29 +113,29 @@ func NumToStringOpt[V IntConstraint](v *V, fallback string) string { } func StrRepeat(val string, count int) string { - r := "" - for i := 0; i < count; i++ { - r += val + var r strings.Builder + for range count { + r.WriteString(val) } - return r + return r.String() } func StrWrap(val string, linelen int, seperator string) string { - res := "" + var res strings.Builder for iPos := 0; ; { next := min(iPos+linelen, len(val)) - res += val[iPos:next] + res.WriteString(val[iPos:next]) iPos = next if iPos >= len(val) { break } - res += seperator + res.WriteString(seperator) } - return res + return res.String() } func StrRemoveControlCharacters(str string) string { diff --git a/mongoext/projections.go b/mongoext/projections.go index a8b123f..2be6fce 100644 --- a/mongoext/projections.go +++ b/mongoext/projections.go @@ -10,7 +10,7 @@ import ( // This way you can pretty much always write // `options.FindOne().SetProjection(mongoutils.ProjectionFromStruct(...your_model...))` // to only get the data from mongodb that you will actually use in the later decode step -func ProjectionFromStruct(obj interface{}) bson.M { +func ProjectionFromStruct(obj any) bson.M { v := reflect.ValueOf(obj) t := v.Type() diff --git a/mongoext/registry.go b/mongoext/registry.go index 3ac1f4e..dad9c65 100644 --- a/mongoext/registry.go +++ b/mongoext/registry.go @@ -13,39 +13,39 @@ import ( func CreateGoExtBsonRegistry() *bsoncodec.Registry { reg := bson.NewRegistry() - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.RFC3339Time{}), rfctime.RFC3339Time{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.RFC3339Time{}), rfctime.RFC3339Time{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.RFC3339Time](), rfctime.RFC3339Time{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.RFC3339Time](), rfctime.RFC3339Time{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.RFC3339NanoTime{}), rfctime.RFC3339NanoTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.RFC3339NanoTime{}), rfctime.RFC3339NanoTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.RFC3339NanoTime](), rfctime.RFC3339NanoTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.RFC3339NanoTime](), rfctime.RFC3339NanoTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.UnixTime{}), rfctime.UnixTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.UnixTime{}), rfctime.UnixTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.UnixTime](), rfctime.UnixTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.UnixTime](), rfctime.UnixTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.UnixMilliTime{}), rfctime.UnixMilliTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.UnixMilliTime{}), rfctime.UnixMilliTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.UnixMilliTime](), rfctime.UnixMilliTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.UnixMilliTime](), rfctime.UnixMilliTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.UnixNanoTime{}), rfctime.UnixNanoTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.UnixNanoTime{}), rfctime.UnixNanoTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.UnixNanoTime](), rfctime.UnixNanoTime{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.UnixNanoTime](), rfctime.UnixNanoTime{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.Date{}), rfctime.Date{}) - reg.RegisterTypeDecoder(reflect.TypeOf(&rfctime.Date{}), rfctime.Date{}) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.Date](), rfctime.Date{}) + reg.RegisterTypeDecoder(reflect.TypeFor[*rfctime.Date](), rfctime.Date{}) - reg.RegisterTypeDecoder(reflect.TypeOf(rfctime.SecondsF64(0)), rfctime.SecondsF64(0)) + reg.RegisterTypeDecoder(reflect.TypeFor[rfctime.SecondsF64](), rfctime.SecondsF64(0)) reg.RegisterTypeDecoder(reflect.TypeOf(langext.Ptr(rfctime.SecondsF64(0))), rfctime.SecondsF64(0)) - reg.RegisterTypeDecoder(reflect.TypeOf(exerr.ErrorCategory{}), exerr.ErrorCategory{}) - reg.RegisterTypeDecoder(reflect.TypeOf(langext.Ptr(exerr.ErrorCategory{})), exerr.ErrorCategory{}) + reg.RegisterTypeDecoder(reflect.TypeFor[exerr.ErrorCategory](), exerr.ErrorCategory{}) + reg.RegisterTypeDecoder(reflect.TypeOf(new(exerr.ErrorCategory{})), exerr.ErrorCategory{}) - reg.RegisterTypeDecoder(reflect.TypeOf(exerr.ErrorSeverity{}), exerr.ErrorSeverity{}) - reg.RegisterTypeDecoder(reflect.TypeOf(langext.Ptr(exerr.ErrorSeverity{})), exerr.ErrorSeverity{}) + reg.RegisterTypeDecoder(reflect.TypeFor[exerr.ErrorSeverity](), exerr.ErrorSeverity{}) + reg.RegisterTypeDecoder(reflect.TypeOf(new(exerr.ErrorSeverity{})), exerr.ErrorSeverity{}) - reg.RegisterTypeDecoder(reflect.TypeOf(exerr.ErrorType{}), exerr.ErrorType{}) - reg.RegisterTypeDecoder(reflect.TypeOf(langext.Ptr(exerr.ErrorType{})), exerr.ErrorType{}) + reg.RegisterTypeDecoder(reflect.TypeFor[exerr.ErrorType](), exerr.ErrorType{}) + reg.RegisterTypeDecoder(reflect.TypeOf(new(exerr.ErrorType{})), exerr.ErrorType{}) // otherwise we get []primitve.E when unmarshalling into any // which will result in {'key': .., 'value': ...}[] json when json-marshalling - reg.RegisterTypeMapEntry(bson.TypeEmbeddedDocument, reflect.TypeOf(primitive.M{})) + reg.RegisterTypeMapEntry(bson.TypeEmbeddedDocument, reflect.TypeFor[primitive.M]()) return reg } diff --git a/reflectext/casting.go b/reflectext/casting.go index 8cdfdca..835a70e 100644 --- a/reflectext/casting.go +++ b/reflectext/casting.go @@ -5,23 +5,23 @@ import ( ) var reflectBasicTypes = map[reflect.Kind]reflect.Type{ - reflect.Bool: reflect.TypeOf(false), - reflect.Int: reflect.TypeOf(int(0)), - reflect.Int8: reflect.TypeOf(int8(0)), - reflect.Int16: reflect.TypeOf(int16(0)), - reflect.Int32: reflect.TypeOf(int32(0)), - reflect.Int64: reflect.TypeOf(int64(0)), - reflect.Uint: reflect.TypeOf(uint(0)), - reflect.Uint8: reflect.TypeOf(uint8(0)), - reflect.Uint16: reflect.TypeOf(uint16(0)), - reflect.Uint32: reflect.TypeOf(uint32(0)), - reflect.Uint64: reflect.TypeOf(uint64(0)), - reflect.Uintptr: reflect.TypeOf(uintptr(0)), - reflect.Float32: reflect.TypeOf(float32(0)), - reflect.Float64: reflect.TypeOf(float64(0)), - reflect.Complex64: reflect.TypeOf(complex64(0)), - reflect.Complex128: reflect.TypeOf(complex128(0)), - reflect.String: reflect.TypeOf(""), + reflect.Bool: reflect.TypeFor[bool](), + reflect.Int: reflect.TypeFor[int](), + reflect.Int8: reflect.TypeFor[int8](), + reflect.Int16: reflect.TypeFor[int16](), + reflect.Int32: reflect.TypeFor[int32](), + reflect.Int64: reflect.TypeFor[int64](), + reflect.Uint: reflect.TypeFor[uint](), + reflect.Uint8: reflect.TypeFor[uint8](), + reflect.Uint16: reflect.TypeFor[uint16](), + reflect.Uint32: reflect.TypeFor[uint32](), + reflect.Uint64: reflect.TypeFor[uint64](), + reflect.Uintptr: reflect.TypeFor[uintptr](), + reflect.Float32: reflect.TypeFor[float32](), + reflect.Float64: reflect.TypeFor[float64](), + reflect.Complex64: reflect.TypeFor[complex64](), + reflect.Complex128: reflect.TypeFor[complex128](), + reflect.String: reflect.TypeFor[string](), } // Underlying returns the underlying type of t (without type alias) @@ -48,17 +48,17 @@ func Underlying(t reflect.Type) (ret reflect.Type) { nOut := t.NumOut() in := make([]reflect.Type, nIn) out := make([]reflect.Type, nOut) - for i := 0; i < nIn; i++ { + for i := range nIn { in[i] = t.In(i) } - for i := 0; i < nOut; i++ { + for i := range nOut { out[i] = t.Out(i) } ret = reflect.FuncOf(in, out, t.IsVariadic()) case reflect.Interface: // not supported - case reflect.Ptr: - ret = reflect.PtrTo(t.Elem()) + case reflect.Pointer: + ret = reflect.PointerTo(t.Elem()) case reflect.Slice: ret = reflect.SliceOf(t.Elem()) case reflect.Struct: @@ -72,7 +72,7 @@ func Underlying(t reflect.Type) (ret reflect.Type) { }() n := t.NumField() fields := make([]reflect.StructField, n) - for i := 0; i < n; i++ { + for i := range n { fields[i] = t.Field(i) } ret = reflect.StructOf(fields) diff --git a/reflectext/convertToMap.go b/reflectext/convertToMap.go index eeffb09..381e8c8 100644 --- a/reflectext/convertToMap.go +++ b/reflectext/convertToMap.go @@ -36,7 +36,7 @@ func reflectToMap(fv reflect.Value, depth int, opt ConvertStructToMapOpt) any { return fv.Interface() } - if fv.Kind() == reflect.Ptr { + if fv.Kind() == reflect.Pointer { if fv.IsNil() { return nil @@ -57,7 +57,7 @@ func reflectToMap(fv reflect.Value, depth int, opt ConvertStructToMapOpt) any { arrlen := fv.Len() arr := make([]any, arrlen) - for i := 0; i < arrlen; i++ { + for i := range arrlen { arr[i] = reflectToMap(fv.Index(i), depth+1, opt) } return arr @@ -68,7 +68,7 @@ func reflectToMap(fv reflect.Value, depth int, opt ConvertStructToMapOpt) any { arrlen := fv.Len() arr := make([]any, arrlen) - for i := 0; i < arrlen; i++ { + for i := range arrlen { arr[i] = reflectToMap(fv.Index(i), depth+1, opt) } return arr diff --git a/reflectext/convertToMap_test.go b/reflectext/convertToMap_test.go index 9f2d8eb..c59de41 100644 --- a/reflectext/convertToMap_test.go +++ b/reflectext/convertToMap_test.go @@ -29,7 +29,7 @@ func TestConvertStructToMap(t *testing.T) { FieldD: []float64{1, 2, 3, 4, 5, 6, 7}, FieldE1: nil, FieldE2: nil, - FieldE3: langext.Ptr(12), + FieldE3: new(12), FieldE4: langext.DblPtr(12), FieldE5: nil, FieldE6: langext.DblPtrNil[int](), diff --git a/reflectext/mapAccess.go b/reflectext/mapAccess.go index f0a67c5..48d47b9 100644 --- a/reflectext/mapAccess.go +++ b/reflectext/mapAccess.go @@ -39,7 +39,7 @@ func GetMapField[TData any, TKey comparable](mapval any, key TKey) (TData, bool) rval := reflect.ValueOf(mapval) - for rval.Kind() == reflect.Ptr && !rval.IsNil() { + for rval.Kind() == reflect.Pointer && !rval.IsNil() { rval = rval.Elem() } @@ -58,7 +58,7 @@ func GetMapField[TData any, TKey comparable](mapval any, key TKey) (TData, bool) return *new(TData), false // key does not exist in mapval } - destType := reflect.TypeOf(new(TData)).Elem() + destType := reflect.TypeFor[TData]() if eval.Type() == destType { return eval.Interface().(TData), true @@ -68,11 +68,11 @@ func GetMapField[TData any, TKey comparable](mapval any, key TKey) (TData, bool) return eval.Convert(destType).Interface().(TData), true } - if (eval.Kind() == reflect.Ptr || eval.Kind() == reflect.Interface) && eval.IsNil() && destType.Kind() == reflect.Ptr { + if (eval.Kind() == reflect.Pointer || eval.Kind() == reflect.Interface) && eval.IsNil() && destType.Kind() == reflect.Pointer { return *new(TData), false // special case: mapval[key] is nil } - for (eval.Kind() == reflect.Ptr || eval.Kind() == reflect.Interface) && !eval.IsNil() { + for (eval.Kind() == reflect.Pointer || eval.Kind() == reflect.Interface) && !eval.IsNil() { eval = eval.Elem() if eval.Type() == destType { diff --git a/reflectext/primStrSer.go b/reflectext/primStrSer.go index 67a3d2d..22daa52 100644 --- a/reflectext/primStrSer.go +++ b/reflectext/primStrSer.go @@ -3,8 +3,8 @@ package reflectext import ( "errors" "fmt" - "go.mongodb.org/mongo-driver/bson/primitive" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "go.mongodb.org/mongo-driver/bson/primitive" "reflect" "strconv" "strings" @@ -13,24 +13,24 @@ import ( var primitiveSerializer = map[reflect.Type]genSerializer{ - reflect.TypeOf(""): newGenSerializer(serStringToString, serStringToString), + reflect.TypeFor[string](): newGenSerializer(serStringToString, serStringToString), - reflect.TypeOf(int(0)): newGenSerializer(serIntNumToString[int], serStringToSIntNum[int]), - reflect.TypeOf(int32(0)): newGenSerializer(serIntNumToString[int32], serStringToSIntNum[int32]), - reflect.TypeOf(int64(0)): newGenSerializer(serIntNumToString[int64], serStringToSIntNum[int64]), + reflect.TypeFor[int](): newGenSerializer(serIntNumToString[int], serStringToSIntNum[int]), + reflect.TypeFor[int32](): newGenSerializer(serIntNumToString[int32], serStringToSIntNum[int32]), + reflect.TypeFor[int64](): newGenSerializer(serIntNumToString[int64], serStringToSIntNum[int64]), - reflect.TypeOf(uint(0)): newGenSerializer(serIntNumToString[uint], serStringToUIntNum[uint]), - reflect.TypeOf(uint32(0)): newGenSerializer(serIntNumToString[uint32], serStringToUIntNum[uint32]), - reflect.TypeOf(uint64(0)): newGenSerializer(serIntNumToString[uint64], serStringToUIntNum[uint64]), + reflect.TypeFor[uint](): newGenSerializer(serIntNumToString[uint], serStringToUIntNum[uint]), + reflect.TypeFor[uint32](): newGenSerializer(serIntNumToString[uint32], serStringToUIntNum[uint32]), + reflect.TypeFor[uint64](): newGenSerializer(serIntNumToString[uint64], serStringToUIntNum[uint64]), - reflect.TypeOf(float32(0)): newGenSerializer(serFloatNumToString[float32], serStringToFloatNum[float32]), - reflect.TypeOf(float64(0)): newGenSerializer(serFloatNumToString[float64], serStringToFloatNum[float64]), + reflect.TypeFor[float32](): newGenSerializer(serFloatNumToString[float32], serStringToFloatNum[float32]), + reflect.TypeFor[float64](): newGenSerializer(serFloatNumToString[float64], serStringToFloatNum[float64]), - reflect.TypeOf(true): newGenSerializer(serBoolToString, serStringToBool), + reflect.TypeFor[bool](): newGenSerializer(serBoolToString, serStringToBool), - reflect.TypeOf(primitive.ObjectID{}): newGenSerializer(serObjectIDToString, serStringToObjectID), + reflect.TypeFor[primitive.ObjectID](): newGenSerializer(serObjectIDToString, serStringToObjectID), - reflect.TypeOf(time.Time{}): newGenSerializer(serTimeToString, serStringToTime), + reflect.TypeFor[time.Time](): newGenSerializer(serTimeToString, serStringToTime), } type genSerializer struct { diff --git a/reflectext/primitiveStringSerializer.go b/reflectext/primitiveStringSerializer.go index 1ba723e..2299d4d 100644 --- a/reflectext/primitiveStringSerializer.go +++ b/reflectext/primitiveStringSerializer.go @@ -20,11 +20,11 @@ func (pss PrimitiveStringSerializer) ValueToString(v any) (string, error) { inType := reflect.TypeOf(v) - if inType.Kind() == reflect.Ptr && langext.IsNil(v) { + if inType.Kind() == reflect.Pointer && langext.IsNil(v) { return "", nil } - if inType.Kind() == reflect.Ptr { + if inType.Kind() == reflect.Pointer { rval1 := reflect.ValueOf(v) rval2 := rval1.Elem() rval3 := rval2.Interface() @@ -46,7 +46,7 @@ func (pss PrimitiveStringSerializer) ValueToString(v any) (string, error) { func (pss PrimitiveStringSerializer) ValueFromString(str string, outType reflect.Type) (any, error) { - if outType.Kind() == reflect.Ptr && str == "" { + if outType.Kind() == reflect.Pointer && str == "" { return reflect.Zero(outType).Interface(), nil // = nil.(outType), nil } @@ -54,7 +54,7 @@ func (pss PrimitiveStringSerializer) ValueFromString(str string, outType reflect return reflect.Zero(outType).Interface(), nil // = (outType), nil } - if outType.Kind() == reflect.Ptr { + if outType.Kind() == reflect.Pointer { innerValue, err := pss.ValueFromString(str, outType.Elem()) if err != nil { diff --git a/reflectext/structAccess.go b/reflectext/structAccess.go index b2c340d..d294448 100644 --- a/reflectext/structAccess.go +++ b/reflectext/structAccess.go @@ -2,7 +2,6 @@ package reflectext import ( "errors" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "reflect" "strconv" "strings" @@ -29,7 +28,7 @@ type AccessStructOpt struct { } func AccessJSONStruct[TResult any](v any, path string) (TResult, error) { - return AccessStructByStringPath[TResult](v, path, AccessStructOpt{UsedTagForKeys: langext.Ptr("json")}) + return AccessStructByStringPath[TResult](v, path, AccessStructOpt{UsedTagForKeys: new("json")}) } func AccessStruct[TResult any](v any, path string) (TResult, error) { @@ -84,7 +83,7 @@ func accessStructByPath(val reflect.Value, path []string, opt AccessStructOpt) ( currPath := path[0] - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { if val.IsNil() { if opt.ReturnNilOnNilPtrFields { return nil, nil diff --git a/rext/wrapper.go b/rext/wrapper.go index f4be507..ced4965 100644 --- a/rext/wrapper.go +++ b/rext/wrapper.go @@ -1,7 +1,6 @@ package rext import ( - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "regexp" ) @@ -170,7 +169,7 @@ func (g OptRegexMatchGroup) ValueOrNil() *string { if g.v == nil { return nil } - return langext.Ptr(g.v.Value()) + return new(g.v.Value()) } func (g OptRegexMatchGroup) IsEmpty() bool { diff --git a/rfctime/date.go b/rfctime/date.go index a6e1429..5e35ea3 100644 --- a/rfctime/date.go +++ b/rfctime/date.go @@ -128,7 +128,7 @@ func (t Date) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t Date) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -140,7 +140,7 @@ func (t Date) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -150,7 +150,7 @@ func (t Date) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) diff --git a/rfctime/rfc3339.go b/rfctime/rfc3339.go index 21d95a3..8137625 100644 --- a/rfctime/rfc3339.go +++ b/rfctime/rfc3339.go @@ -7,7 +7,6 @@ import ( "reflect" "time" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -96,7 +95,7 @@ func (t RFC3339Time) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t RFC3339Time) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -108,7 +107,7 @@ func (t RFC3339Time) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRead return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -118,7 +117,7 @@ func (t RFC3339Time) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRead return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) @@ -258,7 +257,7 @@ func NewRFC3339Ptr(t *time.Time) *RFC3339Time { if t == nil { return nil } - return langext.Ptr(RFC3339Time(*t)) + return new(RFC3339Time(*t)) } func NowRFC3339() RFC3339Time { diff --git a/rfctime/rfc3339Nano.go b/rfctime/rfc3339Nano.go index e0d6c07..75e2e89 100644 --- a/rfctime/rfc3339Nano.go +++ b/rfctime/rfc3339Nano.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -95,7 +94,7 @@ func (t RFC3339NanoTime) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t RFC3339NanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -107,7 +106,7 @@ func (t RFC3339NanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.Value return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -117,7 +116,7 @@ func (t RFC3339NanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.Value return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) @@ -257,7 +256,7 @@ func NewRFC3339NanoPtr(t *time.Time) *RFC3339NanoTime { if t == nil { return nil } - return langext.Ptr(RFC3339NanoTime(*t)) + return new(RFC3339NanoTime(*t)) } func NowRFC3339Nano() RFC3339NanoTime { diff --git a/rfctime/seconds.go b/rfctime/seconds.go index 076f797..7048a8a 100644 --- a/rfctime/seconds.go +++ b/rfctime/seconds.go @@ -87,7 +87,7 @@ func (d SecondsF64) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (d SecondsF64) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -99,7 +99,7 @@ func (d SecondsF64) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReade return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -109,7 +109,7 @@ func (d SecondsF64) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReade return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&d)) } else { val.Set(reflect.ValueOf(d)) diff --git a/rfctime/unix.go b/rfctime/unix.go index 21fd5ad..87a39e1 100644 --- a/rfctime/unix.go +++ b/rfctime/unix.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -93,7 +92,7 @@ func (t UnixTime) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t UnixTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -105,7 +104,7 @@ func (t UnixTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -115,7 +114,7 @@ func (t UnixTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) @@ -251,7 +250,7 @@ func NewUnixPtr(t *time.Time) *UnixTime { if t == nil { return nil } - return langext.Ptr(UnixTime(*t)) + return new(UnixTime(*t)) } func NowUnix() UnixTime { diff --git a/rfctime/unixMilli.go b/rfctime/unixMilli.go index 30a3225..d496103 100644 --- a/rfctime/unixMilli.go +++ b/rfctime/unixMilli.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -93,7 +92,7 @@ func (t UnixMilliTime) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t UnixMilliTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -105,7 +104,7 @@ func (t UnixMilliTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -115,7 +114,7 @@ func (t UnixMilliTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRe return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) @@ -251,7 +250,7 @@ func NewUnixMilliPtr(t *time.Time) *UnixMilliTime { if t == nil { return nil } - return langext.Ptr(UnixMilliTime(*t)) + return new(UnixMilliTime(*t)) } func NowUnixMilli() UnixMilliTime { diff --git a/rfctime/unixNano.go b/rfctime/unixNano.go index 88ef86f..1ad945d 100644 --- a/rfctime/unixNano.go +++ b/rfctime/unixNano.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" "go.mongodb.org/mongo-driver/bson/bsonrw" @@ -93,7 +92,7 @@ func (t UnixNanoTime) MarshalBSONValue() (bsontype.Type, []byte, error) { } func (t UnixNanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if val.Kind() == reflect.Ptr && val.IsNil() { + if val.Kind() == reflect.Pointer && val.IsNil() { if !val.CanSet() { return errors.New("ValueUnmarshalerDecodeValue") } @@ -105,7 +104,7 @@ func (t UnixNanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRea return err } - if val.Kind() == reflect.Ptr && len(src) == 0 { + if val.Kind() == reflect.Pointer && len(src) == 0 { val.Set(reflect.Zero(val.Type())) return nil } @@ -115,7 +114,7 @@ func (t UnixNanoTime) DecodeValue(dc bsoncodec.DecodeContext, vr bsonrw.ValueRea return err } - if val.Kind() == reflect.Ptr { + if val.Kind() == reflect.Pointer { val.Set(reflect.ValueOf(&t)) } else { val.Set(reflect.ValueOf(t)) @@ -251,7 +250,7 @@ func NewUnixNanoPtr(t *time.Time) *UnixNanoTime { if t == nil { return nil } - return langext.Ptr(UnixNanoTime(*t)) + return new(UnixNanoTime(*t)) } func NowUnixNano() UnixNanoTime { diff --git a/sq/builder.go b/sq/builder.go index 95e65cf..613776d 100644 --- a/sq/builder.go +++ b/sq/builder.go @@ -43,7 +43,7 @@ func BuildUpdateStatement[TData any](q Queryable, tableName string, obj TData, i continue } - if rsfield.Type.Kind() == reflect.Ptr && rvfield.IsNil() { + if rsfield.Type.Kind() == reflect.Pointer && rvfield.IsNil() { setClauses = append(setClauses, fmt.Sprintf("%s = NULL", columnName)) @@ -94,7 +94,7 @@ func BuildInsertStatement[TData any](q Queryable, tableName string, obj TData) ( continue } - if rsfield.Type.Kind() == reflect.Ptr && rvfield.IsNil() { + if rsfield.Type.Kind() == reflect.Pointer && rvfield.IsNil() { fields = append(fields, columnName) values = append(values, "NULL") @@ -132,8 +132,8 @@ func BuildInsertMultipleStatement[TData any](q Queryable, tableName string, vArr { columns := make([]string, 0) - for i := 0; i < rtyp.NumField(); i++ { - rsfield := rtyp.Field(i) + for rsfield := range rtyp.Fields() { + rsfield := rsfield if !rsfield.IsExported() { continue @@ -174,7 +174,7 @@ func BuildInsertMultipleStatement[TData any](q Queryable, tableName string, vArr continue } - if rsfield.Type.Kind() == reflect.Ptr && rvfield.IsNil() { + if rsfield.Type.Kind() == reflect.Pointer && rvfield.IsNil() { params = append(params, "NULL") diff --git a/sq/commentTrimmer.go b/sq/commentTrimmer.go index b612ff2..6fa055c 100644 --- a/sq/commentTrimmer.go +++ b/sq/commentTrimmer.go @@ -11,7 +11,7 @@ func fnTrimComments(ctx context.Context, cmdtype string, id *uint16, sql *string res := make([]string, 0) - for _, s := range strings.Split(*sql, "\n") { + for s := range strings.SplitSeq(*sql, "\n") { if strings.HasPrefix(strings.TrimSpace(s), "--") { continue } diff --git a/sq/converter.go b/sq/converter.go index 552daac..9d3a1a3 100644 --- a/sq/converter.go +++ b/sq/converter.go @@ -79,7 +79,7 @@ func convertValueToDB(q Queryable, value any) (any, error) { } } - if value != nil && reflect.TypeOf(value).Kind() == reflect.Ptr { + if value != nil && reflect.TypeOf(value).Kind() == reflect.Pointer { vof := reflect.ValueOf(value) if vof.IsNil() { return nil, nil diff --git a/sq/hasher.go b/sq/hasher.go index c3b78fa..ea6ca24 100644 --- a/sq/hasher.go +++ b/sq/hasher.go @@ -6,8 +6,8 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/jmoiron/sqlx" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/jmoiron/sqlx" "os" "path/filepath" "strings" @@ -186,14 +186,14 @@ func CreateSqliteDatabaseSchemaString(ctx context.Context, db Queryable) (string result = append(result, tableList[i]) } - strBuilderResult := "" + var strBuilderResult strings.Builder for _, vTab := range result { jbinTable, err := json.Marshal(vTab) if err != nil { return "", err } - strBuilderResult += fmt.Sprintf("#TABLE: %s\n{\n", string(jbinTable)) + strBuilderResult.WriteString(fmt.Sprintf("#TABLE: %s\n{\n", string(jbinTable))) for _, vCol := range vTab.ColumnInfo { jbinColumn, err := json.Marshal(vCol) @@ -201,7 +201,7 @@ func CreateSqliteDatabaseSchemaString(ctx context.Context, db Queryable) (string return "", err } - strBuilderResult += fmt.Sprintf(" COLUMN: %s\n", string(jbinColumn)) + strBuilderResult.WriteString(fmt.Sprintf(" COLUMN: %s\n", string(jbinColumn))) } for _, vIdx := range vTab.IndexInfo { @@ -210,7 +210,7 @@ func CreateSqliteDatabaseSchemaString(ctx context.Context, db Queryable) (string return "", err } - strBuilderResult += fmt.Sprintf(" INDEX: %s\n", string(jbinIndex)) + strBuilderResult.WriteString(fmt.Sprintf(" INDEX: %s\n", string(jbinIndex))) } for _, vFky := range vTab.FKeyInfo { @@ -219,11 +219,11 @@ func CreateSqliteDatabaseSchemaString(ctx context.Context, db Queryable) (string return "", err } - strBuilderResult += fmt.Sprintf(" FKEY: %s\n", string(jbinFKey)) + strBuilderResult.WriteString(fmt.Sprintf(" FKEY: %s\n", string(jbinFKey))) } - strBuilderResult += "}\n\n" + strBuilderResult.WriteString("}\n\n") } - return strBuilderResult, nil + return strBuilderResult.String(), nil } diff --git a/sq/list.go b/sq/list.go index 15c9ea2..6c5e7bd 100644 --- a/sq/list.go +++ b/sq/list.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" + "strings" ) func Iterate[TData any](ctx context.Context, q Queryable, table string, filter PaginateFilter, scanMode StructScanMode, scanSec StructScanSafety, page int, limit *int, consumer func(ctx context.Context, v TData) error) (int, error) { @@ -32,12 +33,13 @@ func Iterate[TData any](ctx context.Context, q Queryable, table string, filter P filterCond, joinCond, joinTables := filter.SQL(prepParams) - selectCond := table + ".*" + var selectCond strings.Builder + selectCond.WriteString(table + ".*") for _, v := range joinTables { - selectCond += ", " + v + ".*" + selectCond.WriteString(", " + v + ".*") } - sqlQueryData := "SELECT " + selectCond + " FROM " + table + " " + joinCond + " WHERE ( " + filterCond + " ) " + sortCond + " " + pageCond + sqlQueryData := "SELECT " + selectCond.String() + " FROM " + table + " " + joinCond + " WHERE ( " + filterCond + " ) " + sortCond + " " + pageCond rows, err := q.Query(ctx, sqlQueryData, prepParams) if err != nil { diff --git a/sq/paginate.go b/sq/paginate.go index 7be08a4..fbfd168 100644 --- a/sq/paginate.go +++ b/sq/paginate.go @@ -6,6 +6,7 @@ import ( "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "git.blackforestbytes.com/BlackForestBytes/goext/langext" pag "git.blackforestbytes.com/BlackForestBytes/goext/pagination" + "strings" ) func Paginate[TData any](ctx context.Context, q Queryable, table string, filter PaginateFilter, scanMode StructScanMode, scanSec StructScanSafety, page int, limit *int) ([]TData, pag.Pagination, error) { @@ -34,12 +35,13 @@ func Paginate[TData any](ctx context.Context, q Queryable, table string, filter filterCond, joinCond, joinTables := filter.SQL(prepParams) - selectCond := table + ".*" + var selectCond strings.Builder + selectCond.WriteString(table + ".*") for _, v := range joinTables { - selectCond += ", " + v + ".*" + selectCond.WriteString(", " + v + ".*") } - sqlQueryData := "SELECT " + selectCond + " FROM " + table + " " + joinCond + " WHERE ( " + filterCond + " ) " + sortCond + " " + pageCond + sqlQueryData := "SELECT " + selectCond.String() + " FROM " + table + " " + joinCond + " WHERE ( " + filterCond + " ) " + sortCond + " " + pageCond sqlQueryCount := "SELECT " + "COUNT(*)" + " FROM " + table + " " + joinCond + " WHERE ( " + filterCond + " ) " rows, err := q.Query(ctx, sqlQueryData, prepParams) diff --git a/sq/params.go b/sq/params.go index 68d253f..e4ff32b 100644 --- a/sq/params.go +++ b/sq/params.go @@ -1,5 +1,7 @@ package sq +import "maps" + import "git.blackforestbytes.com/BlackForestBytes/goext/langext" type PP map[string]any @@ -7,9 +9,7 @@ type PP map[string]any func Join(pps ...PP) PP { r := PP{} for _, add := range pps { - for k, v := range add { - r[k] = v - } + maps.Copy(r, add) } return r } @@ -21,9 +21,7 @@ func (pp *PP) Add(v any) string { } func (pp *PP) AddAll(other PP) { - for id, v := range other { - (*pp)[id] = v - } + maps.Copy((*pp), other) } func PPID() string { diff --git a/sq/structscanner.go b/sq/structscanner.go index 59580e6..a9c54c0 100644 --- a/sq/structscanner.go +++ b/sq/structscanner.go @@ -3,9 +3,9 @@ package sq import ( "errors" "fmt" + "git.blackforestbytes.com/BlackForestBytes/goext/langext" "github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx/reflectx" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "reflect" "strings" ) @@ -39,7 +39,7 @@ type ssConverter struct { func (r *StructScanner) Start(dest any) error { v := reflect.ValueOf(dest) - if v.Kind() != reflect.Ptr { + if v.Kind() != reflect.Pointer { return errors.New("must pass a pointer, not a value, to StructScan destination") } @@ -54,7 +54,7 @@ func (r *StructScanner) Start(dest any) error { if f, err := missingFields(r.fields); err != nil && !r.unsafe { return fmt.Errorf("missing destination name %s in %T", columns[f], dest) } - r.values = make([]interface{}, len(columns)) + r.values = make([]any, len(columns)) r.converter = make([]ssConverter, len(columns)) return nil @@ -66,7 +66,7 @@ func (r *StructScanner) Start(dest any) error { func (r *StructScanner) StructScanExt(q Queryable, dest any) error { v := reflect.ValueOf(dest) - if v.Kind() != reflect.Ptr { + if v.Kind() != reflect.Pointer { return errors.New("must pass a pointer, not a value, to StructScan destination") } @@ -177,7 +177,7 @@ func (r *StructScanner) StructScanExt(q Queryable, dest any) error { func (r *StructScanner) StructScanBase(dest any) error { v := reflect.ValueOf(dest) - if v.Kind() != reflect.Ptr { + if v.Kind() != reflect.Pointer { return errors.New("must pass a pointer, not a value, to StructScan destination") } @@ -196,7 +196,7 @@ func (r *StructScanner) StructScanBase(dest any) error { } // fieldsByTraversal forked from github.com/jmoiron/sqlx@v1.3.5/sqlx.go -func fieldsByTraversalExtended(q Queryable, v reflect.Value, traversals [][]int, values []interface{}, converter []ssConverter) error { +func fieldsByTraversalExtended(q Queryable, v reflect.Value, traversals [][]int, values []any, converter []ssConverter) error { v = reflect.Indirect(v) if v.Kind() != reflect.Struct { return errors.New("argument not a struct") @@ -204,7 +204,7 @@ func fieldsByTraversalExtended(q Queryable, v reflect.Value, traversals [][]int, for i, traversal := range traversals { if len(traversal) == 0 { - values[i] = new(interface{}) + values[i] = new(any) continue } f := reflectx.FieldByIndexes(v, traversal) @@ -243,7 +243,7 @@ func fieldsByTraversalExtended(q Queryable, v reflect.Value, traversals [][]int, } // fieldsByTraversal forked from github.com/jmoiron/sqlx@v1.3.5/sqlx.go -func fieldsByTraversalBase(v reflect.Value, traversals [][]int, values []interface{}, ptrs bool) error { +func fieldsByTraversalBase(v reflect.Value, traversals [][]int, values []any, ptrs bool) error { v = reflect.Indirect(v) if v.Kind() != reflect.Struct { return errors.New("argument not a struct") @@ -251,7 +251,7 @@ func fieldsByTraversalBase(v reflect.Value, traversals [][]int, values []interfa for i, traversal := range traversals { if len(traversal) == 0 { - values[i] = new(interface{}) + values[i] = new(any) continue } f := reflectx.FieldByIndexes(v, traversal) diff --git a/sq/transaction.go b/sq/transaction.go index da1ccd1..143073a 100644 --- a/sq/transaction.go +++ b/sq/transaction.go @@ -3,9 +3,8 @@ package sq import ( "context" "database/sql" - "github.com/jmoiron/sqlx" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "github.com/jmoiron/sqlx" "time" ) @@ -111,7 +110,7 @@ func (tx *transaction) Exec(ctx context.Context, sqlstr string, prep PP) (sql.Re preMeta := PreExecMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext} for _, v := range tx.db.lstr { - err := v.PreExec(ctx, langext.Ptr(tx.id), &sqlstr, &prep, preMeta) + err := v.PreExec(ctx, new(tx.id), &sqlstr, &prep, preMeta) if err != nil { return nil, exerr.Wrap(err, "failed to call SQL pre-exec listener").Int("tx.id", int(tx.id)).Str("original_sql", origsql).Str("sql", sqlstr).Any("sql_params", prep).Build() } @@ -128,7 +127,7 @@ func (tx *transaction) Exec(ctx context.Context, sqlstr string, prep PP) (sql.Re postMeta := PostExecMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()} for _, v := range tx.db.lstr { - v.PostExec(langext.Ptr(tx.id), origsql, sqlstr, prep, err, postMeta) + v.PostExec(new(tx.id), origsql, sqlstr, prep, err, postMeta) } if err != nil { @@ -144,7 +143,7 @@ func (tx *transaction) Query(ctx context.Context, sqlstr string, prep PP) (*sqlx preMeta := PreQueryMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext} for _, v := range tx.db.lstr { - err := v.PreQuery(ctx, langext.Ptr(tx.id), &sqlstr, &prep, preMeta) + err := v.PreQuery(ctx, new(tx.id), &sqlstr, &prep, preMeta) if err != nil { return nil, exerr.Wrap(err, "failed to call SQL pre-query listener").Int("tx.id", int(tx.id)).Str("original_sql", origsql).Str("sql", sqlstr).Any("sql_params", prep).Build() } @@ -161,7 +160,7 @@ func (tx *transaction) Query(ctx context.Context, sqlstr string, prep PP) (*sqlx postMeta := PostQueryMeta{Context: ctx, TransactionConstructorContext: tx.constructorContext, Init: t0, Start: t1, End: time.Now()} for _, v := range tx.db.lstr { - v.PostQuery(langext.Ptr(tx.id), origsql, sqlstr, prep, err, postMeta) + v.PostQuery(new(tx.id), origsql, sqlstr, prep, err, postMeta) } if err != nil { diff --git a/syncext/channel.go b/syncext/channel.go index f5b1ac3..839a486 100644 --- a/syncext/channel.go +++ b/syncext/channel.go @@ -1,7 +1,8 @@ package syncext import ( - "golang.org/x/net/context" + context0 "context" + "time" ) @@ -27,7 +28,7 @@ func WriteChannelWithTimeout[T any](c chan T, msg T, timeout time.Duration) bool } } -func WriteChannelWithContext[T any](ctx context.Context, c chan T, msg T) error { +func WriteChannelWithContext[T any](ctx context0.Context, c chan T, msg T) error { select { case c <- msg: return nil diff --git a/timeext/range.go b/timeext/range.go index e284e45..64f5372 100644 --- a/timeext/range.go +++ b/timeext/range.go @@ -44,15 +44,15 @@ func NewOpenTimeRange(from *time.Time, to *time.Time) *OpenTimeRange { } } -func (r OpenTimeRange) ToMongoPipeline(key string) []interface{} { - type bsonM map[string]interface{} +func (r OpenTimeRange) ToMongoPipeline(key string) []any { + type bsonM map[string]any type bsonE struct { Key string - Value interface{} + Value any } type bsonD []bsonE - pipeline := make([]interface{}, 0) + pipeline := make([]any, 0) if r.From != nil { pipeline = append(pipeline, bsonD{{Key: "$match", Value: bsonM{key: bsonM{"$ne": nil, "$gt": r.From}}}}) @@ -64,7 +64,7 @@ func (r OpenTimeRange) ToMongoPipeline(key string) []interface{} { return pipeline } -func (r *OpenTimeRange) AppendToMongoPipeline(pipeline []interface{}, key string) []interface{} { +func (r *OpenTimeRange) AppendToMongoPipeline(pipeline []any, key string) []any { if r == nil { return pipeline } diff --git a/timeext/weekcount.go b/timeext/weekcount.go index 8bacd8c..4a41315 100644 --- a/timeext/weekcount.go +++ b/timeext/weekcount.go @@ -51,10 +51,7 @@ func GetIsoWeekCount(year int) int { w2 -= 1 w3 -= 1 - w := w1 - if w2 > w { - w = w2 - } + w := max(w2, w1) if w3 > w { w = w3 } diff --git a/tst/assertions.go b/tst/assertions.go index 02248e0..3fb0fdf 100644 --- a/tst/assertions.go +++ b/tst/assertions.go @@ -21,7 +21,7 @@ func AssertArrayEqual[T comparable](t *testing.T, actual []T, expected []T) { t.Errorf("values differ: Actual: '%v', Expected: '%v' (len %d <> %d)", actual, expected, len(actual), len(expected)) return } - for i := 0; i < len(actual); i++ { + for i := range actual { if actual[i] != expected[i] { t.Errorf("values differ: Actual: '%v', Expected: '%v' (at index %d)", actual, expected, i) return diff --git a/wmo/collection.go b/wmo/collection.go index 7d0c2f8..6fb6fd2 100644 --- a/wmo/collection.go +++ b/wmo/collection.go @@ -2,11 +2,11 @@ package wmo import ( "context" - "go.mongodb.org/mongo-driver/bson/bsontype" - "go.mongodb.org/mongo-driver/mongo" ct "git.blackforestbytes.com/BlackForestBytes/goext/cursortoken" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "go.mongodb.org/mongo-driver/bson/bsontype" + "go.mongodb.org/mongo-driver/mongo" "reflect" ) @@ -80,7 +80,7 @@ func (c *Coll[TData]) WithDecodeFunc(cdf func(ctx context.Context, dec Decodable c.EnsureInitializedReflection(example) - c.customDecoder = langext.Ptr(cdf) + c.customDecoder = new(cdf) return c } diff --git a/wmo/queryInsert.go b/wmo/queryInsert.go index 26be43a..28d007a 100644 --- a/wmo/queryInsert.go +++ b/wmo/queryInsert.go @@ -2,10 +2,10 @@ package wmo import ( "context" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" "git.blackforestbytes.com/BlackForestBytes/goext/exerr" "git.blackforestbytes.com/BlackForestBytes/goext/langext" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" ) func (c *Coll[TData]) InsertOne(ctx context.Context, valueIn TData) (TData, error) { @@ -41,7 +41,7 @@ func (c *Coll[TData]) InsertOneUnchecked(ctx context.Context, valueIn any) (TDat func (c *Coll[TData]) InsertMany(ctx context.Context, valueIn []TData) (*mongo.InsertManyResult, error) { for _, hook := range c.marshalHooks { - for i := 0; i < len(valueIn); i++ { + for i := range valueIn { valueIn[i] = hook(valueIn[i]) } } diff --git a/wmo/reflection.go b/wmo/reflection.go index ac2c275..e028c1e 100644 --- a/wmo/reflection.go +++ b/wmo/reflection.go @@ -34,7 +34,7 @@ func (c *Coll[TData]) init() { example := *new(TData) - datatype := reflect.TypeOf(&example).Elem() + datatype := reflect.TypeFor[TData]() if datatype.Kind() == reflect.Interface { diff --git a/wmo/reflection_test.go b/wmo/reflection_test.go index 889942f..f516caf 100644 --- a/wmo/reflection_test.go +++ b/wmo/reflection_test.go @@ -6,7 +6,6 @@ import ( "testing" "time" - "git.blackforestbytes.com/BlackForestBytes/goext/langext" "git.blackforestbytes.com/BlackForestBytes/goext/rfctime" "git.blackforestbytes.com/BlackForestBytes/goext/timeext" "git.blackforestbytes.com/BlackForestBytes/goext/tst" @@ -54,7 +53,7 @@ func TestReflectionGetFieldType(t *testing.T) { A: "4", }, Str: "3", - Ptr: langext.Ptr(4), + Ptr: new(4), MDate: t1, ODate: nil, } @@ -208,7 +207,7 @@ func TestReflectionGetFieldValueAsTokenString(t *testing.T) { A: "2", }, Str: "3", - Ptr: langext.Ptr(4), + Ptr: new(4), Num: 22, FFF: 22.5, Ptr2: nil, @@ -239,8 +238,7 @@ func TestReflectionWithInterface(t *testing.T) { CDate time.Time `bson:"cdate"` } - type TestInterface interface { - } + type TestInterface any coll1 := W[TestInterface](&mongo.Collection{}) @@ -256,6 +254,6 @@ func TestReflectionWithInterface(t *testing.T) { tst.AssertTrue(t, coll2.coll != nil) tst.AssertEqual(t, 1, len(coll2.implDataTypeMap)) - tst.AssertEqual(t, "ID", coll2.implDataTypeMap[reflect.TypeOf(TestData{})]["_id"].Name) - tst.AssertEqual(t, "CDate", coll2.implDataTypeMap[reflect.TypeOf(TestData{})]["cdate"].Name) + tst.AssertEqual(t, "ID", coll2.implDataTypeMap[reflect.TypeFor[TestData]()]["_id"].Name) + tst.AssertEqual(t, "CDate", coll2.implDataTypeMap[reflect.TypeFor[TestData]()]["cdate"].Name) } diff --git a/wpdf/wpdfCell.go b/wpdf/wpdfCell.go index 79760ac..65e6842 100644 --- a/wpdf/wpdfCell.go +++ b/wpdf/wpdfCell.go @@ -95,12 +95,12 @@ func (opt *PDFCellOpt) FontSize(v float64) *PDFCellOpt { } func (opt *PDFCellOpt) Bold() *PDFCellOpt { - opt.fontStyleOverride = langext.Ptr(Bold) + opt.fontStyleOverride = new(Bold) return opt } func (opt *PDFCellOpt) Italic() *PDFCellOpt { - opt.fontStyleOverride = langext.Ptr(Italic) + opt.fontStyleOverride = new(Italic) return opt } @@ -125,32 +125,32 @@ func (opt *PDFCellOpt) AutoWidthPaddingX(v float64) *PDFCellOpt { } func (opt *PDFCellOpt) TextColor(cr, cg, cb int) *PDFCellOpt { - opt.textColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.textColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFCellOpt) TextColorHex(c uint32) *PDFCellOpt { - opt.textColor = langext.Ptr(hexToColor(c)) + opt.textColor = new(hexToColor(c)) return opt } func (opt *PDFCellOpt) BorderColor(cr, cg, cb int) *PDFCellOpt { - opt.borderColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.borderColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFCellOpt) BorderColorHex(c uint32) *PDFCellOpt { - opt.borderColor = langext.Ptr(hexToColor(c)) + opt.borderColor = new(hexToColor(c)) return opt } func (opt *PDFCellOpt) FillColor(cr, cg, cb int) *PDFCellOpt { - opt.fillColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.fillColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFCellOpt) FillColorHex(c uint32) *PDFCellOpt { - opt.fillColor = langext.Ptr(hexToColor(c)) + opt.fillColor = new(hexToColor(c)) return opt } @@ -248,7 +248,7 @@ func (b *WPDFBuilder) Cell(txt string, opts ...*PDFCellOpt) { if height == nil { // (do after SetFont, so that b.cellHeight is correctly set to fontOverride) - height = langext.Ptr(b.cellHeight + b.cellSpacing) + height = new(b.cellHeight + b.cellSpacing) } if textColor != nil { diff --git a/wpdf/wpdfLine.go b/wpdf/wpdfLine.go index 982ff9d..0e18cdf 100644 --- a/wpdf/wpdfLine.go +++ b/wpdf/wpdfLine.go @@ -23,12 +23,12 @@ func (opt *PDFLineOpt) LineWidth(v float64) *PDFLineOpt { } func (opt *PDFLineOpt) DrawColor(cr, cg, cb int) *PDFLineOpt { - opt.drawColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.drawColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFLineOpt) DrawColorHex(c uint32) *PDFLineOpt { - opt.drawColor = langext.Ptr(hexToColor(c)) + opt.drawColor = new(hexToColor(c)) return opt } @@ -38,17 +38,17 @@ func (opt *PDFLineOpt) Alpha(alpha float64, blendMode PDFBlendMode) *PDFLineOpt } func (opt *PDFLineOpt) CapButt() *PDFLineOpt { - opt.capStyle = langext.Ptr(CapButt) + opt.capStyle = new(CapButt) return opt } func (opt *PDFLineOpt) CapSquare() *PDFLineOpt { - opt.capStyle = langext.Ptr(CapSquare) + opt.capStyle = new(CapSquare) return opt } func (opt *PDFLineOpt) CapRound() *PDFLineOpt { - opt.capStyle = langext.Ptr(CapRound) + opt.capStyle = new(CapRound) return opt } diff --git a/wpdf/wpdfMultiCell.go b/wpdf/wpdfMultiCell.go index 74e99e3..6d8ebb0 100644 --- a/wpdf/wpdfMultiCell.go +++ b/wpdf/wpdfMultiCell.go @@ -75,12 +75,12 @@ func (opt *PDFMultiCellOpt) FontSize(v float64) *PDFMultiCellOpt { } func (opt *PDFMultiCellOpt) Bold() *PDFMultiCellOpt { - opt.fontStyleOverride = langext.Ptr(Bold) + opt.fontStyleOverride = new(Bold) return opt } func (opt *PDFMultiCellOpt) Italic() *PDFMultiCellOpt { - opt.fontStyleOverride = langext.Ptr(Italic) + opt.fontStyleOverride = new(Italic) return opt } @@ -95,32 +95,32 @@ func (opt *PDFMultiCellOpt) X(v float64) *PDFMultiCellOpt { } func (opt *PDFMultiCellOpt) TextColor(cr, cg, cb int) *PDFMultiCellOpt { - opt.textColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.textColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFMultiCellOpt) TextColorHex(c uint32) *PDFMultiCellOpt { - opt.textColor = langext.Ptr(hexToColor(c)) + opt.textColor = new(hexToColor(c)) return opt } func (opt *PDFMultiCellOpt) BorderColor(cr, cg, cb int) *PDFMultiCellOpt { - opt.borderColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.borderColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFMultiCellOpt) BorderColorHex(c uint32) *PDFMultiCellOpt { - opt.borderColor = langext.Ptr(hexToColor(c)) + opt.borderColor = new(hexToColor(c)) return opt } func (opt *PDFMultiCellOpt) FillColor(cr, cg, cb int) *PDFMultiCellOpt { - opt.fillColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.fillColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFMultiCellOpt) FillColorHex(c uint32) *PDFMultiCellOpt { - opt.fillColor = langext.Ptr(hexToColor(c)) + opt.fillColor = new(hexToColor(c)) return opt } diff --git a/wpdf/wpdfRect.go b/wpdf/wpdfRect.go index 4b3ae4d..4e5edea 100644 --- a/wpdf/wpdfRect.go +++ b/wpdf/wpdfRect.go @@ -39,22 +39,22 @@ func (opt *PDFRectOpt) LineWidth(v float64) *PDFRectOpt { } func (opt *PDFRectOpt) DrawColor(cr, cg, cb int) *PDFRectOpt { - opt.drawColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.drawColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFRectOpt) DrawColorHex(c uint32) *PDFRectOpt { - opt.drawColor = langext.Ptr(hexToColor(c)) + opt.drawColor = new(hexToColor(c)) return opt } func (opt *PDFRectOpt) FillColor(cr, cg, cb int) *PDFRectOpt { - opt.fillColor = langext.Ptr(rgbToColor(cr, cg, cb)) + opt.fillColor = new(rgbToColor(cr, cg, cb)) return opt } func (opt *PDFRectOpt) FillColorHex(c uint32) *PDFRectOpt { - opt.fillColor = langext.Ptr(hexToColor(c)) + opt.fillColor = new(hexToColor(c)) return opt } diff --git a/wpdf/wpdfTable.go b/wpdf/wpdfTable.go index e2fea19..a1ccfb1 100644 --- a/wpdf/wpdfTable.go +++ b/wpdf/wpdfTable.go @@ -339,7 +339,7 @@ func defaultTableStyle() *TableCellStyleOpt { FillColorHex(uint32(0xF0F0F0)). TextColorHex(uint32(0x000000)). FillBackground(true), - minWidth: langext.Ptr(float64(5)), + minWidth: new(float64(5)), ellipsize: langext.PTrue, multiCell: langext.PFalse, } diff --git a/wpdf/wpdfTableCell.go b/wpdf/wpdfTableCell.go index f0e7345..0dc4e6b 100644 --- a/wpdf/wpdfTableCell.go +++ b/wpdf/wpdfTableCell.go @@ -117,12 +117,12 @@ func (o *TableCellStyleOpt) FontSize(v float64) *TableCellStyleOpt { } func (o *TableCellStyleOpt) Bold() *TableCellStyleOpt { - o.PDFCellOpt.fontStyleOverride = langext.Ptr(Bold) + o.PDFCellOpt.fontStyleOverride = new(Bold) return o } func (o *TableCellStyleOpt) Italic() *TableCellStyleOpt { - o.PDFCellOpt.fontStyleOverride = langext.Ptr(Italic) + o.PDFCellOpt.fontStyleOverride = new(Italic) return o } @@ -147,32 +147,32 @@ func (o *TableCellStyleOpt) AutoWidthPaddingX(v float64) *TableCellStyleOpt { } func (o *TableCellStyleOpt) TextColor(cr, cg, cb int) *TableCellStyleOpt { - o.PDFCellOpt.textColor = langext.Ptr(rgbToColor(cr, cg, cb)) + o.PDFCellOpt.textColor = new(rgbToColor(cr, cg, cb)) return o } func (o *TableCellStyleOpt) TextColorHex(c uint32) *TableCellStyleOpt { - o.PDFCellOpt.textColor = langext.Ptr(hexToColor(c)) + o.PDFCellOpt.textColor = new(hexToColor(c)) return o } func (o *TableCellStyleOpt) BorderColor(cr, cg, cb int) *TableCellStyleOpt { - o.PDFCellOpt.borderColor = langext.Ptr(rgbToColor(cr, cg, cb)) + o.PDFCellOpt.borderColor = new(rgbToColor(cr, cg, cb)) return o } func (o *TableCellStyleOpt) BorderColorHex(c uint32) *TableCellStyleOpt { - o.PDFCellOpt.borderColor = langext.Ptr(hexToColor(c)) + o.PDFCellOpt.borderColor = new(hexToColor(c)) return o } func (o *TableCellStyleOpt) FillColor(cr, cg, cb int) *TableCellStyleOpt { - o.PDFCellOpt.fillColor = langext.Ptr(rgbToColor(cr, cg, cb)) + o.PDFCellOpt.fillColor = new(rgbToColor(cr, cg, cb)) return o } func (o *TableCellStyleOpt) FillColorHex(c uint32) *TableCellStyleOpt { - o.PDFCellOpt.fillColor = langext.Ptr(hexToColor(c)) + o.PDFCellOpt.fillColor = new(hexToColor(c)) return o } diff --git a/wpdf/wpdf_test.go b/wpdf/wpdf_test.go index a001291..f229910 100644 --- a/wpdf/wpdf_test.go +++ b/wpdf/wpdf_test.go @@ -50,7 +50,7 @@ func TestPDFBuilder(t *testing.T) { TextColorHex(uint32(0x000000)). Align(AlignHorzCenter). Bold(), - minWidth: langext.Ptr(float64(5)), + minWidth: new(float64(5)), ellipsize: langext.PTrue, multiCell: langext.PFalse, } @@ -63,7 +63,7 @@ func TestPDFBuilder(t *testing.T) { FillColorHex(uint32(0xC060C0)). FillBackground(true). TextColorHex(uint32(0x000000)), - minWidth: langext.Ptr(float64(5)), + minWidth: new(float64(5)), ellipsize: langext.PFalse, multiCell: langext.PTrue, }