From 5e05089fe0b53e50c5f44239e4602f5c20e92860 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 8 Sep 2025 00:23:23 +0800 Subject: [PATCH 01/43] chore: set version from build info main version --- version/version.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/version/version.go b/version/version.go index 858709f..a5f89d5 100644 --- a/version/version.go +++ b/version/version.go @@ -35,6 +35,9 @@ func init() { } mainPath = bi.Main.Path + if v := bi.Main.Version; v != "" { + version = v + } for i := range bi.Settings { setting := bi.Settings[i] From 3b2b861d63e0e59beed6915d81d0f0f7ab929b7e Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 8 Sep 2025 00:30:53 +0800 Subject: [PATCH 02/43] feat: add embedded version string and getter --- funk.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/funk.go b/funk.go index 0675bbe..2af09a9 100644 --- a/funk.go +++ b/funk.go @@ -1,12 +1,21 @@ package funk import ( + _ "embed" + "reflect" "unsafe" "golang.org/x/exp/constraints" ) +//go:embed .version +var version string + +func GetReleaseVersion() string { + return version +} + func AppendOf[T any](v T, vv ...T) []T { return append(append(make([]T, 0, len(vv)+1), v), vv...) } From e947b5d43e65fd9b87f9b6c796e873d5fce365ba Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 8 Sep 2025 00:54:32 +0800 Subject: [PATCH 03/43] refactor(log): improve logger copying and deprecate WithEvent --- log/aaa.go | 2 ++ log/context.go | 2 +- log/event.go | 6 ++++++ log/impl.log.go | 11 +++++++++-- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/log/aaa.go b/log/aaa.go index c4468d6..ed45f4b 100644 --- a/log/aaa.go +++ b/log/aaa.go @@ -18,6 +18,8 @@ type Logger interface { WithName(name string) Logger WithFields(m Map) Logger WithCallerSkip(skip int) Logger + + // WithEvent Deprecated, use WithFields instead WithEvent(evt *Event) Logger WithLevel(lvl Level) Logger diff --git a/log/context.go b/log/context.go index 6b2ffde..be5ef22 100644 --- a/log/context.go +++ b/log/context.go @@ -28,7 +28,7 @@ func GetFromCtx(ctx context.Context, loggers ...Logger) Logger { return defaultLog } -func CreateCtxWithLogger(ctx context.Context, ll Logger) context.Context { +func CreateCtx(ctx context.Context, ll Logger) context.Context { if ll == nil || ctx == nil { panic("ctx or log param is nil") } diff --git a/log/event.go b/log/event.go index 823be72..4f66e72 100644 --- a/log/event.go +++ b/log/event.go @@ -60,6 +60,12 @@ func GetEventBuf(evt *Event) []byte { return append(convertEvent(evt).buf, '}') } +func cloneEvent(target *Event) *Event { + newTarget := zerolog.Dict() + convertEvent(newTarget).buf = bytes.Clone(convertEvent(target).buf) + return newTarget +} + func mergeEvent(target *Event, from ...*Event) *Event { if len(from) == 0 { return target diff --git a/log/impl.log.go b/log/impl.log.go index eadb07d..11fce24 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -3,6 +3,7 @@ package log import ( "context" "fmt" + "maps" "strings" "github.com/rs/zerolog" @@ -194,8 +195,14 @@ func (l *loggerImpl) enabled(ctx context.Context, lvl zerolog.Level) bool { } func (l *loggerImpl) copy() *loggerImpl { - log := *l - return &log + return &loggerImpl{ + log: l.log, + content: cloneEvent(l.content), + fields: maps.Clone(l.fields), + lvl: l.lvl, + name: l.name, + callerSkip: l.callerSkip, + } } func (l *loggerImpl) getLog() *zerolog.Logger { From 7c0a4374a1708e6eccb343640488aecc3df36261 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 8 Sep 2025 01:09:57 +0800 Subject: [PATCH 04/43] fix: barry quick fix, 2025-09-08 01:09:57 --- .version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .version diff --git a/.version b/.version new file mode 100644 index 0000000..a1b3dc7 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +v0.5.69 \ No newline at end of file From 54bd37319e3a8d1b6adecd15dcda9880484f135e Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 12 Sep 2025 23:58:36 +0800 Subject: [PATCH 05/43] fix: barry quick fix, 2025-09-12 23:58:36 --- assert/assert.go | 13 +++++- assert/assert_test.go | 4 -- assert/util.go | 19 ++++---- config/config.go | 12 ++--- errors/errinter/color_name.go | 36 --------------- errors/errinter/colorfield.go | 36 +++++++++++++++ errors/errinter/utils.go | 55 +++++++++++------------ errors/errinter/z_util_test.go | 41 +++++++++++++++++ errors/errors.go | 21 +-------- funk.go | 4 -- go.mod | 2 +- recovery/recovery.go | 4 +- stack/util.go | 17 +++++++ vars/vars.go | 81 ++++++++++++++++++++++------------ vars/z_test.go | 21 +++++++++ 15 files changed, 225 insertions(+), 141 deletions(-) delete mode 100644 errors/errinter/color_name.go create mode 100644 errors/errinter/colorfield.go create mode 100644 errors/errinter/z_util_test.go create mode 100644 stack/util.go create mode 100644 vars/z_test.go diff --git a/assert/assert.go b/assert/assert.go index 07db5ce..985e1cd 100644 --- a/assert/assert.go +++ b/assert/assert.go @@ -2,9 +2,10 @@ package assert import ( "fmt" -) -var EnablePrintStack bool + "github.com/google/go-cmp/cmp" + "github.com/k0kubun/pp/v3" +) func Assert(b bool, format string, a ...interface{}) { if b { @@ -12,6 +13,14 @@ func Assert(b bool, format string, a ...interface{}) { } } +func MustEqual[T any](a, b T) { + if !cmp.Equal(a, b) { + pp.Println("a: ", a) + pp.Println("b: ", b) + must(fmt.Errorf("a,b not equal")) + } +} + func If(b bool, format string, a ...interface{}) { if b { must(fmt.Errorf(format, a...)) diff --git a/assert/assert_test.go b/assert/assert_test.go index dc12731..f6bf99b 100644 --- a/assert/assert_test.go +++ b/assert/assert_test.go @@ -7,10 +7,6 @@ import ( "github.com/pubgo/funk/recovery" ) -func init() { - assert.EnablePrintStack = true -} - func TestCheckNil(t *testing.T) { var a *int diff --git a/assert/util.go b/assert/util.go index 6db7507..6f0fc70 100644 --- a/assert/util.go +++ b/assert/util.go @@ -3,9 +3,10 @@ package assert import ( "fmt" "log/slog" + "reflect" "runtime/debug" - "github.com/pubgo/funk/stack" + "github.com/k0kubun/pp/v3" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { @@ -17,10 +18,9 @@ func messageFromMsgAndArgs(msgAndArgs ...any) string { if msgAsStr, ok := msgAndArgs[0].(string); ok { return msgAsStr } - return fmt.Sprintf("%+v", msgAndArgs[0]) } - return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + return pp.Sprint(msgAndArgs...) } func must(err error, messageArgs ...any) { @@ -32,15 +32,12 @@ func must(err error, messageArgs ...any) { if message == "" { message = err.Error() } else { - message = fmt.Sprintf("msg:%s err:%s", message, err.Error()) + message = fmt.Sprintf("msg:%v err:%s", message, err.Error()) } - if EnablePrintStack { - slog.Error(message) - debug.PrintStack() - } - - panic(message) + slog.Error(message) + debug.PrintStack() + panic(err) } func try(fn func() error) (gErr error) { @@ -51,7 +48,7 @@ func try(fn func() error) (gErr error) { defer func() { if gErr != nil { - gErr = fmt.Errorf("stack:%s, err:%w", stack.CallerWithFunc(fn).String(), gErr) + gErr = fmt.Errorf("stack:%s, err:%w", reflect.TypeOf(fn).String(), gErr) } }() diff --git a/config/config.go b/config/config.go index 52bd4b0..c8f20af 100644 --- a/config/config.go +++ b/config/config.go @@ -36,11 +36,13 @@ var ( ) func init() { - vars.RegisterValue("config", map[string]any{ - "config_type": defaultConfigType, - "config_name": defaultConfigName, - "config_path": configPath, - "config_dir": configDir, + vars.Register("config", func() any { + return map[string]any{ + "config_type": defaultConfigType, + "config_name": defaultConfigName, + "config_path": configPath, + "config_dir": configDir, + } }) } diff --git a/errors/errinter/color_name.go b/errors/errinter/color_name.go deleted file mode 100644 index c360bf6..0000000 --- a/errors/errinter/color_name.go +++ /dev/null @@ -1,36 +0,0 @@ -package errinter - -import ( - "strings" - - "github.com/pubgo/funk/internal/color" -) - -var width = 11 - -func Get(name string) string { - if width-len(name) < 0 { - return name - } - return strings.Repeat(" ", width-len(name)) + name -} - -var ( - ColorKind = color.Green.Str(Get("kind")) - ColorMsg = color.Green.Str(Get("msg")) - ColorService = color.Green.Str(Get("service")) - ColorOperation = color.Green.Str(Get("operation")) - ColorId = color.Green.Str(Get("id")) - ColorDetail = color.Green.Str(Get("detail")) - ColorTags = color.Green.Str(Get("tags")) - ColorErrMsg = color.Red.Str(Get("err_msg")) - ColorErrDetail = color.Red.Str(Get("err_detail")) - ColorCaller = color.Green.Str(Get("caller")) - ColorCode = color.Green.Str(Get("code")) - ColorMessage = color.Green.Str(Get("message")) - ColorBiz = color.Green.Str(Get("biz_code")) - ColorStatusCode = color.Green.Str(Get("status_code")) - ColorName = color.Green.Str(Get("name")) - ColorStack = color.Green.Str(Get("stack")) - ColorVersion = color.Green.Str(Get("version")) -) diff --git a/errors/errinter/colorfield.go b/errors/errinter/colorfield.go new file mode 100644 index 0000000..823625e --- /dev/null +++ b/errors/errinter/colorfield.go @@ -0,0 +1,36 @@ +package errinter + +import ( + "strings" + + "github.com/pubgo/funk/internal/color" +) + +var width = 11 + +func getColorErrField(name string) string { + if width-len(name) < 0 { + return name + } + return strings.Repeat(" ", width-len(name)) + name +} + +var ( + ColorKind = color.Green.Str(getColorErrField("kind")) + ColorMsg = color.Green.Str(getColorErrField("msg")) + ColorService = color.Green.Str(getColorErrField("service")) + ColorOperation = color.Green.Str(getColorErrField("operation")) + ColorId = color.Green.Str(getColorErrField("id")) + ColorDetail = color.Green.Str(getColorErrField("detail")) + ColorTags = color.Green.Str(getColorErrField("tags")) + ColorErrMsg = color.Red.Str(getColorErrField("err_msg")) + ColorErrDetail = color.Red.Str(getColorErrField("err_detail")) + ColorCaller = color.Green.Str(getColorErrField("caller")) + ColorCode = color.Green.Str(getColorErrField("code")) + ColorMessage = color.Green.Str(getColorErrField("message")) + ColorBiz = color.Green.Str(getColorErrField("biz_code")) + ColorStatusCode = color.Green.Str(getColorErrField("status_code")) + ColorName = color.Green.Str(getColorErrField("name")) + ColorStack = color.Green.Str(getColorErrField("stack")) + ColorVersion = color.Green.Str(getColorErrField("version")) +) diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index e407a67..8335571 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -5,10 +5,10 @@ import ( "errors" "fmt" "os" - "strings" "sync" "github.com/k0kubun/pp/v3" + "github.com/rs/xid" "github.com/rs/zerolog/log" "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" @@ -18,7 +18,6 @@ import ( "github.com/pubgo/funk" "github.com/pubgo/funk/log/logutil" - "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/proto/errorpb" ) @@ -36,38 +35,19 @@ func ParseError(val interface{}) error { return errors.New(v) case []byte: return errors.New(string(v)) + case proto.Message: + return errors.New(prototext.Format(v)) default: - return errors.New(SimplePrint(v)) + return errors.New(errPretty().Sprint(v)) } } -var Simple = sync.OnceValue(func() *pp.PrettyPrinter { - printer := pp.New() - printer.SetColoringEnabled(false) - printer.SetExportedOnly(false) - printer.SetOmitEmpty(true) - printer.SetMaxDepth(3) - return printer -}) - -func SimplePrint(v interface{}) string { - return strings.ReplaceAll(Simple().Sprint(v), "\n", "") -} - func GetErrorId(err error) string { - if err == nil { - return "" - } - - for err != nil { - if v, ok := err.(Error); ok { - return v.ID() - } - - err = Unwrap(err) + if v, ok := lo.ErrorsAs[Error](err); ok && v != nil { + return v.ID() } - return "" + return xid.New().String() } func Unwrap(err error) error { @@ -103,8 +83,7 @@ func Debug(err error) { return } - pretty.SetDefaultMaxDepth(20) - pretty.Println(err) + Console().Println(err) } func MustTagsToAny(tags ...*errorpb.Tag) []*anypb.Any { @@ -171,3 +150,21 @@ func MustProtoToAny(p proto.Message) *anypb.Any { return pb } + +var errPretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(3) + return printer +}) + +var Console = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(true) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) diff --git a/errors/errinter/z_util_test.go b/errors/errinter/z_util_test.go new file mode 100644 index 0000000..239e518 --- /dev/null +++ b/errors/errinter/z_util_test.go @@ -0,0 +1,41 @@ +package errinter_test + +import ( + "context" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/encoding/prototext" + + "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errinter" + "github.com/pubgo/funk/proto/errorpb" +) + +func TestGetErrorId(t *testing.T) { + err := errors.New("test error id") + pbTxt := prototext.Format(errinter.ParseErrToPb(err)) + errId := errinter.GetErrorId(err) + assert.NotEmpty(t, errId) + assert.Contains(t, pbTxt, errId) +} + +func TestParseError(t *testing.T) { + assert.Equal(t, errinter.ParseError(nil), nil) + assert.Equal(t, errinter.ParseError("hello").Error(), "hello") + assert.Equal(t, errinter.ParseError(fmt.Errorf("err test")).Error(), "err test") + + errMsg := errinter.ParseError(prototext.Format(errinter.MustProtoToAny(&errorpb.ErrMsg{Msg: "test msg error"}))).Error() + assert.Equal(t, + strings.ReplaceAll(errMsg, " ", " "), + "[type.googleapis.com/errors.ErrMsg]: {\n msg: \"test msg error\"\n}\n", + ) + + ctx := context.WithValue(context.Background(), "hello", "world") + assert.Equal(t, + errinter.ParseError(ctx).Error(), + "&context.valueCtx{\n Context: context.backgroundCtx{},\n key: \"hello\",\n val: \"world\",\n}", + ) +} diff --git a/errors/errors.go b/errors/errors.go index 1f8768c..0c83112 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -73,26 +73,7 @@ func UnwrapEach(err error, call func(e error) bool) { func AsA[T any](err error) (*T, bool) { var target T - val := reflect.ValueOf(&target) - typ := val.Type() - if typ.Kind() != reflect.Ptr || val.IsNil() { - panic("errors: target must be a non-nil pointer") - } - - targetType := typ.Elem() - for err != nil { - if reflect.TypeOf(err).AssignableTo(targetType) { - val.Elem().Set(reflect.ValueOf(err)) - return &target, true - } - - if x, ok := err.(ErrAs); ok && x.As(&target) { - return &target, true - } - - err = Unwrap(err) - } - return &target, false + return &target, As(err, &target) } func As(err error, target any) bool { diff --git a/funk.go b/funk.go index 2af09a9..dee96da 100644 --- a/funk.go +++ b/funk.go @@ -165,10 +165,6 @@ func IsNil(err interface{}) bool { } v := reflect.ValueOf(err) - if !v.IsValid() { - return true - } - switch v.Kind() { case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.UnsafePointer, reflect.Slice, reflect.Interface: return v.IsNil() diff --git a/go.mod b/go.mod index fa4733f..53a867b 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/ettle/strcase v0.2.0 github.com/expr-lang/expr v1.17.5 github.com/goccy/go-json v0.10.2 + github.com/google/go-cmp v0.6.0 github.com/gopherjs/gopherjs v1.17.2 github.com/hashicorp/go-version v1.6.0 github.com/huandu/go-clone v1.5.1 @@ -90,7 +91,6 @@ require ( github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.13.0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect diff --git a/recovery/recovery.go b/recovery/recovery.go index a2b982e..132f81a 100644 --- a/recovery/recovery.go +++ b/recovery/recovery.go @@ -5,8 +5,8 @@ import ( "runtime/debug" "testing" - "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors/errinter" + "github.com/samber/lo" ) func Err(gErr *error, callbacks ...func(err error) error) { @@ -44,7 +44,7 @@ func Raise(callbacks ...func(err error) error) { } func Recovery(fn func(err error)) { - assert.If(fn == nil, "[fn] should not be nil") + lo.Assert(fn != nil, "[fn] should not be nil") err := errinter.ParseError(recover()) if err == nil { diff --git a/stack/util.go b/stack/util.go new file mode 100644 index 0000000..4a8b1a3 --- /dev/null +++ b/stack/util.go @@ -0,0 +1,17 @@ +package stack + +import ( + "runtime/debug" + + "github.com/pubgo/funk/vars" +) + +var EnablePrintStack = vars.Bool("stack.enable_print_stack") + +func PrintStack() { + if !EnablePrintStack.Load() { + return + } + + debug.PrintStack() +} diff --git a/vars/vars.go b/vars/vars.go index 123b9a1..2e1ae95 100644 --- a/vars/vars.go +++ b/vars/vars.go @@ -4,18 +4,28 @@ import ( "encoding/json" "expvar" "fmt" + "log/slog" "strconv" "strings" + "sync" "github.com/rs/xid" - + "go.uber.org/atomic" + "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/convert" - "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/recovery" ) +var mux sync.Mutex + +func Bool(name string) *atomic.Bool { + return Any(name, atomic.NewBool(false)) +} + func Float(name string) *expvar.Float { + mux.Lock() + defer mux.Unlock() + v := expvar.Get(name) if v == nil { return expvar.NewFloat(name) @@ -24,6 +34,9 @@ func Float(name string) *expvar.Float { } func Int(name string) *expvar.Int { + mux.Lock() + defer mux.Unlock() + v := expvar.Get(name) if v == nil { return expvar.NewInt(name) @@ -32,6 +45,9 @@ func Int(name string) *expvar.Int { } func String(name string) *expvar.String { + mux.Lock() + defer mux.Unlock() + v := expvar.Get(name) if v == nil { return expvar.NewString(name) @@ -40,6 +56,9 @@ func String(name string) *expvar.String { } func Map(name string) *expvar.Map { + mux.Lock() + defer mux.Unlock() + v := expvar.Get(name) if v == nil { return expvar.NewMap(name) @@ -49,29 +68,36 @@ func Map(name string) *expvar.Map { var _ json.Marshaler = (*Value)(nil) -type Value func() interface{} +type Value func() any func (f Value) MarshalJSON() ([]byte, error) { return json.Marshal(f()) } -func (f Value) Value() interface{} { return f() } +func (f Value) Value() any { return f() } func (f Value) String() (r string) { return toString(f()) } +func errToString(err error) string { + if err == nil { + return "null" + } + + return strconv.Quote(fmt.Sprintf("err:%s detail:%#v", err.Error(), err)) +} func toString(dt any) (r string) { - var errStr = func(err any) string { - ret, err := json.Marshal(err) + var jsonStr = func(data any) string { + ret, err := json.Marshal(data) if err != nil { - return strconv.Quote(pretty.SimplePrint(err)) + return errToString(err) } else { - return convert.B2S(ret) + return string(ret) } } - defer recovery.Recovery(func(err error) { r = errStr(err) }) + defer recovery.Recovery(func(err error) { r = jsonStr(err) }) switch dt := dt.(type) { case nil: @@ -83,21 +109,23 @@ func toString(dt any) (r string) { case fmt.Stringer: return strconv.Quote(dt.String()) case error: - return strconv.Quote(fmt.Sprintf("err:%s detail:%#v", dt, dt)) + return errToString(dt) default: - return errStr(dt) + return slog.AnyValue(dt).String() } } -func Any(v any) expvar.Var { - switch v.(type) { - case nil: - return anyValue{v: nil} - case Value: - return v.(Value) - default: - return anyValue{v: v} +func Any[T any](name string, v T) T { + mux.Lock() + defer mux.Unlock() + + vv := expvar.Get(name) + if vv != nil { + return vv.(*anyValue).v.(T) } + + expvar.Publish(name, &anyValue{v: v}) + return v } var _ expvar.Var = (*anyValue)(nil) @@ -110,16 +138,15 @@ func (a anyValue) String() string { return toString(a.v) } -func Register(name string, value Value) { - defer recovery.Exit() - assert.If(Has(name), "name:%s already exists", name) - expvar.Publish(name, value) +func (a anyValue) MarshalJSON() ([]byte, error) { + return json.Marshal(a.v) } -func RegisterValue(name string, data any) { - defer recovery.Exit() +func (a anyValue) Value() any { return a.v } + +func Register(name string, value Value) { assert.If(Has(name), "name:%s already exists", name) - expvar.Publish(name, Value(func() interface{} { return data })) + expvar.Publish(name, value) } func Has(name string) bool { diff --git a/vars/z_test.go b/vars/z_test.go new file mode 100644 index 0000000..15fb096 --- /dev/null +++ b/vars/z_test.go @@ -0,0 +1,21 @@ +package vars_test + +import ( + "expvar" + "strconv" + "testing" + + "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/vars" +) + +func TestAny(t *testing.T) { + defer recovery.Testing(t) + name := "test-bool-var" + bb := vars.Bool(name) + assert.If(bb.Load() != false, "not match") + assert.If(vars.Bool(name).String() != "false", "not match") + vars.Bool(name).Store(true) + assert.MustEqual(expvar.Get(name).String(), strconv.Quote("true")) +} From ebc6fb5bdf11a22ca8d196431064c8a57b80a32f Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 09:51:03 +0800 Subject: [PATCH 06/43] refactor(vars): replace expvar with atomic types and fix Result logic --- component/gormclient/client.go | 2 +- v2/result/result.go | 4 +-- vars/vars.go | 66 +++++++++++++--------------------- vars/z_test.go | 3 +- 4 files changed, 28 insertions(+), 47 deletions(-) diff --git a/component/gormclient/client.go b/component/gormclient/client.go index ebeea2e..7986ffe 100644 --- a/component/gormclient/client.go +++ b/component/gormclient/client.go @@ -23,7 +23,7 @@ func (c *Client) Ping() error { return _db.Ping() } -func (c *Client) Vars() vars.Value { +func (c *Client) Vars() vars.Func { return func() interface{} { _db, err := c.DB.DB() if err != nil { diff --git a/v2/result/result.go b/v2/result/result.go index 35f4766..191eab1 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -116,14 +116,14 @@ func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { } func (r Result[T]) Map(fn func(T) T) Result[T] { - if r.IsOK() { + if r.IsErr() { return r } return OK(fn(r.getValue())) } func (r Result[T]) FlatMap(fn func(T) Result[T]) Result[T] { - if r.IsOK() { + if r.IsErr() { return r } return fn(r.getValue()) diff --git a/vars/vars.go b/vars/vars.go index 2e1ae95..035fe06 100644 --- a/vars/vars.go +++ b/vars/vars.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" "sync" + "time" "github.com/rs/xid" "go.uber.org/atomic" @@ -22,61 +23,41 @@ func Bool(name string) *atomic.Bool { return Any(name, atomic.NewBool(false)) } -func Float(name string) *expvar.Float { - mux.Lock() - defer mux.Unlock() - - v := expvar.Get(name) - if v == nil { - return expvar.NewFloat(name) - } - return v.(*expvar.Float) +func Float(name string) *atomic.Float64 { + return Any(name, atomic.NewFloat64(0)) } -func Int(name string) *expvar.Int { - mux.Lock() - defer mux.Unlock() - - v := expvar.Get(name) - if v == nil { - return expvar.NewInt(name) - } - return v.(*expvar.Int) +func Int(name string) *atomic.Int64 { + return Any(name, atomic.NewInt64(0)) } -func String(name string) *expvar.String { - mux.Lock() - defer mux.Unlock() +func String(name string) *atomic.String { + return Any(name, atomic.NewString("")) +} - v := expvar.Get(name) - if v == nil { - return expvar.NewString(name) - } - return v.(*expvar.String) +func Duration(name string) *atomic.Duration { + return Any(name, atomic.NewDuration(0)) } -func Map(name string) *expvar.Map { - mux.Lock() - defer mux.Unlock() +func Time(name string) *atomic.Time { + return Any(name, atomic.NewTime(time.Now())) +} - v := expvar.Get(name) - if v == nil { - return expvar.NewMap(name) - } - return v.(*expvar.Map) +func Error(name string) *atomic.Error { + return Any(name, atomic.NewError(nil)) } -var _ json.Marshaler = (*Value)(nil) +var _ json.Marshaler = (*Func)(nil) -type Value func() any +type Func func() any -func (f Value) MarshalJSON() ([]byte, error) { +func (f Func) MarshalJSON() ([]byte, error) { return json.Marshal(f()) } -func (f Value) Value() any { return f() } +func (f Func) Value() any { return f() } -func (f Value) String() (r string) { +func (f Func) String() (r string) { return toString(f()) } @@ -87,6 +68,7 @@ func errToString(err error) string { return strconv.Quote(fmt.Sprintf("err:%s detail:%#v", err.Error(), err)) } + func toString(dt any) (r string) { var jsonStr = func(data any) string { ret, err := json.Marshal(data) @@ -106,6 +88,8 @@ func toString(dt any) (r string) { return strconv.Quote(dt) case []byte: return strconv.Quote(string(dt)) + case json.Marshaler: + return jsonStr(dt) case fmt.Stringer: return strconv.Quote(dt.String()) case error: @@ -142,9 +126,7 @@ func (a anyValue) MarshalJSON() ([]byte, error) { return json.Marshal(a.v) } -func (a anyValue) Value() any { return a.v } - -func Register(name string, value Value) { +func Register(name string, value Func) { assert.If(Has(name), "name:%s already exists", name) expvar.Publish(name, value) } diff --git a/vars/z_test.go b/vars/z_test.go index 15fb096..7afb037 100644 --- a/vars/z_test.go +++ b/vars/z_test.go @@ -2,7 +2,6 @@ package vars_test import ( "expvar" - "strconv" "testing" "github.com/pubgo/funk/assert" @@ -17,5 +16,5 @@ func TestAny(t *testing.T) { assert.If(bb.Load() != false, "not match") assert.If(vars.Bool(name).String() != "false", "not match") vars.Bool(name).Store(true) - assert.MustEqual(expvar.Get(name).String(), strconv.Quote("true")) + assert.MustEqual(expvar.Get(name).String(), "true") } From a9805a07349007c2297fafd2f15726f008d3de37 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 09:54:55 +0800 Subject: [PATCH 07/43] fix: barry quick fix, 2025-09-13 09:54:55 --- log/event.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/log/event.go b/log/event.go index 4f66e72..8d2528d 100644 --- a/log/event.go +++ b/log/event.go @@ -61,6 +61,10 @@ func GetEventBuf(evt *Event) []byte { } func cloneEvent(target *Event) *Event { + if target == nil { + return nil + } + newTarget := zerolog.Dict() convertEvent(newTarget).buf = bytes.Clone(convertEvent(target).buf) return newTarget From 7726faf247b181f298b3bac97509e3aaa9b582db Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 10:23:29 +0800 Subject: [PATCH 08/43] refactor: remove deprecated Result function --- try/try.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/try/try.go b/try/try.go index 706e1f1..ca72d60 100644 --- a/try/try.go +++ b/try/try.go @@ -3,33 +3,9 @@ package try import ( "github.com/pubgo/funk" "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/result" "github.com/pubgo/funk/stack" ) -// Result -// Deprecated: use result.Try instead -func Result[T any](fn func() result.Result[T]) (g result.Result[T]) { - if fn == nil { - g = g.WithErr(errors.WrapStack(errors.New("[fn] is nil"))) - return - } - - defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { - g = g.WithErr(errors.WrapStack(err)) - } - - if g.IsErr() { - g = g.WithErr(errors.WrapKV(g.Err(), "fn_stack", stack.CallerWithFunc(fn))) - } - }() - - g = fn() - return -} - func WithErr(gErr *error, fn func() error) { if fn == nil { *gErr = errors.WrapStack(errors.New("[fn] is nil")) From 0a8a1b676a3d5211ada724eafd4c57c652ca522a Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 11:38:55 +0800 Subject: [PATCH 09/43] chore: quick update fix/version at 2025-09-15 23:52:18 --- assert/util.go | 47 ++++++++++++++++++++++++++------- errors/errcheck/check.go | 53 ++++++++++++++++++++++++-------------- errors/errcheck/context.go | 2 +- errors/errcheck/util.go | 40 +++++++++++++++++++++++++++- errors/errinter/utils.go | 4 +-- errors/must.go | 26 ++++--------------- log/logfields/fields.go | 1 + v2/result/result.go | 1 + v2/result/util.go | 2 +- 9 files changed, 120 insertions(+), 56 deletions(-) diff --git a/assert/util.go b/assert/util.go index 6f0fc70..28fb0d0 100644 --- a/assert/util.go +++ b/assert/util.go @@ -5,8 +5,11 @@ import ( "log/slog" "reflect" "runtime/debug" + "sync" "github.com/k0kubun/pp/v3" + "github.com/pubgo/funk/log/logfields" + "github.com/samber/lo" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { @@ -20,7 +23,21 @@ func messageFromMsgAndArgs(msgAndArgs ...any) string { } } - return pp.Sprint(msgAndArgs...) + return pretty().Sprint(msgAndArgs...) +} + +func logErr(err error, message string, attrs ...slog.Attr) { + if err == nil { + return + } + + attrs = append(attrs, + slog.String(logfields.Module, "assert"), + slog.String(logfields.Error, err.Error()), + slog.String("stack", string(debug.Stack())), + slog.String(logfields.ErrorDetail, pretty().Sprint(err)), + ) + slog.Error(message, lo.ToAnySlice(attrs)...) } func must(err error, messageArgs ...any) { @@ -35,26 +52,36 @@ func must(err error, messageArgs ...any) { message = fmt.Sprintf("msg:%v err:%s", message, err.Error()) } - slog.Error(message) - debug.PrintStack() + logErr(err, message, slog.Bool("panic", true)) panic(err) } +var pretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) + func try(fn func() error) (gErr error) { if fn == nil { - gErr = fmt.Errorf("[fn] is nil") + gErr = fmt.Errorf("assert: [fn] is nil") + logErr(gErr, gErr.Error()) + debug.PrintStack() return } - defer func() { - if gErr != nil { - gErr = fmt.Errorf("stack:%s, err:%w", reflect.TypeOf(fn).String(), gErr) - } - }() - defer func() { if err := recover(); err != nil { gErr = fmt.Errorf("%v", err) + logErr(gErr, gErr.Error()) + debug.PrintStack() + } + + if gErr != nil { + gErr = fmt.Errorf("stack:%s, err:%w", reflect.TypeOf(fn).String(), gErr) } }() diff --git a/errors/errcheck/check.go b/errors/errcheck/check.go index 59253c3..8c785e2 100644 --- a/errors/errcheck/check.go +++ b/errors/errcheck/check.go @@ -4,27 +4,33 @@ import ( "context" "fmt" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errinter" "github.com/pubgo/funk/log" "github.com/samber/lo" ) func RecoveryAndCheck(setter *error, callbacks ...func(err error) error) { if setter == nil { - errMust(fmt.Errorf("setter is nil")) + assert.Must(fmt.Errorf("errcheck: setter is nil")) return } - err := errors.Parse(recover()) - gErr := *setter - if err == nil && gErr == nil { - return + err := errinter.ParseError(recover()) + if err != nil { + err = errors.WrapStack(err) } + gErr := *setter if err == nil { err = gErr } + if err == nil { + return + } + for _, fn := range callbacks { err = fn(err) if err == nil { @@ -32,12 +38,20 @@ func RecoveryAndCheck(setter *error, callbacks ...func(err error) error) { } } - *setter = errors.WrapCaller(err, 1) + *setter = err } func Check(errSetter *error, err error, contexts ...context.Context) bool { + defer func() { + if *errSetter == nil { + return + } + + logErr(lo.FirstOr(contexts, nil), *errSetter) + }() + if errSetter == nil { - errMust(fmt.Errorf("errSetter is nil")) + assert.Must(fmt.Errorf("errcheck: errSetter is nil")) return false } @@ -51,7 +65,7 @@ func Check(errSetter *error, err error, contexts ...context.Context) bool { } var ctx = lo.FirstOr(contexts, context.Background()) - for _, fn := range GetCheckersFromCtx(ctx) { + for _, fn := range getCheckersFromCtx(ctx) { err = fn(ctx, err) if err == nil { return false @@ -62,14 +76,15 @@ func Check(errSetter *error, err error, contexts ...context.Context) bool { return true } -func Expect(err error, format string, args ...any) { - if err == nil { - return - } +func Must(err error, args ...any) { + logErr(nil, err) + errNilOrPanic(err, args...) +} - err = errors.WrapCaller(err, 1) - err = errors.Wrapf(err, format, args...) - errMust(err) +func Must1[T any](v T, err error) T { + logErr(nil, err) + errNilOrPanic(err) + return v } func Map(err error, fn func(err error) error) error { @@ -88,12 +103,12 @@ func Inspect(err error, fn func(err error)) { fn(err) } -func InspectLog(err error, fn func(logger *log.Event), contexts ...context.Context) { +func InspectLog(err error, fn func(evt *log.Event), contexts ...context.Context) { if err == nil { return } - fn(log.Err(err, contexts...)) + logErr(lo.FirstOr(contexts, context.Background()), err, fn) } func LogErr(err error, contexts ...context.Context) { @@ -101,7 +116,5 @@ func LogErr(err error, contexts ...context.Context) { return } - log.Err(err, contexts...). - CallerSkipFrame(1). - Msg(err.Error()) + logErr(lo.FirstOr(contexts, context.Background()), err) } diff --git a/errors/errcheck/context.go b/errors/errcheck/context.go index 32835ef..2184b32 100644 --- a/errors/errcheck/context.go +++ b/errors/errcheck/context.go @@ -25,7 +25,7 @@ func CreateCtx(ctx context.Context, errChecks []ErrChecker, upsert ...bool) cont return context.WithValue(ctx, checkCtx{}, errChecks) } -func GetCheckersFromCtx(ctx context.Context) []ErrChecker { +func getCheckersFromCtx(ctx context.Context) []ErrChecker { if ctx == nil { return nil } diff --git a/errors/errcheck/util.go b/errors/errcheck/util.go index 0f061e5..b52c751 100644 --- a/errors/errcheck/util.go +++ b/errors/errcheck/util.go @@ -1,12 +1,20 @@ package errcheck import ( + "context" "fmt" + "runtime/debug" + "sync" + "github.com/k0kubun/pp/v3" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" + "github.com/rs/zerolog" + "google.golang.org/protobuf/encoding/prototext" ) -func errMust(err error, args ...any) { +func errNilOrPanic(err error, args ...any) { if err == nil { return } @@ -19,3 +27,33 @@ func errMust(err error, args ...any) { errors.Debug(err) panic(err) } + +func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { + if err == nil { + return + } + + log.Error(ctx). + Func(func(e *zerolog.Event) { + e.Str(logfields.Module, "errcheck") + e.Str("stack", string(debug.Stack())) + e.Str(logfields.ErrorDetail, pretty().Sprint(err)) + e.Str(logfields.ErrorID, errors.GetErrorId(err)) + + for _, fn := range events { + fn(e) + } + }). + Str(logfields.Error, err.Error()). + CallerSkipFrame(2). + Msgf("%s\n%s\n", err.Error(), prototext.Format(errors.ParseErrToPb(err))) +} + +var pretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index 8335571..3a71a70 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -83,7 +83,7 @@ func Debug(err error) { return } - Console().Println(err) + DebugPretty().Println(err) } func MustTagsToAny(tags ...*errorpb.Tag) []*anypb.Any { @@ -160,7 +160,7 @@ var errPretty = sync.OnceValue(func() *pp.PrettyPrinter { return printer }) -var Console = sync.OnceValue(func() *pp.PrettyPrinter { +var DebugPretty = sync.OnceValue(func() *pp.PrettyPrinter { printer := pp.New() printer.SetColoringEnabled(true) printer.SetExportedOnly(false) diff --git a/errors/must.go b/errors/must.go index f7e9a25..347cd1f 100644 --- a/errors/must.go +++ b/errors/must.go @@ -3,36 +3,20 @@ package errors import ( "fmt" "os" + + "github.com/pubgo/funk/assert" ) func Must(err error, args ...interface{}) { - if err == nil { - return - } - - err = WrapStack(Wrap(err, fmt.Sprint(args...))) - Debug(err) - panic(err) + assert.Must(err, args...) } func MustF(err error, msg string, args ...interface{}) { - if err == nil { - return - } - - err = WrapStack(Wrap(err, fmt.Sprintf(msg, args...))) - Debug(err) - panic(err) + assert.MustF(err, msg, args...) } func Must1[T any](ret T, err error) T { - if err != nil { - err = WrapStack(err) - Debug(err) - panic(err) - } - - return ret + return assert.Must1(ret, err) } func Exit(err error, args ...interface{}) { diff --git a/log/logfields/fields.go b/log/logfields/fields.go index 7e46499..7fb9857 100644 --- a/log/logfields/fields.go +++ b/log/logfields/fields.go @@ -7,4 +7,5 @@ const ( Error = "error" ErrorDetail = "error_detail" ErrorStack = "error_stack" + ErrorID = "error_id" ) diff --git a/v2/result/result.go b/v2/result/result.go index 191eab1..b71d64f 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -73,6 +73,7 @@ func (r Result[T]) Expect(format string, args ...any) T { func (r Result[T]) Must() T { if r.IsErr() { + logErr(nil, r.err) errNilOrPanic(errors.WrapCaller(r.getErr(), 1)) } diff --git a/v2/result/util.go b/v2/result/util.go index d76129b..fb0cb45 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -255,5 +255,5 @@ func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { }). Str(zerolog.ErrorFieldName, err.Error()). CallerSkipFrame(2). - Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) + Msgf("%s\n%s\n", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } From 5030e67acafed31c453569527d59fc58c5cb921c Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 13 Sep 2025 11:38:55 +0800 Subject: [PATCH 10/43] chore: quick update fix/version at 2025-09-16 18:31:37 --- assert/util.go | 47 ++++++++++++++++++++------ errors/errcheck/check.go | 67 ++++++++++++++++++++------------------ errors/errcheck/context.go | 2 +- errors/errcheck/util.go | 39 +++++++++++++++++----- errors/errinter/utils.go | 4 +-- errors/must.go | 26 +++------------ log/logfields/fields.go | 1 + shutil/shell.go | 17 ++++------ v2/result/api.go | 18 ++++++---- v2/result/error.go | 10 +++--- v2/result/result.go | 9 +++-- v2/result/util.go | 28 +++++++++++----- 12 files changed, 161 insertions(+), 107 deletions(-) diff --git a/assert/util.go b/assert/util.go index 6f0fc70..28fb0d0 100644 --- a/assert/util.go +++ b/assert/util.go @@ -5,8 +5,11 @@ import ( "log/slog" "reflect" "runtime/debug" + "sync" "github.com/k0kubun/pp/v3" + "github.com/pubgo/funk/log/logfields" + "github.com/samber/lo" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { @@ -20,7 +23,21 @@ func messageFromMsgAndArgs(msgAndArgs ...any) string { } } - return pp.Sprint(msgAndArgs...) + return pretty().Sprint(msgAndArgs...) +} + +func logErr(err error, message string, attrs ...slog.Attr) { + if err == nil { + return + } + + attrs = append(attrs, + slog.String(logfields.Module, "assert"), + slog.String(logfields.Error, err.Error()), + slog.String("stack", string(debug.Stack())), + slog.String(logfields.ErrorDetail, pretty().Sprint(err)), + ) + slog.Error(message, lo.ToAnySlice(attrs)...) } func must(err error, messageArgs ...any) { @@ -35,26 +52,36 @@ func must(err error, messageArgs ...any) { message = fmt.Sprintf("msg:%v err:%s", message, err.Error()) } - slog.Error(message) - debug.PrintStack() + logErr(err, message, slog.Bool("panic", true)) panic(err) } +var pretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) + func try(fn func() error) (gErr error) { if fn == nil { - gErr = fmt.Errorf("[fn] is nil") + gErr = fmt.Errorf("assert: [fn] is nil") + logErr(gErr, gErr.Error()) + debug.PrintStack() return } - defer func() { - if gErr != nil { - gErr = fmt.Errorf("stack:%s, err:%w", reflect.TypeOf(fn).String(), gErr) - } - }() - defer func() { if err := recover(); err != nil { gErr = fmt.Errorf("%v", err) + logErr(gErr, gErr.Error()) + debug.PrintStack() + } + + if gErr != nil { + gErr = fmt.Errorf("stack:%s, err:%w", reflect.TypeOf(fn).String(), gErr) } }() diff --git a/errors/errcheck/check.go b/errors/errcheck/check.go index 59253c3..6890da9 100644 --- a/errors/errcheck/check.go +++ b/errors/errcheck/check.go @@ -4,27 +4,42 @@ import ( "context" "fmt" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/errors/errinter" "github.com/pubgo/funk/log" + "github.com/rs/zerolog" "github.com/samber/lo" ) func RecoveryAndCheck(setter *error, callbacks ...func(err error) error) { if setter == nil { - errMust(fmt.Errorf("setter is nil")) + assert.Must(fmt.Errorf("errcheck: setter is nil")) return } - err := errors.Parse(recover()) - gErr := *setter - if err == nil && gErr == nil { - return + defer func() { + if *setter == nil { + return + } + + logErr(nil, *setter) + }() + + err := errinter.ParseError(recover()) + if err != nil { + err = errors.WrapStack(err) } + gErr := *setter if err == nil { err = gErr } + if err == nil { + return + } + for _, fn := range callbacks { err = fn(err) if err == nil { @@ -32,12 +47,20 @@ func RecoveryAndCheck(setter *error, callbacks ...func(err error) error) { } } - *setter = errors.WrapCaller(err, 1) + *setter = err } func Check(errSetter *error, err error, contexts ...context.Context) bool { + defer func() { + if *errSetter == nil { + return + } + + logErr(lo.FirstOr(contexts, nil), *errSetter) + }() + if errSetter == nil { - errMust(fmt.Errorf("errSetter is nil")) + assert.Must(fmt.Errorf("errcheck: errSetter is nil")) return false } @@ -51,7 +74,7 @@ func Check(errSetter *error, err error, contexts ...context.Context) bool { } var ctx = lo.FirstOr(contexts, context.Background()) - for _, fn := range GetCheckersFromCtx(ctx) { + for _, fn := range getCheckersFromCtx(ctx) { err = fn(ctx, err) if err == nil { return false @@ -62,16 +85,6 @@ func Check(errSetter *error, err error, contexts ...context.Context) bool { return true } -func Expect(err error, format string, args ...any) { - if err == nil { - return - } - - err = errors.WrapCaller(err, 1) - err = errors.Wrapf(err, format, args...) - errMust(err) -} - func Map(err error, fn func(err error) error) error { if err == nil { return nil @@ -80,28 +93,18 @@ func Map(err error, fn func(err error) error) error { return errors.WrapCaller(fn(err), 1) } -func Inspect(err error, fn func(err error)) { - if err == nil { - return - } - - fn(err) -} - -func InspectLog(err error, fn func(logger *log.Event), contexts ...context.Context) { +func LogCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { if err == nil { return } - fn(log.Err(err, contexts...)) + logErr(ctx, err, events...) } -func LogErr(err error, contexts ...context.Context) { +func Log(err error, events ...func(e *zerolog.Event)) { if err == nil { return } - log.Err(err, contexts...). - CallerSkipFrame(1). - Msg(err.Error()) + logErr(context.Background(), err, events...) } diff --git a/errors/errcheck/context.go b/errors/errcheck/context.go index 32835ef..2184b32 100644 --- a/errors/errcheck/context.go +++ b/errors/errcheck/context.go @@ -25,7 +25,7 @@ func CreateCtx(ctx context.Context, errChecks []ErrChecker, upsert ...bool) cont return context.WithValue(ctx, checkCtx{}, errChecks) } -func GetCheckersFromCtx(ctx context.Context) []ErrChecker { +func getCheckersFromCtx(ctx context.Context) []ErrChecker { if ctx == nil { return nil } diff --git a/errors/errcheck/util.go b/errors/errcheck/util.go index 0f061e5..67a2699 100644 --- a/errors/errcheck/util.go +++ b/errors/errcheck/util.go @@ -1,21 +1,44 @@ package errcheck import ( - "fmt" + "context" + "runtime/debug" + "sync" + "github.com/k0kubun/pp/v3" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" + "github.com/rs/zerolog" + "google.golang.org/protobuf/encoding/prototext" ) -func errMust(err error, args ...any) { +func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { if err == nil { return } - if len(args) > 0 { - err = errors.Wrap(err, fmt.Sprint(args...)) - } + log.Error(ctx). + Func(func(e *zerolog.Event) { + e.Str(logfields.Module, "errcheck") + e.Str("stack", string(debug.Stack())) + e.Str(logfields.ErrorDetail, pretty().Sprint(err)) + e.Str(logfields.ErrorID, errors.GetErrorId(err)) - err = errors.WrapStack(err) - errors.Debug(err) - panic(err) + for _, fn := range events { + fn(e) + } + }). + Str(logfields.Error, err.Error()). + CallerSkipFrame(2). + Msgf("%s\n%s\n", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } + +var pretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index 8335571..3a71a70 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -83,7 +83,7 @@ func Debug(err error) { return } - Console().Println(err) + DebugPretty().Println(err) } func MustTagsToAny(tags ...*errorpb.Tag) []*anypb.Any { @@ -160,7 +160,7 @@ var errPretty = sync.OnceValue(func() *pp.PrettyPrinter { return printer }) -var Console = sync.OnceValue(func() *pp.PrettyPrinter { +var DebugPretty = sync.OnceValue(func() *pp.PrettyPrinter { printer := pp.New() printer.SetColoringEnabled(true) printer.SetExportedOnly(false) diff --git a/errors/must.go b/errors/must.go index f7e9a25..347cd1f 100644 --- a/errors/must.go +++ b/errors/must.go @@ -3,36 +3,20 @@ package errors import ( "fmt" "os" + + "github.com/pubgo/funk/assert" ) func Must(err error, args ...interface{}) { - if err == nil { - return - } - - err = WrapStack(Wrap(err, fmt.Sprint(args...))) - Debug(err) - panic(err) + assert.Must(err, args...) } func MustF(err error, msg string, args ...interface{}) { - if err == nil { - return - } - - err = WrapStack(Wrap(err, fmt.Sprintf(msg, args...))) - Debug(err) - panic(err) + assert.MustF(err, msg, args...) } func Must1[T any](ret T, err error) T { - if err != nil { - err = WrapStack(err) - Debug(err) - panic(err) - } - - return ret + return assert.Must1(ret, err) } func Exit(err error, args ...interface{}) { diff --git a/log/logfields/fields.go b/log/logfields/fields.go index 7e46499..7fb9857 100644 --- a/log/logfields/fields.go +++ b/log/logfields/fields.go @@ -7,4 +7,5 @@ const ( Error = "error" ErrorDetail = "error_detail" ErrorStack = "error_stack" + ErrorID = "error_id" ) diff --git a/shutil/shell.go b/shutil/shell.go index 03cd3c0..3fc5224 100644 --- a/shutil/shell.go +++ b/shutil/shell.go @@ -2,30 +2,27 @@ package shutil import ( "bytes" + "fmt" "os" "os/exec" "strings" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/v2/result" + "github.com/rs/zerolog" ) func Run(args ...string) (r result.Result[string]) { - defer result.RecoveryErr(&r) + defer result.Recovery(&r) b := bytes.NewBufferString("") cmd := Shell(args...) cmd.Stdout = b - result.ErrOf(cmd.Run()). - Inspect(func(err error) { - log.Err(err).Msg("failed to execute: " + strings.Join(args, " ")) - }). - CatchErr(&r) - if r.IsErr() { - return - } + result.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to execute: "+strings.Join(args, " "))) + }) return r.WithValue(strings.TrimSpace(b.String())) } diff --git a/v2/result/api.go b/v2/result/api.go index 6995c50..659a368 100644 --- a/v2/result/api.go +++ b/v2/result/api.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/pubgo/funk/errors" + "github.com/rs/zerolog" ) func All[T any](results ...Result[T]) Result[[]T] { @@ -18,7 +19,7 @@ func All[T any](results ...Result[T]) Result[[]T] { return OK(values) } -func Recovery(setter *error, callbacks ...func(err error) error) { +func RecoveryErr(setter *error, callbacks ...func(err error) error) { if setter == nil { errNilOrPanic(errors.Errorf("setter is nil")) return @@ -30,7 +31,7 @@ func Recovery(setter *error, callbacks ...func(err error) error) { )) } -func RecoveryErr(setter ErrSetter, callbacks ...func(err error) error) { +func Recovery(setter ErrSetter, callbacks ...func(err error) error) { if setter == nil { errNilOrPanic(errors.Errorf("setter is nil")) return @@ -46,11 +47,6 @@ func Errorf(msg string, args ...any) Error { return newError(errors.WrapCaller(fmt.Errorf(msg, args...), 1)) } -// Deprecated: use Errorf -func ErrorOf(msg string, args ...any) Error { - return newError(errors.WrapCaller(fmt.Errorf(msg, args...), 1)) -} - func ErrProxyOf(err *error) ErrProxy { if err == nil { errNilOrPanic(errors.Errorf("err param is nil")) @@ -135,3 +131,11 @@ func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { return fn(r.getValue()) } + +func Log(err error, events ...func(e *zerolog.Event)) { + logErr(nil, err, events...) +} + +func LogCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { + logErr(ctx, err, events...) +} diff --git a/v2/result/error.go b/v2/result/error.go index 6e8cf33..e67d3c7 100644 --- a/v2/result/error.go +++ b/v2/result/error.go @@ -8,6 +8,7 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/errors/errutil" + "github.com/pubgo/funk/log/logfields" ) var _ Catchable = new(Error) @@ -95,12 +96,12 @@ func (e Error) GetErr() error { return e.getErr() } -func (e Error) Must() { +func (e Error) Must(events ...func(e *zerolog.Event)) { if e.IsOK() { return } - errNilOrPanic(errors.WrapCaller(e.getErr(), 1)) + errNilOrPanic(errors.WrapCaller(e.getErr(), 1), events...) } func (e Error) Expect(format string, args ...any) { @@ -109,8 +110,9 @@ func (e Error) Expect(format string, args ...any) { } err := errors.WrapCaller(e.getErr(), 1) - err = errors.Wrapf(err, format, args...) - errNilOrPanic(err) + errNilOrPanic(err, func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf(format, args...)) + }) } func (e Error) String() string { diff --git a/v2/result/result.go b/v2/result/result.go index 191eab1..4b35ccd 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -10,6 +10,7 @@ import ( "github.com/pubgo/funk" "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/log/logfields" ) var _ Catchable = new(Result[any]) @@ -65,15 +66,17 @@ func (r Result[T]) ValueTo(v *T) Error { func (r Result[T]) Expect(format string, args ...any) T { if r.IsErr() { err := errors.WrapCaller(r.getErr(), 1) - errNilOrPanic(errors.Wrapf(err, format, args...)) + errNilOrPanic(err, func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf(format, args...)) + }) } return r.getValue() } -func (r Result[T]) Must() T { +func (r Result[T]) Must(events ...func(e *zerolog.Event)) T { if r.IsErr() { - errNilOrPanic(errors.WrapCaller(r.getErr(), 1)) + errNilOrPanic(errors.WrapCaller(r.getErr(), 1), events...) } return r.getValue() diff --git a/v2/result/util.go b/v2/result/util.go index d76129b..6caef9b 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -3,12 +3,14 @@ package result import ( "context" "fmt" + "sync" "log/slog" "reflect" "runtime/debug" "strings" + "github.com/k0kubun/pp/v3" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" @@ -16,6 +18,7 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/stack" "github.com/pubgo/funk/v2/result/resultchecker" ) @@ -61,15 +64,12 @@ func try1[T any](fn func() (T, error)) (t T, gErr error) { return } -func errNilOrPanic(err error, args ...any) { +func errNilOrPanic(err error, events ...func(e *zerolog.Event)) { if err == nil { return } - if len(args) > 0 { - err = errors.Wrap(err, fmt.Sprint(args...)) - } - + logErr(nil, err, events...) err = errors.WrapStack(err) errors.Debug(err) panic(err) @@ -245,15 +245,25 @@ func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { log.Error(ctx). Func(func(e *zerolog.Event) { + e.Str(logfields.Module, "resultv2") + e.Str(logfields.ErrorStack, string(debug.Stack())) + e.Str(logfields.ErrorDetail, pretty().Sprint(err)) + e.Str(logfields.ErrorID, errors.GetErrorId(err)) + for _, fn := range events { fn(e) } - - if id := errors.GetErrorId(err); id != "" { - e.Str("error_id", id) - } }). Str(zerolog.ErrorFieldName, err.Error()). CallerSkipFrame(2). Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } + +var pretty = sync.OnceValue(func() *pp.PrettyPrinter { + printer := pp.New() + printer.SetColoringEnabled(false) + printer.SetExportedOnly(false) + printer.SetOmitEmpty(true) + printer.SetMaxDepth(5) + return printer +}) From 82d51f97c31660df9fabf7c77fc8750582131fa9 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 20:51:06 +0800 Subject: [PATCH 11/43] fix: barry quick fix, 2025-09-16 20:51:06 --- v2/result/util.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v2/result/util.go b/v2/result/util.go index fbcf96e..eafcc57 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -221,6 +221,8 @@ func setError(setter ErrSetter, err error) { errSet.err = err case *ErrProxy: *errSet.err = err + case ErrProxy: + *errSet.err = err default: rv := reflect.ValueOf(setter) t := rv.Type() From 4aee6c08df1be7c8a4048cc2f0f7ca2f06943f51 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 21:50:48 +0800 Subject: [PATCH 12/43] chore: quick update fix/version at 2025-09-16 22:00:15 --- component/cloudevent/publisher.go | 6 +++--- env/env.go | 2 +- v2/result/api.go | 10 ++++------ v2/result/error.go | 9 ++------- v2/result/interface.go | 14 +++++++------- v2/result/proxy_test.go | 2 +- v2/result/result.go | 8 ++++---- v2/result/result_test.go | 8 ++++---- 8 files changed, 26 insertions(+), 33 deletions(-) diff --git a/component/cloudevent/publisher.go b/component/cloudevent/publisher.go index 3200d26..f687c07 100644 --- a/component/cloudevent/publisher.go +++ b/component/cloudevent/publisher.go @@ -133,7 +133,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal args to any proto") }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } @@ -143,7 +143,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal any proto to bytes") }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } @@ -167,7 +167,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to publish msg to stream, topic=%s msg_id=%s", topic, msgId)) }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } diff --git a/env/env.go b/env/env.go index f41da03..e399f30 100644 --- a/env/env.go +++ b/env/env.go @@ -120,7 +120,7 @@ func Key(key string) string { func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) - if result.CatchErr(&r, godotenv.Load(files...)) { + if result.Catch(&r, godotenv.Load(files...)) { return } diff --git a/v2/result/api.go b/v2/result/api.go index 659a368..cac47ca 100644 --- a/v2/result/api.go +++ b/v2/result/api.go @@ -106,18 +106,17 @@ func WrapFn[T any](fn func() (T, error)) Result[T] { return Result[T]{err: err} } -func CatchErr(setter ErrSetter, err error, contexts ...context.Context) bool { +func Catch(setter ErrSetter, err error, contexts ...context.Context) bool { return catchErr(newError(err), setter, nil, contexts...) } -func Catch(rawSetter *error, err error, contexts ...context.Context) bool { +func CatchErr(rawSetter *error, err error, contexts ...context.Context) bool { return catchErr(newError(err), nil, rawSetter, contexts...) } func MapTo[T, U any](r Result[T], fn func(T) U) Result[U] { if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) + return Fail[U](errors.WrapCaller(r.getErr(), 1)) } return OK(fn(r.getValue())) @@ -125,8 +124,7 @@ func MapTo[T, U any](r Result[T], fn func(T) U) Result[U] { func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) + return Fail[U](errors.WrapCaller(r.getErr(), 1)) } return fn(r.getValue()) diff --git a/v2/result/error.go b/v2/result/error.go index e67d3c7..26e4719 100644 --- a/v2/result/error.go +++ b/v2/result/error.go @@ -71,16 +71,11 @@ func (e Error) Inspect(fn func(error)) Error { func (e Error) InspectErr(fn func(error)) Error { return e.Inspect(fn) } -func (e Error) Unwrap() error { return e.err } -func (e Error) UnwrapErr(setter ErrSetter, contexts ...context.Context) bool { - return catchErr(e, setter, nil, contexts...) -} - -func (e Error) Catch(setter *error, ctx ...context.Context) bool { +func (e Error) CatchErr(setter *error, ctx ...context.Context) bool { return catchErr(e, nil, setter, ctx...) } -func (e Error) CatchErr(setter ErrSetter, ctx ...context.Context) bool { +func (e Error) Catch(setter ErrSetter, ctx ...context.Context) bool { return catchErr(e, setter, nil, ctx...) } diff --git a/v2/result/interface.go b/v2/result/interface.go index 4587329..fd8e959 100644 --- a/v2/result/interface.go +++ b/v2/result/interface.go @@ -2,11 +2,6 @@ package result import "context" -type Catchable interface { - Catch(err *error, contexts ...context.Context) bool - CatchErr(err ErrSetter, contexts ...context.Context) bool -} - // Checkable defines types that can be checked for Ok/Error state type Checkable interface { IsOK() bool @@ -20,7 +15,12 @@ type ErrSetter interface { setErrorInner() } +type Catchable interface { + CatchErr(err *error, contexts ...context.Context) bool + Catch(err ErrSetter, contexts ...context.Context) bool +} + type UnWrapper[T any] interface { - Unwrap(setter *error, contexts ...context.Context) T - UnwrapErr(setter ErrSetter, contexts ...context.Context) T + UnwrapErr(setter *error, contexts ...context.Context) T + Unwrap(setter ErrSetter, contexts ...context.Context) T } diff --git a/v2/result/proxy_test.go b/v2/result/proxy_test.go index f5da484..058b4cd 100644 --- a/v2/result/proxy_test.go +++ b/v2/result/proxy_test.go @@ -9,7 +9,7 @@ import ( func TestProxy(t *testing.T) { var gErr error var err = ErrProxyOf(&gErr) - Errorf("test proxy error").Log().CatchErr(&err) + Errorf("test proxy error").Log().Catch(&err) assert.NotNil(t, gErr) assert.NotNil(t, err.GetErr()) assert.Equal(t, gErr, err.GetErr()) diff --git a/v2/result/result.go b/v2/result/result.go index 4b35ccd..0ac689e 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -82,11 +82,11 @@ func (r Result[T]) Must(events ...func(e *zerolog.Event)) T { return r.getValue() } -func (r Result[T]) Catch(setter *error, ctx ...context.Context) bool { +func (r Result[T]) CatchErr(setter *error, ctx ...context.Context) bool { return catchErr(newError(r.err), nil, setter, ctx...) } -func (r Result[T]) CatchErr(setter ErrSetter, ctx ...context.Context) bool { +func (r Result[T]) Catch(setter ErrSetter, ctx ...context.Context) bool { return catchErr(newError(r.err), setter, nil, ctx...) } @@ -192,7 +192,7 @@ func (r Result[T]) WrapErr(err *errors.Err, tags ...errors.Tag) Result[T] { return Result[T]{err: errors.WrapTag(errors.WrapCaller(err, 1), tags...)} } -func (r Result[T]) Unwrap(setter *error, contexts ...context.Context) T { +func (r Result[T]) UnwrapErr(setter *error, contexts ...context.Context) T { ret, err := unwrapErr(r, setter, nil, contexts...) if err != nil { *setter = errors.WrapCaller(err, 1) @@ -200,7 +200,7 @@ func (r Result[T]) Unwrap(setter *error, contexts ...context.Context) T { return ret } -func (r Result[T]) UnwrapErr(setter ErrSetter, contexts ...context.Context) T { +func (r Result[T]) Unwrap(setter ErrSetter, contexts ...context.Context) T { ret, err := unwrapErr(r, nil, setter, contexts...) if err != nil { setError(setter, errors.WrapCaller(err, 1)) diff --git a/v2/result/result_test.go b/v2/result/result_test.go index 0f74552..1a74fe2 100644 --- a/v2/result/result_test.go +++ b/v2/result/result_test.go @@ -47,17 +47,17 @@ func TestErrOf(t *testing.T) { resultchecker.RegisterErrCheck(log.RecordErr()) var err result.Error - if fn1().CatchErr(&err, ctx) { + if fn1().Catch(&err, ctx) { errors.Debug(err.GetErr()) } } func fn1() (r result.Result[string]) { - if fn3().CatchErr(&r) { + if fn3().Catch(&r) { return } - val := fn2().UnwrapErr(&r) + val := fn2().Unwrap(&r) if r.IsErr() { return } @@ -70,7 +70,7 @@ func fn2() (r result.Result[string]) { InspectErr(func(err error) { log.Err(err).Msg("test error") }). - CatchErr(&r) + Catch(&r) if r.IsErr() { return } From 5921f067a3a5298c520cb6bfc15c464aeb78f69f Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 16 Sep 2025 21:50:48 +0800 Subject: [PATCH 13/43] chore: quick update fix/version at 2025-09-17 17:07:01 --- component/cloudevent/publisher.go | 6 +++--- env/env.go | 2 +- log/z_log_test.go | 6 ++++++ v2/result/api.go | 10 ++++------ v2/result/error.go | 9 ++------- v2/result/interface.go | 14 +++++++------- v2/result/proxy_test.go | 2 +- v2/result/result.go | 8 ++++---- v2/result/result_test.go | 8 ++++---- 9 files changed, 32 insertions(+), 33 deletions(-) diff --git a/component/cloudevent/publisher.go b/component/cloudevent/publisher.go index 3200d26..f687c07 100644 --- a/component/cloudevent/publisher.go +++ b/component/cloudevent/publisher.go @@ -133,7 +133,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal args to any proto") }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } @@ -143,7 +143,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal any proto to bytes") }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } @@ -167,7 +167,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, Log(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to publish msg to stream, topic=%s msg_id=%s", topic, msgId)) }). - Unwrap(&gErr) + UnwrapErr(&gErr) if gErr != nil { return } diff --git a/env/env.go b/env/env.go index f41da03..e399f30 100644 --- a/env/env.go +++ b/env/env.go @@ -120,7 +120,7 @@ func Key(key string) string { func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) - if result.CatchErr(&r, godotenv.Load(files...)) { + if result.Catch(&r, godotenv.Load(files...)) { return } diff --git a/log/z_log_test.go b/log/z_log_test.go index 1e05d7f..82ed98a 100644 --- a/log/z_log_test.go +++ b/log/z_log_test.go @@ -15,6 +15,12 @@ import ( "github.com/pubgo/funk/log/logutil" ) +func TestLogLevel(t *testing.T) { + log.Warn().Msg("test warn") + logger := log.GetLogger().WithLevel(zerolog.ErrorLevel) + logger.Warn().Msg("test warn") +} + func TestWithName(t *testing.T) { log.GetLogger("log1"). Debug(). diff --git a/v2/result/api.go b/v2/result/api.go index 659a368..cac47ca 100644 --- a/v2/result/api.go +++ b/v2/result/api.go @@ -106,18 +106,17 @@ func WrapFn[T any](fn func() (T, error)) Result[T] { return Result[T]{err: err} } -func CatchErr(setter ErrSetter, err error, contexts ...context.Context) bool { +func Catch(setter ErrSetter, err error, contexts ...context.Context) bool { return catchErr(newError(err), setter, nil, contexts...) } -func Catch(rawSetter *error, err error, contexts ...context.Context) bool { +func CatchErr(rawSetter *error, err error, contexts ...context.Context) bool { return catchErr(newError(err), nil, rawSetter, contexts...) } func MapTo[T, U any](r Result[T], fn func(T) U) Result[U] { if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) + return Fail[U](errors.WrapCaller(r.getErr(), 1)) } return OK(fn(r.getValue())) @@ -125,8 +124,7 @@ func MapTo[T, U any](r Result[T], fn func(T) U) Result[U] { func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) + return Fail[U](errors.WrapCaller(r.getErr(), 1)) } return fn(r.getValue()) diff --git a/v2/result/error.go b/v2/result/error.go index e67d3c7..26e4719 100644 --- a/v2/result/error.go +++ b/v2/result/error.go @@ -71,16 +71,11 @@ func (e Error) Inspect(fn func(error)) Error { func (e Error) InspectErr(fn func(error)) Error { return e.Inspect(fn) } -func (e Error) Unwrap() error { return e.err } -func (e Error) UnwrapErr(setter ErrSetter, contexts ...context.Context) bool { - return catchErr(e, setter, nil, contexts...) -} - -func (e Error) Catch(setter *error, ctx ...context.Context) bool { +func (e Error) CatchErr(setter *error, ctx ...context.Context) bool { return catchErr(e, nil, setter, ctx...) } -func (e Error) CatchErr(setter ErrSetter, ctx ...context.Context) bool { +func (e Error) Catch(setter ErrSetter, ctx ...context.Context) bool { return catchErr(e, setter, nil, ctx...) } diff --git a/v2/result/interface.go b/v2/result/interface.go index 4587329..fd8e959 100644 --- a/v2/result/interface.go +++ b/v2/result/interface.go @@ -2,11 +2,6 @@ package result import "context" -type Catchable interface { - Catch(err *error, contexts ...context.Context) bool - CatchErr(err ErrSetter, contexts ...context.Context) bool -} - // Checkable defines types that can be checked for Ok/Error state type Checkable interface { IsOK() bool @@ -20,7 +15,12 @@ type ErrSetter interface { setErrorInner() } +type Catchable interface { + CatchErr(err *error, contexts ...context.Context) bool + Catch(err ErrSetter, contexts ...context.Context) bool +} + type UnWrapper[T any] interface { - Unwrap(setter *error, contexts ...context.Context) T - UnwrapErr(setter ErrSetter, contexts ...context.Context) T + UnwrapErr(setter *error, contexts ...context.Context) T + Unwrap(setter ErrSetter, contexts ...context.Context) T } diff --git a/v2/result/proxy_test.go b/v2/result/proxy_test.go index f5da484..058b4cd 100644 --- a/v2/result/proxy_test.go +++ b/v2/result/proxy_test.go @@ -9,7 +9,7 @@ import ( func TestProxy(t *testing.T) { var gErr error var err = ErrProxyOf(&gErr) - Errorf("test proxy error").Log().CatchErr(&err) + Errorf("test proxy error").Log().Catch(&err) assert.NotNil(t, gErr) assert.NotNil(t, err.GetErr()) assert.Equal(t, gErr, err.GetErr()) diff --git a/v2/result/result.go b/v2/result/result.go index 4b35ccd..0ac689e 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -82,11 +82,11 @@ func (r Result[T]) Must(events ...func(e *zerolog.Event)) T { return r.getValue() } -func (r Result[T]) Catch(setter *error, ctx ...context.Context) bool { +func (r Result[T]) CatchErr(setter *error, ctx ...context.Context) bool { return catchErr(newError(r.err), nil, setter, ctx...) } -func (r Result[T]) CatchErr(setter ErrSetter, ctx ...context.Context) bool { +func (r Result[T]) Catch(setter ErrSetter, ctx ...context.Context) bool { return catchErr(newError(r.err), setter, nil, ctx...) } @@ -192,7 +192,7 @@ func (r Result[T]) WrapErr(err *errors.Err, tags ...errors.Tag) Result[T] { return Result[T]{err: errors.WrapTag(errors.WrapCaller(err, 1), tags...)} } -func (r Result[T]) Unwrap(setter *error, contexts ...context.Context) T { +func (r Result[T]) UnwrapErr(setter *error, contexts ...context.Context) T { ret, err := unwrapErr(r, setter, nil, contexts...) if err != nil { *setter = errors.WrapCaller(err, 1) @@ -200,7 +200,7 @@ func (r Result[T]) Unwrap(setter *error, contexts ...context.Context) T { return ret } -func (r Result[T]) UnwrapErr(setter ErrSetter, contexts ...context.Context) T { +func (r Result[T]) Unwrap(setter ErrSetter, contexts ...context.Context) T { ret, err := unwrapErr(r, nil, setter, contexts...) if err != nil { setError(setter, errors.WrapCaller(err, 1)) diff --git a/v2/result/result_test.go b/v2/result/result_test.go index 0f74552..1a74fe2 100644 --- a/v2/result/result_test.go +++ b/v2/result/result_test.go @@ -47,17 +47,17 @@ func TestErrOf(t *testing.T) { resultchecker.RegisterErrCheck(log.RecordErr()) var err result.Error - if fn1().CatchErr(&err, ctx) { + if fn1().Catch(&err, ctx) { errors.Debug(err.GetErr()) } } func fn1() (r result.Result[string]) { - if fn3().CatchErr(&r) { + if fn3().Catch(&r) { return } - val := fn2().UnwrapErr(&r) + val := fn2().Unwrap(&r) if r.IsErr() { return } @@ -70,7 +70,7 @@ func fn2() (r result.Result[string]) { InspectErr(func(err error) { log.Err(err).Msg("test error") }). - CatchErr(&r) + Catch(&r) if r.IsErr() { return } From 4781f165f249b3d08b86c3f87346f4b5289fafed Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 17 Sep 2025 22:12:35 +0800 Subject: [PATCH 14/43] chore: quick update fix/version at 2025-09-17 22:36:02 --- metaflags/example/main.go | 77 ++++++++++ metaflags/metaflag.go | 75 ++++++++++ metaflags/types.go | 305 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 457 insertions(+) create mode 100644 metaflags/example/main.go create mode 100644 metaflags/metaflag.go create mode 100644 metaflags/types.go diff --git a/metaflags/example/main.go b/metaflags/example/main.go new file mode 100644 index 0000000..11657d5 --- /dev/null +++ b/metaflags/example/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "strings" + "time" + + "github.com/pubgo/funk/metaflags" +) + +var startTime = time.Now() + +func main() { + status := metaflags.String("app_status", "ok", "Current app status") + replicas := metaflags.Int("replicas", 1, "Number of replicas") + timeout := metaflags.Duration("timeout", 5*time.Second, "Request timeout") + features := metaflags.StringSlice("features", []string{"auth"}, "Enabled features") + labels := metaflags.StringMap("labels", map[string]string{"env": "dev"}, "Node labels") + + // 模拟更新 + go func() { + time.Sleep(2 * time.Second) + status.Set("degraded") + + time.Sleep(2 * time.Second) + replicas.Set(3) + + time.Sleep(2 * time.Second) + timeout.Set(10 * time.Second) + + time.Sleep(2 * time.Second) + features.Set([]string{"auth", "metrics", "tracing"}) + + time.Sleep(2 * time.Second) + lbls := labels.Get().(map[string]string) + lbls["updated"] = time.Now().Format("15:04") + labels.Set(lbls) + }() + + // HTTP 输出所有元数据 + http.HandleFunc("/metadata", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + fmt.Fprintln(w, "{") + first := true + metaflags.VisitAll(func(e *metaflags.Entry) { + if !first { + fmt.Fprint(w, ",") + } + first = false + fmt.Fprintf(w, "\n %q: %v", e.Name, mustJSON(e.Value.Get())) + }) + fmt.Fprintln(w, "\n}") + }) + + log.Println("Server starting on :8080") + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// 简单 JSON 转换(生产环境用 json.Marshal) +func mustJSON(v interface{}) string { + switch val := v.(type) { + case string: + return fmt.Sprintf("%q", val) + case []string: + return fmt.Sprintf("%q", val) + case map[string]string: + var parts []string + for k, v := range val { + parts = append(parts, fmt.Sprintf("%q:%q", k, v)) + } + return fmt.Sprintf("{%s}", strings.Join(parts, ",")) + default: + return fmt.Sprintf("%v", val) + } +} diff --git a/metaflags/metaflag.go b/metaflags/metaflag.go new file mode 100644 index 0000000..cb58244 --- /dev/null +++ b/metaflags/metaflag.go @@ -0,0 +1,75 @@ +package metaflags + +import ( + "github.com/pubgo/funk/assert" + "sync" +) + +// Value is the interface to the dynamic value stored in metadata. +type Value interface { + Get() any + Set(value any) error + String() string + Key() string // 返回该值的名称 +} + +// Entry holds metadata about a registered value +type Entry struct { + Name string + Value Value + Usage string +} + +// FlagSet holds a set of metadata values +type FlagSet struct { + m map[string]*Entry + mu sync.RWMutex +} + +var defaultSet = NewFlagSet() + +func NewFlagSet() *FlagSet { return &FlagSet{m: make(map[string]*Entry)} } + +func (f *FlagSet) AddFunc(name string, getter func() any, setter func(val any) error, usage string) Value { + return f.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) +} + +// Add registers a new metadata entry and injects name if supported +func (f *FlagSet) Add(name string, value Value, usage string) Value { + f.mu.Lock() + defer f.mu.Unlock() + + assert.If(value == nil, "flag value is nil") + assert.If(name == "", "flag name is empty") + assert.If(f.m[name] != nil, "flag '%s' already registered", name) + + f.m[name] = &Entry{ + Name: name, + Value: value, + Usage: usage, + } + return value +} + +// Lookup returns the Entry for the given name +func (f *FlagSet) Lookup(name string) *Entry { + f.mu.RLock() + defer f.mu.RUnlock() + return f.m[name] +} + +// VisitAll calls fn for each Entry +func (f *FlagSet) VisitAll(fn func(*Entry)) { + f.mu.RLock() + defer f.mu.RUnlock() + for _, entry := range f.m { + fn(entry) + } +} + +// Default accessors +func Lookup(name string) *Entry { return defaultSet.Lookup(name) } +func VisitAll(fn func(*Entry)) { defaultSet.VisitAll(fn) } +func Add(name string, val Value, u string) Value { + return defaultSet.Add(name, val, u) +} diff --git a/metaflags/types.go b/metaflags/types.go new file mode 100644 index 0000000..b33748d --- /dev/null +++ b/metaflags/types.go @@ -0,0 +1,305 @@ +package metaflags + +import ( + "fmt" + "strings" + "time" +) + +type StringValue struct { + p string + name string +} + +func (s *StringValue) Key() string { return s.name } + +func (s *StringValue) get() any { return s.p } +func (s *StringValue) set(val any) error { + switch v := val.(type) { + case string: + s.p = v + case fmt.Stringer: + s.p = v.String() + default: + s.p = fmt.Sprintf("%v", v) + } + return nil +} +func (s *StringValue) Get() string { return s.p } +func (s *StringValue) Set(val string) error { + s.p = val + return nil +} +func (s *StringValue) String() string { return s.p } +func String(name, value, usage string) *StringValue { + s := &StringValue{p: value, name: name} + defaultSet.AddFunc(name, s.get, s.set, usage) + return s +} + +type IntValue struct { + p *int64 + name string +} + +func (i *IntValue) Key() string { return i.name } +func (i *IntValue) Get() interface{} { return *i.p } +func (i *IntValue) Set(val interface{}) error { + var x int64 + switch v := val.(type) { + case int: + x = int64(v) + case int64: + x = v + case float64: + x = int64(v) + case string: + fmt.Sscanf(v, "%d", &x) + default: + x = int64(fmt.Sprintf("%v", v)[0]) + } + *i.p = x + return nil +} +func (i *IntValue) String() string { return fmt.Sprintf("%d", *i.p) } +func Int(name string, value int64, usage string) Value { + p := new(int64) + *p = value + return defaultSet.Add(name, &IntValue{p: p, name: name}, usage) +} + +type FloatValue struct { + p *float64 + name string +} + +func (f *FloatValue) Key() string { return f.name } +func (f *FloatValue) Get() interface{} { return *f.p } +func (f *FloatValue) Set(val interface{}) error { + var x float64 + switch v := val.(type) { + case float64: + x = v + case float32: + x = float64(v) + case int: + x = float64(v) + case int64: + x = float64(v) + case string: + fmt.Sscanf(v, "%f", &x) + default: + x = 0.0 + } + *f.p = x + return nil +} +func (f *FloatValue) String() string { return fmt.Sprintf("%g", *f.p) } +func Float(name string, value float64, usage string) Value { + p := new(float64) + *p = value + return defaultSet.Add(name, &FloatValue{p: p, name: name}, usage) +} + +type BoolValue struct { + p *bool + name string +} + +func (b *BoolValue) Key() string { return b.name } +func (b *BoolValue) Get() interface{} { return *b.p } +func (b *BoolValue) Set(val interface{}) error { + var x bool + switch v := val.(type) { + case bool: + x = v + case string: + switch strings.ToLower(v) { + case "true", "1", "on", "yes": + x = true + case "false", "0", "off", "no": + x = false + default: + x = len(v) > 0 + } + default: + x = true + } + *b.p = x + return nil +} +func (b *BoolValue) String() string { return fmt.Sprintf("%t", *b.p) } +func Bool(name string, value bool, usage string) Value { + p := new(bool) + *p = value + return defaultSet.Add(name, &BoolValue{p: p, name: name}, usage) +} + +type DurationValue struct { + p *time.Duration + name string +} + +func (d *DurationValue) Key() string { return d.name } +func (d *DurationValue) Get() interface{} { return *d.p } +func (d *DurationValue) Set(val interface{}) error { + var dur time.Duration + switch v := val.(type) { + case time.Duration: + dur = v + case string: + var err error + dur, err = time.ParseDuration(v) + if err != nil { + return err + } + case int: + dur = time.Duration(v) * time.Second + case float64: + dur = time.Duration(v * float64(time.Second)) + default: + dur = 0 + } + *d.p = dur + return nil +} +func (d *DurationValue) String() string { return (*d.p).String() } +func Duration(name string, value time.Duration, usage string) Value { + p := new(time.Duration) + *p = value + return defaultSet.Add(name, &DurationValue{p: p, name: name}, usage) +} + +type TimeValue struct { + p *time.Time + name string +} + +func (t *TimeValue) Key() string { return t.name } +func (t *TimeValue) Get() interface{} { return *t.p } +func (t *TimeValue) Set(val interface{}) error { + var tm time.Time + switch v := val.(type) { + case time.Time: + tm = v + case string: + var err error + tm, err = time.Parse(time.RFC3339, v) + if err != nil { + return err + } + case int64: + tm = time.Unix(v, 0) + default: + return fmt.Errorf("cannot convert %T to time.Time", val) + } + *t.p = tm + return nil +} +func (t *TimeValue) String() string { return (*t.p).Format(time.RFC3339) } +func Time(name string, value time.Time, usage string) Value { + p := new(time.Time) + *p = value + return defaultSet.Add(name, &TimeValue{p: p, name: name}, usage) +} + +type StringSliceValue struct { + p *[]string + name string +} + +func (s *StringSliceValue) Key() string { return s.name } +func (s *StringSliceValue) Get() interface{} { return *s.p } +func (s *StringSliceValue) Set(val interface{}) error { + var strs []string + switch v := val.(type) { + case []string: + strs = v + case []interface{}: + strs = make([]string, len(v)) + for i, item := range v { + strs[i] = fmt.Sprintf("%v", item) + } + case string: + parts := strings.Split(v, ",") + for _, part := range parts { + strs = append(strs, strings.TrimSpace(part)) + } + default: + strs = []string{fmt.Sprintf("%v", val)} + } + *s.p = strs + return nil +} +func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", *s.p) } +func StringSlice(name string, value []string, usage string) Value { + p := new([]string) + *p = append([]string(nil), value...) + return defaultSet.Add(name, &StringSliceValue{p: p, name: name}, usage) +} + +type StringMapValue struct { + p *map[string]string + name string +} + +func (m *StringMapValue) Key() string { return m.name } +func (m *StringMapValue) Get() interface{} { return *m.p } +func (m *StringMapValue) Set(val interface{}) error { + var mp map[string]string + switch v := val.(type) { + case map[string]string: + mp = v + case map[string]interface{}: + mp = make(map[string]string) + for k, vv := range v { + mp[k] = fmt.Sprintf("%v", vv) + } + case string: + mp = make(map[string]string) + pairs := strings.Split(v, ",") + for _, pair := range pairs { + kv := strings.SplitN(pair, "=", 2) + if len(kv) == 2 { + mp[kv[0]] = kv[1] + } + } + default: + mp = map[string]string{"value": fmt.Sprintf("%v", val)} + } + *m.p = mp + return nil +} +func (m *StringMapValue) String() string { return fmt.Sprintf("%v", *m.p) } +func StringMap(name string, value map[string]string, usage string) Value { + p := new(map[string]string) + *p = make(map[string]string) + for k, v := range value { + (*p)[k] = v + } + return defaultSet.Add(name, &StringMapValue{p: p, name: name}, usage) +} + +type FuncValue struct { + get func() any + set func(val any) error + name string +} + +func (f *FuncValue) Key() string { return f.name } +func (f *FuncValue) Get() any { return f.get() } +func (f *FuncValue) Set(val any) error { return f.set(val) } +func (f *FuncValue) String() string { return fmt.Sprintf("%v", f.get()) } + +func Func(name string, getter func() any, setter func(val any) error, usage string) Value { + return defaultSet.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) +} + +func Any(name string, value any, usage string) Value { + anyVal := value + return Func( + name, + func() any { return anyVal }, func(val any) error { anyVal = val; return nil }, + usage, + ) +} From 42e184ca8fc5cb489e064f1741e938455aae4361 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 17 Sep 2025 22:12:35 +0800 Subject: [PATCH 15/43] chore: quick update fix/version at 2025-09-18 14:28:25 --- monitor/example/main.go | 82 +++++++++++ monitor/monitor.go | 85 +++++++++++ monitor/types.go | 312 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 479 insertions(+) create mode 100644 monitor/example/main.go create mode 100644 monitor/monitor.go create mode 100644 monitor/types.go diff --git a/monitor/example/main.go b/monitor/example/main.go new file mode 100644 index 0000000..485059c --- /dev/null +++ b/monitor/example/main.go @@ -0,0 +1,82 @@ +// main.go +package main + +import ( + "encoding/json" + "log" + "net/http" + "time" + + "github.com/pubgo/funk/monitor" +) + +func main() { + // 创建带 Tags 的元数据 + status := monitor.String("app_status", "ok", "Current application status", + map[string]any{ + "group": "health", + "mutable": true, + }) + + replicas := monitor.Int("replicas", 1, "Number of replicas", + map[string]any{ + "group": "scaling", + "min": 1, + "max": 10, + }) + + _ = monitor.Duration("http_timeout", 5*time.Second, "HTTP request timeout", + map[string]any{ + "unit": "seconds", + "group": "network", + }) + + labels := monitor.StringMap("labels", map[string]string{"env": "dev"}, "Node labels", + map[string]any{ + "group": "metadata", + }) + + _ = monitor.String("api_key", "sk-xxxx", "API authentication key", + map[string]any{ + "sensitive": true, + "group": "security", + }) + + // 模拟更新 + go func() { + time.Sleep(2 * time.Second) + status.Set("degraded") + + time.Sleep(2 * time.Second) + replicas.Set(replicas.Get() + 2) + + time.Sleep(2 * time.Second) + current := labels.Get() + current["updated"] = time.Now().Format("15:04") + labels.Set(current) + }() + + // HTTP handler:只输出非敏感字段 + http.HandleFunc("/metadata", func(w http.ResponseWriter, r *http.Request) { + data := extractPublicMetadata() + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) + }) + + log.Println("Monitor server listening on :8080") + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// extractPublicMetadata 导出所有非敏感元数据 +func extractPublicMetadata() map[string]any { + m := make(map[string]any) + monitor.VisitAll(func(e *monitor.Entry) { + // 跳过敏感字段 + if sensitive, ok := e.Tags["sensitive"].(bool); ok && sensitive { + m[e.Name] = "******" + return + } + m[e.Name] = e.Getter() + }) + return m +} diff --git a/monitor/monitor.go b/monitor/monitor.go new file mode 100644 index 0000000..63e23c2 --- /dev/null +++ b/monitor/monitor.go @@ -0,0 +1,85 @@ +// monitor/monitor.go +package monitor + +import "sync" + +// Getter returns the current value as any +type Getter func() any + +// Setter updates the value from any +type Setter func(any) error + +// Entry holds metadata about a registered value +type Entry struct { + Name string + Getter Getter + Setter Setter + Usage string + Tags map[string]any // 自定义元数据标签 +} + +// Monitor manages all registered values +type Monitor struct { + m map[string]*Entry + mu sync.RWMutex +} + +var defaultMonitor = NewMonitor("default") + +// NewMonitor creates a new Monitor instance +func NewMonitor(name string) *Monitor { + return &Monitor{ + m: make(map[string]*Entry), + } +} + +// AddFunc registers a new value with getter, setter, usage, and optional tags +func (m *Monitor) AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { + m.mu.Lock() + defer m.mu.Unlock() + + tagMap := make(map[string]any) + if len(tags) > 0 && tags[0] != nil { + for k, v := range tags[0] { + tagMap[k] = v + } + } + + m.m[name] = &Entry{ + Name: name, + Getter: get, + Setter: set, + Usage: usage, + Tags: tagMap, + } +} + +// Lookup returns the entry by name +func (m *Monitor) Lookup(name string) *Entry { + m.mu.RLock() + defer m.mu.RUnlock() + return m.m[name] +} + +// VisitAll calls fn for each entry +func (m *Monitor) VisitAll(fn func(*Entry)) { + m.mu.RLock() + defer m.mu.RUnlock() + for _, e := range m.m { + fn(e) + } +} + +// Global functions (use defaultMonitor) + +func AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { + defaultMonitor.AddFunc(name, get, set, usage, tags...) +} + +func Lookup(name string) *Entry { + return defaultMonitor.Lookup(name) +} + +func VisitAll(fn func(*Entry)) { + defaultMonitor.VisitAll(fn) +} diff --git a/monitor/types.go b/monitor/types.go new file mode 100644 index 0000000..900b281 --- /dev/null +++ b/monitor/types.go @@ -0,0 +1,312 @@ +// monitor/types.go +package monitor + +import ( + "fmt" + "strings" + "time" +) + +// mergeTags safely copies optional tags +func mergeTags(maps ...map[string]any) map[string]any { + if len(maps) == 0 || maps[0] == nil { + return make(map[string]any) + } + m := make(map[string]any) + for k, v := range maps[0] { + m[k] = v + } + return m +} + +// === StringValue === +type StringValue struct { + p string + name string +} + +func (s *StringValue) Key() string { return s.name } +func (s *StringValue) get() any { return s.p } +func (s *StringValue) set(val any) error { + switch v := val.(type) { + case string: + s.p = v + case fmt.Stringer: + s.p = v.String() + default: + s.p = fmt.Sprintf("%v", v) + } + return nil +} +func (s *StringValue) Get() string { return s.p } +func (s *StringValue) Set(val string) { _ = s.set(val) } +func (s *StringValue) String() string { return s.p } + +func String(name, value, usage string, tags ...map[string]any) *StringValue { + s := &StringValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, s.get, s.set, usage, tagCopy) + return s +} + +// === IntValue === +type IntValue struct { + p int64 + name string +} + +func (i *IntValue) Key() string { return i.name } +func (i *IntValue) get() any { return i.p } +func (i *IntValue) set(val any) error { + var x int64 + switch v := val.(type) { + case int: + x = int64(v) + case int64: + x = v + case float64: + x = int64(v) + case string: + fmt.Sscanf(v, "%d", &x) + default: + x = 0 + } + i.p = x + return nil +} +func (i *IntValue) Get() int64 { return i.p } +func (i *IntValue) Set(val int64) { _ = i.set(val) } +func (i *IntValue) String() string { return fmt.Sprintf("%d", i.p) } + +func Int(name string, value int64, usage string, tags ...map[string]any) *IntValue { + i := &IntValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, i.get, i.set, usage, tagCopy) + return i +} + +// === FloatValue === +type FloatValue struct { + p float64 + name string +} + +func (f *FloatValue) Key() string { return f.name } +func (f *FloatValue) get() any { return f.p } +func (f *FloatValue) set(val any) error { + var x float64 + switch v := val.(type) { + case float64: + x = v + case float32: + x = float64(v) + case int: + x = float64(v) + case int64: + x = float64(v) + case string: + fmt.Sscanf(v, "%f", &x) + default: + x = 0.0 + } + f.p = x + return nil +} +func (f *FloatValue) Get() float64 { return f.p } +func (f *FloatValue) Set(val float64) { _ = f.set(val) } +func (f *FloatValue) String() string { return fmt.Sprintf("%g", f.p) } + +func Float(name string, value float64, usage string, tags ...map[string]any) *FloatValue { + f := &FloatValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, f.get, f.set, usage, tagCopy) + return f +} + +// === BoolValue === +type BoolValue struct { + p bool + name string +} + +func (b *BoolValue) Key() string { return b.name } +func (b *BoolValue) get() any { return b.p } +func (b *BoolValue) set(val any) error { + var x bool + switch v := val.(type) { + case bool: + x = v + case string: + switch strings.ToLower(v) { + case "true", "1", "on", "yes": + x = true + case "false", "0", "off", "no": + x = false + default: + x = len(v) > 0 + } + default: + x = true + } + b.p = x + return nil +} +func (b *BoolValue) Get() bool { return b.p } +func (b *BoolValue) Set(val bool) { _ = b.set(val) } +func (b *BoolValue) String() string { return fmt.Sprintf("%t", b.p) } + +func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolValue { + b := &BoolValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, b.get, b.set, usage, tagCopy) + return b +} + +// === DurationValue === +type DurationValue struct { + p time.Duration + name string +} + +func (d *DurationValue) Key() string { return d.name } +func (d *DurationValue) get() any { return d.p } +func (d *DurationValue) set(val any) error { + var dur time.Duration + switch v := val.(type) { + case time.Duration: + dur = v + case string: + var err error + dur, err = time.ParseDuration(v) + if err != nil { + return err + } + default: + return fmt.Errorf("cannot convert %T to time.Duration", val) + } + d.p = dur + return nil +} +func (d *DurationValue) Get() time.Duration { return d.p } +func (d *DurationValue) Set(val time.Duration) { _ = d.set(val) } +func (d *DurationValue) String() string { return d.p.String() } + +func Duration(name string, value time.Duration, usage string, tags ...map[string]any) *DurationValue { + d := &DurationValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, d.get, d.set, usage, tagCopy) + return d +} + +// === TimeValue === +type TimeValue struct { + p time.Time + name string +} + +func (t *TimeValue) Key() string { return t.name } +func (t *TimeValue) get() any { return t.p } +func (t *TimeValue) set(val any) error { + var tm time.Time + switch v := val.(type) { + case time.Time: + tm = v + case string: + var err error + tm, err = time.Parse(time.RFC3339, v) + if err != nil { + return err + } + case int64: + tm = time.Unix(v, 0) + default: + return fmt.Errorf("cannot convert %T to time.Time", val) + } + t.p = tm + return nil +} +func (t *TimeValue) Get() time.Time { return t.p } +func (t *TimeValue) Set(val time.Time) { _ = t.set(val) } +func (t *TimeValue) String() string { return t.p.Format(time.RFC3339) } + +func Time(name string, value time.Time, usage string, tags ...map[string]any) *TimeValue { + t := &TimeValue{p: value, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, t.get, t.set, usage, tagCopy) + return t +} + +// === StringSliceValue === +type StringSliceValue struct { + p []string + name string +} + +func (s *StringSliceValue) Key() string { return s.name } +func (s *StringSliceValue) get() any { return s.p } +func (s *StringSliceValue) set(val any) error { + var strs []string + switch v := val.(type) { + case []string: + strs = v + case []interface{}: + strs = make([]string, len(v)) + for i, item := range v { + strs[i] = fmt.Sprintf("%v", item) + } + default: + strs = []string{fmt.Sprintf("%v", val)} + } + s.p = strs + return nil +} +func (s *StringSliceValue) Get() []string { return s.p } +func (s *StringSliceValue) Set(val []string) { _ = s.set(val) } +func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", s.p) } + +func StringSlice(name string, value []string, usage string, tags ...map[string]any) *StringSliceValue { + cp := append([]string(nil), value...) + s := &StringSliceValue{p: cp, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, s.get, s.set, usage, tagCopy) + return s +} + +// === StringMapValue === +type StringMapValue struct { + p map[string]string + name string +} + +func (m *StringMapValue) Key() string { return m.name } +func (m *StringMapValue) get() any { return m.p } +func (m *StringMapValue) set(val any) error { + var mp map[string]string + switch v := val.(type) { + case map[string]string: + mp = v + case map[string]interface{}: + mp = make(map[string]string) + for k, vv := range v { + mp[k] = fmt.Sprintf("%v", vv) + } + default: + return fmt.Errorf("cannot convert %T to map[string]string", val) + } + m.p = mp + return nil +} +func (m *StringMapValue) Get() map[string]string { return m.p } +func (m *StringMapValue) Set(val map[string]string) { _ = m.set(val) } +func (m *StringMapValue) String() string { return fmt.Sprintf("%v", m.p) } + +func StringMap(name string, value map[string]string, usage string, tags ...map[string]any) *StringMapValue { + cp := make(map[string]string) + for k, v := range value { + cp[k] = v + } + m := &StringMapValue{p: cp, name: name} + tagCopy := mergeTags(tags...) + defaultMonitor.AddFunc(name, m.get, m.set, usage, tagCopy) + return m +} From 60706fd9b2f549b3c8e1dbc7898317482083dc10 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 18 Sep 2025 19:56:43 +0800 Subject: [PATCH 16/43] chore: quick update fix/version at 2025-09-19 20:56:03 --- assert/must.go | 4 +- async/go.go | 2 +- errors/errors.go | 3 +- errors/must.go | 47 ---- metaflags/example/main.go | 77 ------ metaflags/metaflag.go | 75 ------ metaflags/types.go | 305 ----------------------- {monitor => monster}/example/main.go | 22 +- monitor/monitor.go => monster/monster.go | 29 +-- {monitor => monster}/types.go | 143 ++++------- running/runtime.go | 12 +- running/util.go | 2 +- stack/util.go | 8 +- v2/result/api.go | 24 +- v2/result/error.go | 4 +- v2/result/result.go | 4 +- v2/result/result_test.go | 5 + v2/result/resultchecker/checker.go | 4 + v2/result/util.go | 13 +- 19 files changed, 127 insertions(+), 656 deletions(-) delete mode 100644 errors/must.go delete mode 100644 metaflags/example/main.go delete mode 100644 metaflags/metaflag.go delete mode 100644 metaflags/types.go rename {monitor => monster}/example/main.go (66%) rename monitor/monitor.go => monster/monster.go (67%) rename {monitor => monster}/types.go (52%) diff --git a/assert/must.go b/assert/must.go index 441e788..3d8e383 100644 --- a/assert/must.go +++ b/assert/must.go @@ -32,9 +32,9 @@ func MustF(err error, msg string, args ...interface{}) { must(err, fmt.Sprintf(msg, args...)) } -func Must1[T any](ret T, err error, args ...any) T { +func Must1[T any](ret T, err error) T { if err != nil { - must(err, args...) + must(err) } return ret diff --git a/async/go.go b/async/go.go index 455bfe3..0edd939 100644 --- a/async/go.go +++ b/async/go.go @@ -124,7 +124,7 @@ func logErr(fn interface{}, err error) { return } - if running.IsDebug { + if running.Debug() { debug.PrintStack() errors.Debug(err) } diff --git a/errors/errors.go b/errors/errors.go index 0c83112..0e94c2b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "reflect" - "runtime/debug" "github.com/rs/xid" "github.com/samber/lo" @@ -116,7 +115,7 @@ func WrapStack(err error) error { return nil } - debug.PrintStack() + stack.PrintStack() return &ErrWrap{ err: handleGrpcError(err), pb: &errorpb.ErrWrap{ diff --git a/errors/must.go b/errors/must.go deleted file mode 100644 index 347cd1f..0000000 --- a/errors/must.go +++ /dev/null @@ -1,47 +0,0 @@ -package errors - -import ( - "fmt" - "os" - - "github.com/pubgo/funk/assert" -) - -func Must(err error, args ...interface{}) { - assert.Must(err, args...) -} - -func MustF(err error, msg string, args ...interface{}) { - assert.MustF(err, msg, args...) -} - -func Must1[T any](ret T, err error) T { - return assert.Must1(ret, err) -} - -func Exit(err error, args ...interface{}) { - if err == nil { - return - } - - Debug(WrapStack(Wrap(err, fmt.Sprint(args...)))) - os.Exit(1) -} - -func ExitF(err error, msg string, args ...interface{}) { - if err == nil { - return - } - - Debug(WrapStack(Wrapf(err, msg, args...))) - os.Exit(1) -} - -func Exit1[T any](ret T, err error) T { - if err != nil { - Debug(WrapStack(err)) - os.Exit(1) - } - - return ret -} diff --git a/metaflags/example/main.go b/metaflags/example/main.go deleted file mode 100644 index 11657d5..0000000 --- a/metaflags/example/main.go +++ /dev/null @@ -1,77 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/pubgo/funk/metaflags" -) - -var startTime = time.Now() - -func main() { - status := metaflags.String("app_status", "ok", "Current app status") - replicas := metaflags.Int("replicas", 1, "Number of replicas") - timeout := metaflags.Duration("timeout", 5*time.Second, "Request timeout") - features := metaflags.StringSlice("features", []string{"auth"}, "Enabled features") - labels := metaflags.StringMap("labels", map[string]string{"env": "dev"}, "Node labels") - - // 模拟更新 - go func() { - time.Sleep(2 * time.Second) - status.Set("degraded") - - time.Sleep(2 * time.Second) - replicas.Set(3) - - time.Sleep(2 * time.Second) - timeout.Set(10 * time.Second) - - time.Sleep(2 * time.Second) - features.Set([]string{"auth", "metrics", "tracing"}) - - time.Sleep(2 * time.Second) - lbls := labels.Get().(map[string]string) - lbls["updated"] = time.Now().Format("15:04") - labels.Set(lbls) - }() - - // HTTP 输出所有元数据 - http.HandleFunc("/metadata", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - fmt.Fprintln(w, "{") - first := true - metaflags.VisitAll(func(e *metaflags.Entry) { - if !first { - fmt.Fprint(w, ",") - } - first = false - fmt.Fprintf(w, "\n %q: %v", e.Name, mustJSON(e.Value.Get())) - }) - fmt.Fprintln(w, "\n}") - }) - - log.Println("Server starting on :8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -// 简单 JSON 转换(生产环境用 json.Marshal) -func mustJSON(v interface{}) string { - switch val := v.(type) { - case string: - return fmt.Sprintf("%q", val) - case []string: - return fmt.Sprintf("%q", val) - case map[string]string: - var parts []string - for k, v := range val { - parts = append(parts, fmt.Sprintf("%q:%q", k, v)) - } - return fmt.Sprintf("{%s}", strings.Join(parts, ",")) - default: - return fmt.Sprintf("%v", val) - } -} diff --git a/metaflags/metaflag.go b/metaflags/metaflag.go deleted file mode 100644 index cb58244..0000000 --- a/metaflags/metaflag.go +++ /dev/null @@ -1,75 +0,0 @@ -package metaflags - -import ( - "github.com/pubgo/funk/assert" - "sync" -) - -// Value is the interface to the dynamic value stored in metadata. -type Value interface { - Get() any - Set(value any) error - String() string - Key() string // 返回该值的名称 -} - -// Entry holds metadata about a registered value -type Entry struct { - Name string - Value Value - Usage string -} - -// FlagSet holds a set of metadata values -type FlagSet struct { - m map[string]*Entry - mu sync.RWMutex -} - -var defaultSet = NewFlagSet() - -func NewFlagSet() *FlagSet { return &FlagSet{m: make(map[string]*Entry)} } - -func (f *FlagSet) AddFunc(name string, getter func() any, setter func(val any) error, usage string) Value { - return f.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) -} - -// Add registers a new metadata entry and injects name if supported -func (f *FlagSet) Add(name string, value Value, usage string) Value { - f.mu.Lock() - defer f.mu.Unlock() - - assert.If(value == nil, "flag value is nil") - assert.If(name == "", "flag name is empty") - assert.If(f.m[name] != nil, "flag '%s' already registered", name) - - f.m[name] = &Entry{ - Name: name, - Value: value, - Usage: usage, - } - return value -} - -// Lookup returns the Entry for the given name -func (f *FlagSet) Lookup(name string) *Entry { - f.mu.RLock() - defer f.mu.RUnlock() - return f.m[name] -} - -// VisitAll calls fn for each Entry -func (f *FlagSet) VisitAll(fn func(*Entry)) { - f.mu.RLock() - defer f.mu.RUnlock() - for _, entry := range f.m { - fn(entry) - } -} - -// Default accessors -func Lookup(name string) *Entry { return defaultSet.Lookup(name) } -func VisitAll(fn func(*Entry)) { defaultSet.VisitAll(fn) } -func Add(name string, val Value, u string) Value { - return defaultSet.Add(name, val, u) -} diff --git a/metaflags/types.go b/metaflags/types.go deleted file mode 100644 index b33748d..0000000 --- a/metaflags/types.go +++ /dev/null @@ -1,305 +0,0 @@ -package metaflags - -import ( - "fmt" - "strings" - "time" -) - -type StringValue struct { - p string - name string -} - -func (s *StringValue) Key() string { return s.name } - -func (s *StringValue) get() any { return s.p } -func (s *StringValue) set(val any) error { - switch v := val.(type) { - case string: - s.p = v - case fmt.Stringer: - s.p = v.String() - default: - s.p = fmt.Sprintf("%v", v) - } - return nil -} -func (s *StringValue) Get() string { return s.p } -func (s *StringValue) Set(val string) error { - s.p = val - return nil -} -func (s *StringValue) String() string { return s.p } -func String(name, value, usage string) *StringValue { - s := &StringValue{p: value, name: name} - defaultSet.AddFunc(name, s.get, s.set, usage) - return s -} - -type IntValue struct { - p *int64 - name string -} - -func (i *IntValue) Key() string { return i.name } -func (i *IntValue) Get() interface{} { return *i.p } -func (i *IntValue) Set(val interface{}) error { - var x int64 - switch v := val.(type) { - case int: - x = int64(v) - case int64: - x = v - case float64: - x = int64(v) - case string: - fmt.Sscanf(v, "%d", &x) - default: - x = int64(fmt.Sprintf("%v", v)[0]) - } - *i.p = x - return nil -} -func (i *IntValue) String() string { return fmt.Sprintf("%d", *i.p) } -func Int(name string, value int64, usage string) Value { - p := new(int64) - *p = value - return defaultSet.Add(name, &IntValue{p: p, name: name}, usage) -} - -type FloatValue struct { - p *float64 - name string -} - -func (f *FloatValue) Key() string { return f.name } -func (f *FloatValue) Get() interface{} { return *f.p } -func (f *FloatValue) Set(val interface{}) error { - var x float64 - switch v := val.(type) { - case float64: - x = v - case float32: - x = float64(v) - case int: - x = float64(v) - case int64: - x = float64(v) - case string: - fmt.Sscanf(v, "%f", &x) - default: - x = 0.0 - } - *f.p = x - return nil -} -func (f *FloatValue) String() string { return fmt.Sprintf("%g", *f.p) } -func Float(name string, value float64, usage string) Value { - p := new(float64) - *p = value - return defaultSet.Add(name, &FloatValue{p: p, name: name}, usage) -} - -type BoolValue struct { - p *bool - name string -} - -func (b *BoolValue) Key() string { return b.name } -func (b *BoolValue) Get() interface{} { return *b.p } -func (b *BoolValue) Set(val interface{}) error { - var x bool - switch v := val.(type) { - case bool: - x = v - case string: - switch strings.ToLower(v) { - case "true", "1", "on", "yes": - x = true - case "false", "0", "off", "no": - x = false - default: - x = len(v) > 0 - } - default: - x = true - } - *b.p = x - return nil -} -func (b *BoolValue) String() string { return fmt.Sprintf("%t", *b.p) } -func Bool(name string, value bool, usage string) Value { - p := new(bool) - *p = value - return defaultSet.Add(name, &BoolValue{p: p, name: name}, usage) -} - -type DurationValue struct { - p *time.Duration - name string -} - -func (d *DurationValue) Key() string { return d.name } -func (d *DurationValue) Get() interface{} { return *d.p } -func (d *DurationValue) Set(val interface{}) error { - var dur time.Duration - switch v := val.(type) { - case time.Duration: - dur = v - case string: - var err error - dur, err = time.ParseDuration(v) - if err != nil { - return err - } - case int: - dur = time.Duration(v) * time.Second - case float64: - dur = time.Duration(v * float64(time.Second)) - default: - dur = 0 - } - *d.p = dur - return nil -} -func (d *DurationValue) String() string { return (*d.p).String() } -func Duration(name string, value time.Duration, usage string) Value { - p := new(time.Duration) - *p = value - return defaultSet.Add(name, &DurationValue{p: p, name: name}, usage) -} - -type TimeValue struct { - p *time.Time - name string -} - -func (t *TimeValue) Key() string { return t.name } -func (t *TimeValue) Get() interface{} { return *t.p } -func (t *TimeValue) Set(val interface{}) error { - var tm time.Time - switch v := val.(type) { - case time.Time: - tm = v - case string: - var err error - tm, err = time.Parse(time.RFC3339, v) - if err != nil { - return err - } - case int64: - tm = time.Unix(v, 0) - default: - return fmt.Errorf("cannot convert %T to time.Time", val) - } - *t.p = tm - return nil -} -func (t *TimeValue) String() string { return (*t.p).Format(time.RFC3339) } -func Time(name string, value time.Time, usage string) Value { - p := new(time.Time) - *p = value - return defaultSet.Add(name, &TimeValue{p: p, name: name}, usage) -} - -type StringSliceValue struct { - p *[]string - name string -} - -func (s *StringSliceValue) Key() string { return s.name } -func (s *StringSliceValue) Get() interface{} { return *s.p } -func (s *StringSliceValue) Set(val interface{}) error { - var strs []string - switch v := val.(type) { - case []string: - strs = v - case []interface{}: - strs = make([]string, len(v)) - for i, item := range v { - strs[i] = fmt.Sprintf("%v", item) - } - case string: - parts := strings.Split(v, ",") - for _, part := range parts { - strs = append(strs, strings.TrimSpace(part)) - } - default: - strs = []string{fmt.Sprintf("%v", val)} - } - *s.p = strs - return nil -} -func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", *s.p) } -func StringSlice(name string, value []string, usage string) Value { - p := new([]string) - *p = append([]string(nil), value...) - return defaultSet.Add(name, &StringSliceValue{p: p, name: name}, usage) -} - -type StringMapValue struct { - p *map[string]string - name string -} - -func (m *StringMapValue) Key() string { return m.name } -func (m *StringMapValue) Get() interface{} { return *m.p } -func (m *StringMapValue) Set(val interface{}) error { - var mp map[string]string - switch v := val.(type) { - case map[string]string: - mp = v - case map[string]interface{}: - mp = make(map[string]string) - for k, vv := range v { - mp[k] = fmt.Sprintf("%v", vv) - } - case string: - mp = make(map[string]string) - pairs := strings.Split(v, ",") - for _, pair := range pairs { - kv := strings.SplitN(pair, "=", 2) - if len(kv) == 2 { - mp[kv[0]] = kv[1] - } - } - default: - mp = map[string]string{"value": fmt.Sprintf("%v", val)} - } - *m.p = mp - return nil -} -func (m *StringMapValue) String() string { return fmt.Sprintf("%v", *m.p) } -func StringMap(name string, value map[string]string, usage string) Value { - p := new(map[string]string) - *p = make(map[string]string) - for k, v := range value { - (*p)[k] = v - } - return defaultSet.Add(name, &StringMapValue{p: p, name: name}, usage) -} - -type FuncValue struct { - get func() any - set func(val any) error - name string -} - -func (f *FuncValue) Key() string { return f.name } -func (f *FuncValue) Get() any { return f.get() } -func (f *FuncValue) Set(val any) error { return f.set(val) } -func (f *FuncValue) String() string { return fmt.Sprintf("%v", f.get()) } - -func Func(name string, getter func() any, setter func(val any) error, usage string) Value { - return defaultSet.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) -} - -func Any(name string, value any, usage string) Value { - anyVal := value - return Func( - name, - func() any { return anyVal }, func(val any) error { anyVal = val; return nil }, - usage, - ) -} diff --git a/monitor/example/main.go b/monster/example/main.go similarity index 66% rename from monitor/example/main.go rename to monster/example/main.go index 485059c..f8d1903 100644 --- a/monitor/example/main.go +++ b/monster/example/main.go @@ -7,36 +7,31 @@ import ( "net/http" "time" - "github.com/pubgo/funk/monitor" + "github.com/pubgo/funk/monster" ) func main() { // 创建带 Tags 的元数据 - status := monitor.String("app_status", "ok", "Current application status", + status := monster.String("app_status", "ok", "Current application status", map[string]any{ "group": "health", "mutable": true, }) - replicas := monitor.Int("replicas", 1, "Number of replicas", + replicas := monster.Int("replicas", 1, "Number of replicas", map[string]any{ "group": "scaling", "min": 1, "max": 10, }) - _ = monitor.Duration("http_timeout", 5*time.Second, "HTTP request timeout", + _ = monster.Duration("http_timeout", 5*time.Second, "HTTP request timeout", map[string]any{ "unit": "seconds", "group": "network", }) - labels := monitor.StringMap("labels", map[string]string{"env": "dev"}, "Node labels", - map[string]any{ - "group": "metadata", - }) - - _ = monitor.String("api_key", "sk-xxxx", "API authentication key", + _ = monster.String("api_key", "sk-xxxx", "API authentication key", map[string]any{ "sensitive": true, "group": "security", @@ -51,9 +46,6 @@ func main() { replicas.Set(replicas.Get() + 2) time.Sleep(2 * time.Second) - current := labels.Get() - current["updated"] = time.Now().Format("15:04") - labels.Set(current) }() // HTTP handler:只输出非敏感字段 @@ -63,14 +55,14 @@ func main() { json.NewEncoder(w).Encode(data) }) - log.Println("Monitor server listening on :8080") + log.Println("Monster server listening on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) } // extractPublicMetadata 导出所有非敏感元数据 func extractPublicMetadata() map[string]any { m := make(map[string]any) - monitor.VisitAll(func(e *monitor.Entry) { + monster.VisitAll(func(e *monster.Entry) { // 跳过敏感字段 if sensitive, ok := e.Tags["sensitive"].(bool); ok && sensitive { m[e.Name] = "******" diff --git a/monitor/monitor.go b/monster/monster.go similarity index 67% rename from monitor/monitor.go rename to monster/monster.go index 63e23c2..1d9714d 100644 --- a/monitor/monitor.go +++ b/monster/monster.go @@ -1,5 +1,4 @@ -// monitor/monitor.go -package monitor +package monster import "sync" @@ -18,23 +17,23 @@ type Entry struct { Tags map[string]any // 自定义元数据标签 } -// Monitor manages all registered values -type Monitor struct { +// Monster manages all registered values +type Monster struct { m map[string]*Entry mu sync.RWMutex } -var defaultMonitor = NewMonitor("default") +var defaultMonster = NewMonster() -// NewMonitor creates a new Monitor instance -func NewMonitor(name string) *Monitor { - return &Monitor{ +// NewMonster creates a new Monster instance +func NewMonster() *Monster { + return &Monster{ m: make(map[string]*Entry), } } // AddFunc registers a new value with getter, setter, usage, and optional tags -func (m *Monitor) AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { +func (m *Monster) AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { m.mu.Lock() defer m.mu.Unlock() @@ -55,14 +54,14 @@ func (m *Monitor) AddFunc(name string, get Getter, set Setter, usage string, tag } // Lookup returns the entry by name -func (m *Monitor) Lookup(name string) *Entry { +func (m *Monster) Lookup(name string) *Entry { m.mu.RLock() defer m.mu.RUnlock() return m.m[name] } // VisitAll calls fn for each entry -func (m *Monitor) VisitAll(fn func(*Entry)) { +func (m *Monster) VisitAll(fn func(*Entry)) { m.mu.RLock() defer m.mu.RUnlock() for _, e := range m.m { @@ -70,16 +69,14 @@ func (m *Monitor) VisitAll(fn func(*Entry)) { } } -// Global functions (use defaultMonitor) - func AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { - defaultMonitor.AddFunc(name, get, set, usage, tags...) + defaultMonster.AddFunc(name, get, set, usage, tags...) } func Lookup(name string) *Entry { - return defaultMonitor.Lookup(name) + return defaultMonster.Lookup(name) } func VisitAll(fn func(*Entry)) { - defaultMonitor.VisitAll(fn) + defaultMonster.VisitAll(fn) } diff --git a/monitor/types.go b/monster/types.go similarity index 52% rename from monitor/types.go rename to monster/types.go index 900b281..1fc58dc 100644 --- a/monitor/types.go +++ b/monster/types.go @@ -1,7 +1,7 @@ -// monitor/types.go -package monitor +package monster import ( + "encoding/json" "fmt" "strings" "time" @@ -19,7 +19,6 @@ func mergeTags(maps ...map[string]any) map[string]any { return m } -// === StringValue === type StringValue struct { p string name string @@ -38,18 +37,17 @@ func (s *StringValue) set(val any) error { } return nil } -func (s *StringValue) Get() string { return s.p } -func (s *StringValue) Set(val string) { _ = s.set(val) } -func (s *StringValue) String() string { return s.p } +func (s *StringValue) Get() string { return s.p } +func (s *StringValue) Set(val string) error { return s.set(val) } +func (s *StringValue) String() string { return s.p } func String(name, value, usage string, tags ...map[string]any) *StringValue { s := &StringValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, s.get, s.set, usage, tagCopy) + defaultMonster.AddFunc(name, s.get, s.set, usage, tagCopy) return s } -// === IntValue === type IntValue struct { p int64 name string @@ -74,18 +72,17 @@ func (i *IntValue) set(val any) error { i.p = x return nil } -func (i *IntValue) Get() int64 { return i.p } -func (i *IntValue) Set(val int64) { _ = i.set(val) } -func (i *IntValue) String() string { return fmt.Sprintf("%d", i.p) } +func (i *IntValue) Get() int64 { return i.p } +func (i *IntValue) Set(val int64) error { return i.set(val) } +func (i *IntValue) String() string { return fmt.Sprintf("%d", i.p) } func Int(name string, value int64, usage string, tags ...map[string]any) *IntValue { i := &IntValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, i.get, i.set, usage, tagCopy) + defaultMonster.AddFunc(name, i.get, i.set, usage, tagCopy) return i } -// === FloatValue === type FloatValue struct { p float64 name string @@ -112,18 +109,17 @@ func (f *FloatValue) set(val any) error { f.p = x return nil } -func (f *FloatValue) Get() float64 { return f.p } -func (f *FloatValue) Set(val float64) { _ = f.set(val) } -func (f *FloatValue) String() string { return fmt.Sprintf("%g", f.p) } +func (f *FloatValue) Get() float64 { return f.p } +func (f *FloatValue) Set(val float64) error { return f.set(val) } +func (f *FloatValue) String() string { return fmt.Sprintf("%g", f.p) } func Float(name string, value float64, usage string, tags ...map[string]any) *FloatValue { f := &FloatValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, f.get, f.set, usage, tagCopy) + defaultMonster.AddFunc(name, f.get, f.set, usage, tagCopy) return f } -// === BoolValue === type BoolValue struct { p bool name string @@ -151,18 +147,17 @@ func (b *BoolValue) set(val any) error { b.p = x return nil } -func (b *BoolValue) Get() bool { return b.p } -func (b *BoolValue) Set(val bool) { _ = b.set(val) } -func (b *BoolValue) String() string { return fmt.Sprintf("%t", b.p) } +func (b *BoolValue) Get() bool { return b.p } +func (b *BoolValue) Set(val bool) error { return b.set(val) } +func (b *BoolValue) String() string { return fmt.Sprintf("%t", b.p) } func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolValue { b := &BoolValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, b.get, b.set, usage, tagCopy) + defaultMonster.AddFunc(name, b.get, b.set, usage, tagCopy) return b } -// === DurationValue === type DurationValue struct { p time.Duration name string @@ -187,18 +182,17 @@ func (d *DurationValue) set(val any) error { d.p = dur return nil } -func (d *DurationValue) Get() time.Duration { return d.p } -func (d *DurationValue) Set(val time.Duration) { _ = d.set(val) } -func (d *DurationValue) String() string { return d.p.String() } +func (d *DurationValue) Get() time.Duration { return d.p } +func (d *DurationValue) Set(val time.Duration) error { return d.set(val) } +func (d *DurationValue) String() string { return d.p.String() } func Duration(name string, value time.Duration, usage string, tags ...map[string]any) *DurationValue { d := &DurationValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, d.get, d.set, usage, tagCopy) + defaultMonster.AddFunc(name, d.get, d.set, usage, tagCopy) return d } -// === TimeValue === type TimeValue struct { p time.Time name string @@ -225,88 +219,49 @@ func (t *TimeValue) set(val any) error { t.p = tm return nil } -func (t *TimeValue) Get() time.Time { return t.p } -func (t *TimeValue) Set(val time.Time) { _ = t.set(val) } -func (t *TimeValue) String() string { return t.p.Format(time.RFC3339) } +func (t *TimeValue) Get() time.Time { return t.p } +func (t *TimeValue) Set(val time.Time) error { return t.set(val) } +func (t *TimeValue) String() string { return t.p.Format(time.RFC3339) } func Time(name string, value time.Time, usage string, tags ...map[string]any) *TimeValue { t := &TimeValue{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, t.get, t.set, usage, tagCopy) + defaultMonster.AddFunc(name, t.get, t.set, usage, tagCopy) return t } -// === StringSliceValue === -type StringSliceValue struct { - p []string +// + +type JsonValue[T any] struct { + p T name string } -func (s *StringSliceValue) Key() string { return s.name } -func (s *StringSliceValue) get() any { return s.p } -func (s *StringSliceValue) set(val any) error { - var strs []string - switch v := val.(type) { - case []string: - strs = v - case []interface{}: - strs = make([]string, len(v)) - for i, item := range v { - strs[i] = fmt.Sprintf("%v", item) - } - default: - strs = []string{fmt.Sprintf("%v", val)} +func (t *JsonValue[T]) Key() string { return t.name } +func (t *JsonValue[T]) get() any { + data, err := json.Marshal(t.p) + if err != nil { + return err } - s.p = strs - return nil -} -func (s *StringSliceValue) Get() []string { return s.p } -func (s *StringSliceValue) Set(val []string) { _ = s.set(val) } -func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", s.p) } - -func StringSlice(name string, value []string, usage string, tags ...map[string]any) *StringSliceValue { - cp := append([]string(nil), value...) - s := &StringSliceValue{p: cp, name: name} - tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, s.get, s.set, usage, tagCopy) - return s + return data } -// === StringMapValue === -type StringMapValue struct { - p map[string]string - name string +func (t *JsonValue[T]) set(val any) error { + return json.Unmarshal(val.([]byte), &t.p) } - -func (m *StringMapValue) Key() string { return m.name } -func (m *StringMapValue) get() any { return m.p } -func (m *StringMapValue) set(val any) error { - var mp map[string]string - switch v := val.(type) { - case map[string]string: - mp = v - case map[string]interface{}: - mp = make(map[string]string) - for k, vv := range v { - mp[k] = fmt.Sprintf("%v", vv) - } - default: - return fmt.Errorf("cannot convert %T to map[string]string", val) +func (t *JsonValue[T]) Get() T { return t.p } +func (t *JsonValue[T]) Set(val T) error { return t.set(val) } +func (t *JsonValue[T]) String() string { + data, err := json.Marshal(t.p) + if err != nil { + return err.Error() } - m.p = mp - return nil + return string(data) } -func (m *StringMapValue) Get() map[string]string { return m.p } -func (m *StringMapValue) Set(val map[string]string) { _ = m.set(val) } -func (m *StringMapValue) String() string { return fmt.Sprintf("%v", m.p) } -func StringMap(name string, value map[string]string, usage string, tags ...map[string]any) *StringMapValue { - cp := make(map[string]string) - for k, v := range value { - cp[k] = v - } - m := &StringMapValue{p: cp, name: name} +func Json[T any](name string, value T, usage string, tags ...map[string]any) *JsonValue[T] { + t := &JsonValue[T]{p: value, name: name} tagCopy := mergeTags(tags...) - defaultMonitor.AddFunc(name, m.get, m.set, usage, tagCopy) - return m + defaultMonster.AddFunc(name, t.get, t.set, usage, tagCopy) + return t } diff --git a/running/runtime.go b/running/runtime.go index dbf3952..ba58fe4 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -9,6 +9,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/env" + "github.com/pubgo/funk/monster" "github.com/pubgo/funk/netutil" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/strutil" @@ -21,7 +22,10 @@ var ( GrpcPort = 50051 Project = version.Project() - Env = "debug" + Env = "debug" + + // IsDebug + // Deprecated: use Debug IsDebug = true // InstanceID service id @@ -58,8 +62,14 @@ var ( ) Domain string + + enableDebug = monster.Bool("debug", false, "enable debug") ) +func Debug() bool { + return IsDebug || enableDebug.Get() +} + func init() { env.GetBoolVal(&IsDebug, "enable_debug", "debug", "dev_mode") env.GetVal(&Env, "env", "run_mode", "run_env") diff --git a/running/util.go b/running/util.go index f7aaf44..8984938 100644 --- a/running/util.go +++ b/running/util.go @@ -20,7 +20,7 @@ func GetSysInfo() map[string]string { "main_path": version.MainPath(), "grpc_port": fmt.Sprintf("%v", GrpcPort), "http_post": fmt.Sprintf("%v", HttpPort), - "debug": fmt.Sprintf("%v", IsDebug), + "debug": fmt.Sprintf("%v", Debug()), "cur_dir": Pwd, "local_ip": LocalIP, "namespace": Namespace, diff --git a/stack/util.go b/stack/util.go index 4a8b1a3..12083bb 100644 --- a/stack/util.go +++ b/stack/util.go @@ -2,14 +2,14 @@ package stack import ( "runtime/debug" - - "github.com/pubgo/funk/vars" + + "github.com/pubgo/funk/monster" ) -var EnablePrintStack = vars.Bool("stack.enable_print_stack") +var EnablePrintStack = monster.Bool("stack.enable_print_stack", false, "stack enable print stack data") func PrintStack() { - if !EnablePrintStack.Load() { + if !EnablePrintStack.Get() { return } diff --git a/v2/result/api.go b/v2/result/api.go index cac47ca..60c7c72 100644 --- a/v2/result/api.go +++ b/v2/result/api.go @@ -130,10 +130,26 @@ func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { return fn(r.getValue()) } -func Log(err error, events ...func(e *zerolog.Event)) { - logErr(nil, err, events...) +func LogErr(err error, events ...func(e *zerolog.Event)) { + logErr(nil, 0, err, events...) } -func LogCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { - logErr(ctx, err, events...) +func LogErrCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { + logErr(ctx, 0, err, events...) +} + +func Must(err error, events ...func(e *zerolog.Event)) { + if err == nil { + return + } + + errNilOrPanic(errors.WrapCaller(err, 1), events...) +} + +func Must1[T any](ret T, err error) T { + if err != nil { + errNilOrPanic(errors.WrapCaller(err, 1)) + } + + return ret } diff --git a/v2/result/error.go b/v2/result/error.go index 26e4719..9fe9ef0 100644 --- a/v2/result/error.go +++ b/v2/result/error.go @@ -36,12 +36,12 @@ func (e Error) Map(fn func(error) error) Error { } func (e Error) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Error { - logErr(ctx, e.err, events...) + logErr(ctx, 0, e.err, events...) return e } func (e Error) Log(events ...func(e *zerolog.Event)) Error { - logErr(nil, e.err, events...) + logErr(nil, 0, e.err, events...) return e } diff --git a/v2/result/result.go b/v2/result/result.go index 0ac689e..11ac622 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -109,12 +109,12 @@ func (r Result[T]) Inspect(fn func(T)) Result[T] { } func (r Result[T]) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Result[T] { - logErr(ctx, r.err, events...) + logErr(ctx, 0, r.err, events...) return r } func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { - logErr(nil, r.err, events...) + logErr(nil, 0, r.err, events...) return r } diff --git a/v2/result/result_test.go b/v2/result/result_test.go index 1a74fe2..daa6132 100644 --- a/v2/result/result_test.go +++ b/v2/result/result_test.go @@ -14,6 +14,11 @@ import ( "github.com/pubgo/funk/v2/result/resultchecker" ) +func TestMust(t *testing.T) { + defer recovery.Testing(t) + result.Must(fmt.Errorf("test must")) +} + type hello struct { Name string `json:"name"` } diff --git a/v2/result/resultchecker/checker.go b/v2/result/resultchecker/checker.go index cf6aa3a..5888b45 100644 --- a/v2/result/resultchecker/checker.go +++ b/v2/result/resultchecker/checker.go @@ -10,6 +10,10 @@ import ( var errChecks []ErrChecker func RegisterErrCheck(f ErrChecker) bool { + if f == nil { + return false + } + var checkFrame = stack.CallerWithFunc(f) for _, errFunc := range errChecks { if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { diff --git a/v2/result/util.go b/v2/result/util.go index eafcc57..0c4bbd5 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -3,12 +3,11 @@ package result import ( "context" "fmt" - "sync" - "log/slog" "reflect" "runtime/debug" "strings" + "sync" "github.com/k0kubun/pp/v3" "github.com/rs/zerolog" @@ -69,9 +68,7 @@ func errNilOrPanic(err error, events ...func(e *zerolog.Event)) { return } - logErr(nil, err, events...) - err = errors.WrapStack(err) - errors.Debug(err) + logErr(nil, 1, err, events...) panic(err) } @@ -241,7 +238,7 @@ func setError(setter ErrSetter, err error) { } } -func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { +func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog.Event)) { if err == nil { return } @@ -258,8 +255,8 @@ func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { } }). Str(zerolog.ErrorFieldName, err.Error()). - CallerSkipFrame(2). - Msgf("%s\n%s\n", err.Error(), prototext.Format(errors.ParseErrToPb(err))) + CallerSkipFrame(2+skip). + Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } var pretty = sync.OnceValue(func() *pp.PrettyPrinter { From 47c1cd2880b94c082b5077239f906d76722afbf9 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 18 Sep 2025 19:56:43 +0800 Subject: [PATCH 17/43] chore: quick update fix/version at 2025-09-22 11:25:30 --- assert/must.go | 4 +- async/go.go | 2 +- errors/errors.go | 3 +- errors/errutil/util.go | 6 +- errors/must.go | 47 ----- go.mod | 1 - go.sum | 2 - metaflags/example/main.go | 77 -------- metaflags/metaflag.go | 75 ------- metaflags/types.go | 305 ----------------------------- monitor/monitor.go | 7 +- monitor/types.go | 57 +++--- running/runtime.go | 12 +- running/util.go | 2 +- stack/util.go | 6 +- v2/result/api.go | 33 +++- v2/result/error.go | 4 +- v2/result/result.go | 4 +- v2/result/result_test.go | 5 + v2/result/resultchecker/checker.go | 4 + v2/result/util.go | 13 +- 21 files changed, 95 insertions(+), 574 deletions(-) delete mode 100644 errors/must.go delete mode 100644 metaflags/example/main.go delete mode 100644 metaflags/metaflag.go delete mode 100644 metaflags/types.go diff --git a/assert/must.go b/assert/must.go index 441e788..3d8e383 100644 --- a/assert/must.go +++ b/assert/must.go @@ -32,9 +32,9 @@ func MustF(err error, msg string, args ...interface{}) { must(err, fmt.Sprintf(msg, args...)) } -func Must1[T any](ret T, err error, args ...any) T { +func Must1[T any](ret T, err error) T { if err != nil { - must(err, args...) + must(err) } return ret diff --git a/async/go.go b/async/go.go index 455bfe3..0edd939 100644 --- a/async/go.go +++ b/async/go.go @@ -124,7 +124,7 @@ func logErr(fn interface{}, err error) { return } - if running.IsDebug { + if running.Debug() { debug.PrintStack() errors.Debug(err) } diff --git a/errors/errors.go b/errors/errors.go index 0c83112..0e94c2b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "reflect" - "runtime/debug" "github.com/rs/xid" "github.com/samber/lo" @@ -116,7 +115,7 @@ func WrapStack(err error) error { return nil } - debug.PrintStack() + stack.PrintStack() return &ErrWrap{ err: handleGrpcError(err), pb: &errorpb.ErrWrap{ diff --git a/errors/errutil/util.go b/errors/errutil/util.go index 7e9a757..ccc937d 100644 --- a/errors/errutil/util.go +++ b/errors/errutil/util.go @@ -2,13 +2,13 @@ package errutil import ( "context" + "encoding/json" "fmt" "io" "net/http" "os" "strings" - jjson "github.com/goccy/go-json" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/anypb" @@ -27,7 +27,7 @@ func Json(err error) []byte { } err = errors.Parse(err) - data, err := jjson.Marshal(err) + data, err := json.Marshal(err) if err != nil { log.Err(err).Stack().Str("err_stack", pretty.SimplePrint(err)).Msg("failed to marshal error") panic(fmt.Errorf("failed to marshal error, err=%w", err)) @@ -41,7 +41,7 @@ func JsonPretty(err error) []byte { } err = errors.Parse(err) - data, err := jjson.MarshalIndent(err, " ", " ") + data, err := json.MarshalIndent(err, " ", " ") if err != nil { log.Err(err).Stack().Str("err_stack", pretty.SimplePrint(err)).Msg("failed to marshal error") panic(fmt.Errorf("failed to marshal error, err=%w", err)) diff --git a/errors/must.go b/errors/must.go deleted file mode 100644 index 347cd1f..0000000 --- a/errors/must.go +++ /dev/null @@ -1,47 +0,0 @@ -package errors - -import ( - "fmt" - "os" - - "github.com/pubgo/funk/assert" -) - -func Must(err error, args ...interface{}) { - assert.Must(err, args...) -} - -func MustF(err error, msg string, args ...interface{}) { - assert.MustF(err, msg, args...) -} - -func Must1[T any](ret T, err error) T { - return assert.Must1(ret, err) -} - -func Exit(err error, args ...interface{}) { - if err == nil { - return - } - - Debug(WrapStack(Wrap(err, fmt.Sprint(args...)))) - os.Exit(1) -} - -func ExitF(err error, msg string, args ...interface{}) { - if err == nil { - return - } - - Debug(WrapStack(Wrapf(err, msg, args...))) - os.Exit(1) -} - -func Exit1[T any](ret T, err error) T { - if err != nil { - Debug(WrapStack(err)) - os.Exit(1) - } - - return ret -} diff --git a/go.mod b/go.mod index 53a867b..67e8dc2 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/dustin/go-humanize v1.0.0 github.com/ettle/strcase v0.2.0 github.com/expr-lang/expr v1.17.5 - github.com/goccy/go-json v0.10.2 github.com/google/go-cmp v0.6.0 github.com/gopherjs/gopherjs v1.17.2 github.com/hashicorp/go-version v1.6.0 diff --git a/go.sum b/go.sum index 657141d..c9580c5 100644 --- a/go.sum +++ b/go.sum @@ -94,8 +94,6 @@ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= diff --git a/metaflags/example/main.go b/metaflags/example/main.go deleted file mode 100644 index 11657d5..0000000 --- a/metaflags/example/main.go +++ /dev/null @@ -1,77 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/http" - "strings" - "time" - - "github.com/pubgo/funk/metaflags" -) - -var startTime = time.Now() - -func main() { - status := metaflags.String("app_status", "ok", "Current app status") - replicas := metaflags.Int("replicas", 1, "Number of replicas") - timeout := metaflags.Duration("timeout", 5*time.Second, "Request timeout") - features := metaflags.StringSlice("features", []string{"auth"}, "Enabled features") - labels := metaflags.StringMap("labels", map[string]string{"env": "dev"}, "Node labels") - - // 模拟更新 - go func() { - time.Sleep(2 * time.Second) - status.Set("degraded") - - time.Sleep(2 * time.Second) - replicas.Set(3) - - time.Sleep(2 * time.Second) - timeout.Set(10 * time.Second) - - time.Sleep(2 * time.Second) - features.Set([]string{"auth", "metrics", "tracing"}) - - time.Sleep(2 * time.Second) - lbls := labels.Get().(map[string]string) - lbls["updated"] = time.Now().Format("15:04") - labels.Set(lbls) - }() - - // HTTP 输出所有元数据 - http.HandleFunc("/metadata", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - fmt.Fprintln(w, "{") - first := true - metaflags.VisitAll(func(e *metaflags.Entry) { - if !first { - fmt.Fprint(w, ",") - } - first = false - fmt.Fprintf(w, "\n %q: %v", e.Name, mustJSON(e.Value.Get())) - }) - fmt.Fprintln(w, "\n}") - }) - - log.Println("Server starting on :8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -// 简单 JSON 转换(生产环境用 json.Marshal) -func mustJSON(v interface{}) string { - switch val := v.(type) { - case string: - return fmt.Sprintf("%q", val) - case []string: - return fmt.Sprintf("%q", val) - case map[string]string: - var parts []string - for k, v := range val { - parts = append(parts, fmt.Sprintf("%q:%q", k, v)) - } - return fmt.Sprintf("{%s}", strings.Join(parts, ",")) - default: - return fmt.Sprintf("%v", val) - } -} diff --git a/metaflags/metaflag.go b/metaflags/metaflag.go deleted file mode 100644 index cb58244..0000000 --- a/metaflags/metaflag.go +++ /dev/null @@ -1,75 +0,0 @@ -package metaflags - -import ( - "github.com/pubgo/funk/assert" - "sync" -) - -// Value is the interface to the dynamic value stored in metadata. -type Value interface { - Get() any - Set(value any) error - String() string - Key() string // 返回该值的名称 -} - -// Entry holds metadata about a registered value -type Entry struct { - Name string - Value Value - Usage string -} - -// FlagSet holds a set of metadata values -type FlagSet struct { - m map[string]*Entry - mu sync.RWMutex -} - -var defaultSet = NewFlagSet() - -func NewFlagSet() *FlagSet { return &FlagSet{m: make(map[string]*Entry)} } - -func (f *FlagSet) AddFunc(name string, getter func() any, setter func(val any) error, usage string) Value { - return f.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) -} - -// Add registers a new metadata entry and injects name if supported -func (f *FlagSet) Add(name string, value Value, usage string) Value { - f.mu.Lock() - defer f.mu.Unlock() - - assert.If(value == nil, "flag value is nil") - assert.If(name == "", "flag name is empty") - assert.If(f.m[name] != nil, "flag '%s' already registered", name) - - f.m[name] = &Entry{ - Name: name, - Value: value, - Usage: usage, - } - return value -} - -// Lookup returns the Entry for the given name -func (f *FlagSet) Lookup(name string) *Entry { - f.mu.RLock() - defer f.mu.RUnlock() - return f.m[name] -} - -// VisitAll calls fn for each Entry -func (f *FlagSet) VisitAll(fn func(*Entry)) { - f.mu.RLock() - defer f.mu.RUnlock() - for _, entry := range f.m { - fn(entry) - } -} - -// Default accessors -func Lookup(name string) *Entry { return defaultSet.Lookup(name) } -func VisitAll(fn func(*Entry)) { defaultSet.VisitAll(fn) } -func Add(name string, val Value, u string) Value { - return defaultSet.Add(name, val, u) -} diff --git a/metaflags/types.go b/metaflags/types.go deleted file mode 100644 index b33748d..0000000 --- a/metaflags/types.go +++ /dev/null @@ -1,305 +0,0 @@ -package metaflags - -import ( - "fmt" - "strings" - "time" -) - -type StringValue struct { - p string - name string -} - -func (s *StringValue) Key() string { return s.name } - -func (s *StringValue) get() any { return s.p } -func (s *StringValue) set(val any) error { - switch v := val.(type) { - case string: - s.p = v - case fmt.Stringer: - s.p = v.String() - default: - s.p = fmt.Sprintf("%v", v) - } - return nil -} -func (s *StringValue) Get() string { return s.p } -func (s *StringValue) Set(val string) error { - s.p = val - return nil -} -func (s *StringValue) String() string { return s.p } -func String(name, value, usage string) *StringValue { - s := &StringValue{p: value, name: name} - defaultSet.AddFunc(name, s.get, s.set, usage) - return s -} - -type IntValue struct { - p *int64 - name string -} - -func (i *IntValue) Key() string { return i.name } -func (i *IntValue) Get() interface{} { return *i.p } -func (i *IntValue) Set(val interface{}) error { - var x int64 - switch v := val.(type) { - case int: - x = int64(v) - case int64: - x = v - case float64: - x = int64(v) - case string: - fmt.Sscanf(v, "%d", &x) - default: - x = int64(fmt.Sprintf("%v", v)[0]) - } - *i.p = x - return nil -} -func (i *IntValue) String() string { return fmt.Sprintf("%d", *i.p) } -func Int(name string, value int64, usage string) Value { - p := new(int64) - *p = value - return defaultSet.Add(name, &IntValue{p: p, name: name}, usage) -} - -type FloatValue struct { - p *float64 - name string -} - -func (f *FloatValue) Key() string { return f.name } -func (f *FloatValue) Get() interface{} { return *f.p } -func (f *FloatValue) Set(val interface{}) error { - var x float64 - switch v := val.(type) { - case float64: - x = v - case float32: - x = float64(v) - case int: - x = float64(v) - case int64: - x = float64(v) - case string: - fmt.Sscanf(v, "%f", &x) - default: - x = 0.0 - } - *f.p = x - return nil -} -func (f *FloatValue) String() string { return fmt.Sprintf("%g", *f.p) } -func Float(name string, value float64, usage string) Value { - p := new(float64) - *p = value - return defaultSet.Add(name, &FloatValue{p: p, name: name}, usage) -} - -type BoolValue struct { - p *bool - name string -} - -func (b *BoolValue) Key() string { return b.name } -func (b *BoolValue) Get() interface{} { return *b.p } -func (b *BoolValue) Set(val interface{}) error { - var x bool - switch v := val.(type) { - case bool: - x = v - case string: - switch strings.ToLower(v) { - case "true", "1", "on", "yes": - x = true - case "false", "0", "off", "no": - x = false - default: - x = len(v) > 0 - } - default: - x = true - } - *b.p = x - return nil -} -func (b *BoolValue) String() string { return fmt.Sprintf("%t", *b.p) } -func Bool(name string, value bool, usage string) Value { - p := new(bool) - *p = value - return defaultSet.Add(name, &BoolValue{p: p, name: name}, usage) -} - -type DurationValue struct { - p *time.Duration - name string -} - -func (d *DurationValue) Key() string { return d.name } -func (d *DurationValue) Get() interface{} { return *d.p } -func (d *DurationValue) Set(val interface{}) error { - var dur time.Duration - switch v := val.(type) { - case time.Duration: - dur = v - case string: - var err error - dur, err = time.ParseDuration(v) - if err != nil { - return err - } - case int: - dur = time.Duration(v) * time.Second - case float64: - dur = time.Duration(v * float64(time.Second)) - default: - dur = 0 - } - *d.p = dur - return nil -} -func (d *DurationValue) String() string { return (*d.p).String() } -func Duration(name string, value time.Duration, usage string) Value { - p := new(time.Duration) - *p = value - return defaultSet.Add(name, &DurationValue{p: p, name: name}, usage) -} - -type TimeValue struct { - p *time.Time - name string -} - -func (t *TimeValue) Key() string { return t.name } -func (t *TimeValue) Get() interface{} { return *t.p } -func (t *TimeValue) Set(val interface{}) error { - var tm time.Time - switch v := val.(type) { - case time.Time: - tm = v - case string: - var err error - tm, err = time.Parse(time.RFC3339, v) - if err != nil { - return err - } - case int64: - tm = time.Unix(v, 0) - default: - return fmt.Errorf("cannot convert %T to time.Time", val) - } - *t.p = tm - return nil -} -func (t *TimeValue) String() string { return (*t.p).Format(time.RFC3339) } -func Time(name string, value time.Time, usage string) Value { - p := new(time.Time) - *p = value - return defaultSet.Add(name, &TimeValue{p: p, name: name}, usage) -} - -type StringSliceValue struct { - p *[]string - name string -} - -func (s *StringSliceValue) Key() string { return s.name } -func (s *StringSliceValue) Get() interface{} { return *s.p } -func (s *StringSliceValue) Set(val interface{}) error { - var strs []string - switch v := val.(type) { - case []string: - strs = v - case []interface{}: - strs = make([]string, len(v)) - for i, item := range v { - strs[i] = fmt.Sprintf("%v", item) - } - case string: - parts := strings.Split(v, ",") - for _, part := range parts { - strs = append(strs, strings.TrimSpace(part)) - } - default: - strs = []string{fmt.Sprintf("%v", val)} - } - *s.p = strs - return nil -} -func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", *s.p) } -func StringSlice(name string, value []string, usage string) Value { - p := new([]string) - *p = append([]string(nil), value...) - return defaultSet.Add(name, &StringSliceValue{p: p, name: name}, usage) -} - -type StringMapValue struct { - p *map[string]string - name string -} - -func (m *StringMapValue) Key() string { return m.name } -func (m *StringMapValue) Get() interface{} { return *m.p } -func (m *StringMapValue) Set(val interface{}) error { - var mp map[string]string - switch v := val.(type) { - case map[string]string: - mp = v - case map[string]interface{}: - mp = make(map[string]string) - for k, vv := range v { - mp[k] = fmt.Sprintf("%v", vv) - } - case string: - mp = make(map[string]string) - pairs := strings.Split(v, ",") - for _, pair := range pairs { - kv := strings.SplitN(pair, "=", 2) - if len(kv) == 2 { - mp[kv[0]] = kv[1] - } - } - default: - mp = map[string]string{"value": fmt.Sprintf("%v", val)} - } - *m.p = mp - return nil -} -func (m *StringMapValue) String() string { return fmt.Sprintf("%v", *m.p) } -func StringMap(name string, value map[string]string, usage string) Value { - p := new(map[string]string) - *p = make(map[string]string) - for k, v := range value { - (*p)[k] = v - } - return defaultSet.Add(name, &StringMapValue{p: p, name: name}, usage) -} - -type FuncValue struct { - get func() any - set func(val any) error - name string -} - -func (f *FuncValue) Key() string { return f.name } -func (f *FuncValue) Get() any { return f.get() } -func (f *FuncValue) Set(val any) error { return f.set(val) } -func (f *FuncValue) String() string { return fmt.Sprintf("%v", f.get()) } - -func Func(name string, getter func() any, setter func(val any) error, usage string) Value { - return defaultSet.Add(name, &FuncValue{get: getter, set: setter, name: name}, usage) -} - -func Any(name string, value any, usage string) Value { - anyVal := value - return Func( - name, - func() any { return anyVal }, func(val any) error { anyVal = val; return nil }, - usage, - ) -} diff --git a/monitor/monitor.go b/monitor/monitor.go index 63e23c2..c6a6cc3 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -1,4 +1,3 @@ -// monitor/monitor.go package monitor import "sync" @@ -24,10 +23,10 @@ type Monitor struct { mu sync.RWMutex } -var defaultMonitor = NewMonitor("default") +var defaultMonitor = NewMonitor() // NewMonitor creates a new Monitor instance -func NewMonitor(name string) *Monitor { +func NewMonitor() *Monitor { return &Monitor{ m: make(map[string]*Entry), } @@ -70,8 +69,6 @@ func (m *Monitor) VisitAll(fn func(*Entry)) { } } -// Global functions (use defaultMonitor) - func AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { defaultMonitor.AddFunc(name, get, set, usage, tags...) } diff --git a/monitor/types.go b/monitor/types.go index 900b281..cb5daa1 100644 --- a/monitor/types.go +++ b/monitor/types.go @@ -1,4 +1,3 @@ -// monitor/types.go package monitor import ( @@ -19,7 +18,6 @@ func mergeTags(maps ...map[string]any) map[string]any { return m } -// === StringValue === type StringValue struct { p string name string @@ -38,9 +36,9 @@ func (s *StringValue) set(val any) error { } return nil } -func (s *StringValue) Get() string { return s.p } -func (s *StringValue) Set(val string) { _ = s.set(val) } -func (s *StringValue) String() string { return s.p } +func (s *StringValue) Get() string { return s.p } +func (s *StringValue) Set(val string) error { return s.set(val) } +func (s *StringValue) String() string { return s.p } func String(name, value, usage string, tags ...map[string]any) *StringValue { s := &StringValue{p: value, name: name} @@ -49,7 +47,6 @@ func String(name, value, usage string, tags ...map[string]any) *StringValue { return s } -// === IntValue === type IntValue struct { p int64 name string @@ -74,9 +71,9 @@ func (i *IntValue) set(val any) error { i.p = x return nil } -func (i *IntValue) Get() int64 { return i.p } -func (i *IntValue) Set(val int64) { _ = i.set(val) } -func (i *IntValue) String() string { return fmt.Sprintf("%d", i.p) } +func (i *IntValue) Get() int64 { return i.p } +func (i *IntValue) Set(val int64) error { return i.set(val) } +func (i *IntValue) String() string { return fmt.Sprintf("%d", i.p) } func Int(name string, value int64, usage string, tags ...map[string]any) *IntValue { i := &IntValue{p: value, name: name} @@ -85,7 +82,6 @@ func Int(name string, value int64, usage string, tags ...map[string]any) *IntVal return i } -// === FloatValue === type FloatValue struct { p float64 name string @@ -112,9 +108,9 @@ func (f *FloatValue) set(val any) error { f.p = x return nil } -func (f *FloatValue) Get() float64 { return f.p } -func (f *FloatValue) Set(val float64) { _ = f.set(val) } -func (f *FloatValue) String() string { return fmt.Sprintf("%g", f.p) } +func (f *FloatValue) Get() float64 { return f.p } +func (f *FloatValue) Set(val float64) error { return f.set(val) } +func (f *FloatValue) String() string { return fmt.Sprintf("%g", f.p) } func Float(name string, value float64, usage string, tags ...map[string]any) *FloatValue { f := &FloatValue{p: value, name: name} @@ -123,7 +119,6 @@ func Float(name string, value float64, usage string, tags ...map[string]any) *Fl return f } -// === BoolValue === type BoolValue struct { p bool name string @@ -151,9 +146,9 @@ func (b *BoolValue) set(val any) error { b.p = x return nil } -func (b *BoolValue) Get() bool { return b.p } -func (b *BoolValue) Set(val bool) { _ = b.set(val) } -func (b *BoolValue) String() string { return fmt.Sprintf("%t", b.p) } +func (b *BoolValue) Get() bool { return b.p } +func (b *BoolValue) Set(val bool) error { return b.set(val) } +func (b *BoolValue) String() string { return fmt.Sprintf("%t", b.p) } func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolValue { b := &BoolValue{p: value, name: name} @@ -162,7 +157,6 @@ func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolVa return b } -// === DurationValue === type DurationValue struct { p time.Duration name string @@ -187,9 +181,9 @@ func (d *DurationValue) set(val any) error { d.p = dur return nil } -func (d *DurationValue) Get() time.Duration { return d.p } -func (d *DurationValue) Set(val time.Duration) { _ = d.set(val) } -func (d *DurationValue) String() string { return d.p.String() } +func (d *DurationValue) Get() time.Duration { return d.p } +func (d *DurationValue) Set(val time.Duration) error { return d.set(val) } +func (d *DurationValue) String() string { return d.p.String() } func Duration(name string, value time.Duration, usage string, tags ...map[string]any) *DurationValue { d := &DurationValue{p: value, name: name} @@ -198,7 +192,6 @@ func Duration(name string, value time.Duration, usage string, tags ...map[string return d } -// === TimeValue === type TimeValue struct { p time.Time name string @@ -225,9 +218,9 @@ func (t *TimeValue) set(val any) error { t.p = tm return nil } -func (t *TimeValue) Get() time.Time { return t.p } -func (t *TimeValue) Set(val time.Time) { _ = t.set(val) } -func (t *TimeValue) String() string { return t.p.Format(time.RFC3339) } +func (t *TimeValue) Get() time.Time { return t.p } +func (t *TimeValue) Set(val time.Time) error { return t.set(val) } +func (t *TimeValue) String() string { return t.p.Format(time.RFC3339) } func Time(name string, value time.Time, usage string, tags ...map[string]any) *TimeValue { t := &TimeValue{p: value, name: name} @@ -236,7 +229,6 @@ func Time(name string, value time.Time, usage string, tags ...map[string]any) *T return t } -// === StringSliceValue === type StringSliceValue struct { p []string name string @@ -260,9 +252,9 @@ func (s *StringSliceValue) set(val any) error { s.p = strs return nil } -func (s *StringSliceValue) Get() []string { return s.p } -func (s *StringSliceValue) Set(val []string) { _ = s.set(val) } -func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", s.p) } +func (s *StringSliceValue) Get() []string { return s.p } +func (s *StringSliceValue) Set(val []string) error { return s.set(val) } +func (s *StringSliceValue) String() string { return fmt.Sprintf("%v", s.p) } func StringSlice(name string, value []string, usage string, tags ...map[string]any) *StringSliceValue { cp := append([]string(nil), value...) @@ -272,7 +264,6 @@ func StringSlice(name string, value []string, usage string, tags ...map[string]a return s } -// === StringMapValue === type StringMapValue struct { p map[string]string name string @@ -296,9 +287,9 @@ func (m *StringMapValue) set(val any) error { m.p = mp return nil } -func (m *StringMapValue) Get() map[string]string { return m.p } -func (m *StringMapValue) Set(val map[string]string) { _ = m.set(val) } -func (m *StringMapValue) String() string { return fmt.Sprintf("%v", m.p) } +func (m *StringMapValue) Get() map[string]string { return m.p } +func (m *StringMapValue) Set(val map[string]string) error { return m.set(val) } +func (m *StringMapValue) String() string { return fmt.Sprintf("%v", m.p) } func StringMap(name string, value map[string]string, usage string, tags ...map[string]any) *StringMapValue { cp := make(map[string]string) diff --git a/running/runtime.go b/running/runtime.go index dbf3952..6e73ab0 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -9,6 +9,7 @@ import ( "github.com/pubgo/funk/assert" "github.com/pubgo/funk/env" + "github.com/pubgo/funk/monitor" "github.com/pubgo/funk/netutil" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/strutil" @@ -21,7 +22,10 @@ var ( GrpcPort = 50051 Project = version.Project() - Env = "debug" + Env = "debug" + + // IsDebug + // Deprecated: use Debug IsDebug = true // InstanceID service id @@ -58,8 +62,14 @@ var ( ) Domain string + + enableDebug = monitor.Bool("debug", false, "enable debug") ) +func Debug() bool { + return IsDebug || enableDebug.Get() +} + func init() { env.GetBoolVal(&IsDebug, "enable_debug", "debug", "dev_mode") env.GetVal(&Env, "env", "run_mode", "run_env") diff --git a/running/util.go b/running/util.go index f7aaf44..8984938 100644 --- a/running/util.go +++ b/running/util.go @@ -20,7 +20,7 @@ func GetSysInfo() map[string]string { "main_path": version.MainPath(), "grpc_port": fmt.Sprintf("%v", GrpcPort), "http_post": fmt.Sprintf("%v", HttpPort), - "debug": fmt.Sprintf("%v", IsDebug), + "debug": fmt.Sprintf("%v", Debug()), "cur_dir": Pwd, "local_ip": LocalIP, "namespace": Namespace, diff --git a/stack/util.go b/stack/util.go index 4a8b1a3..100af59 100644 --- a/stack/util.go +++ b/stack/util.go @@ -3,13 +3,13 @@ package stack import ( "runtime/debug" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/monitor" ) -var EnablePrintStack = vars.Bool("stack.enable_print_stack") +var EnablePrintStack = monitor.Bool("stack.enable_print_stack", false, "stack enable print stack data") func PrintStack() { - if !EnablePrintStack.Load() { + if !EnablePrintStack.Get() { return } diff --git a/v2/result/api.go b/v2/result/api.go index cac47ca..41d0e89 100644 --- a/v2/result/api.go +++ b/v2/result/api.go @@ -8,6 +8,15 @@ import ( "github.com/rs/zerolog" ) +func Run(executors ...func() error) Error { + for _, executor := range executors { + if err := executor(); err != nil { + return ErrOf(errors.WrapCaller(err, 1)) + } + } + return Error{} +} + func All[T any](results ...Result[T]) Result[[]T] { values := make([]T, 0, len(results)) for _, result := range results { @@ -130,10 +139,26 @@ func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { return fn(r.getValue()) } -func Log(err error, events ...func(e *zerolog.Event)) { - logErr(nil, err, events...) +func LogErr(err error, events ...func(e *zerolog.Event)) { + logErr(nil, 0, err, events...) +} + +func LogErrCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { + logErr(ctx, 0, err, events...) +} + +func Must(err error, events ...func(e *zerolog.Event)) { + if err == nil { + return + } + + errNilOrPanic(errors.WrapCaller(err, 1), events...) } -func LogCtx(ctx context.Context, err error, events ...func(e *zerolog.Event)) { - logErr(ctx, err, events...) +func Must1[T any](ret T, err error) T { + if err != nil { + errNilOrPanic(errors.WrapCaller(err, 1)) + } + + return ret } diff --git a/v2/result/error.go b/v2/result/error.go index 26e4719..9fe9ef0 100644 --- a/v2/result/error.go +++ b/v2/result/error.go @@ -36,12 +36,12 @@ func (e Error) Map(fn func(error) error) Error { } func (e Error) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Error { - logErr(ctx, e.err, events...) + logErr(ctx, 0, e.err, events...) return e } func (e Error) Log(events ...func(e *zerolog.Event)) Error { - logErr(nil, e.err, events...) + logErr(nil, 0, e.err, events...) return e } diff --git a/v2/result/result.go b/v2/result/result.go index 0ac689e..11ac622 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -109,12 +109,12 @@ func (r Result[T]) Inspect(fn func(T)) Result[T] { } func (r Result[T]) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Result[T] { - logErr(ctx, r.err, events...) + logErr(ctx, 0, r.err, events...) return r } func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { - logErr(nil, r.err, events...) + logErr(nil, 0, r.err, events...) return r } diff --git a/v2/result/result_test.go b/v2/result/result_test.go index 1a74fe2..daa6132 100644 --- a/v2/result/result_test.go +++ b/v2/result/result_test.go @@ -14,6 +14,11 @@ import ( "github.com/pubgo/funk/v2/result/resultchecker" ) +func TestMust(t *testing.T) { + defer recovery.Testing(t) + result.Must(fmt.Errorf("test must")) +} + type hello struct { Name string `json:"name"` } diff --git a/v2/result/resultchecker/checker.go b/v2/result/resultchecker/checker.go index cf6aa3a..5888b45 100644 --- a/v2/result/resultchecker/checker.go +++ b/v2/result/resultchecker/checker.go @@ -10,6 +10,10 @@ import ( var errChecks []ErrChecker func RegisterErrCheck(f ErrChecker) bool { + if f == nil { + return false + } + var checkFrame = stack.CallerWithFunc(f) for _, errFunc := range errChecks { if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { diff --git a/v2/result/util.go b/v2/result/util.go index eafcc57..0c4bbd5 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -3,12 +3,11 @@ package result import ( "context" "fmt" - "sync" - "log/slog" "reflect" "runtime/debug" "strings" + "sync" "github.com/k0kubun/pp/v3" "github.com/rs/zerolog" @@ -69,9 +68,7 @@ func errNilOrPanic(err error, events ...func(e *zerolog.Event)) { return } - logErr(nil, err, events...) - err = errors.WrapStack(err) - errors.Debug(err) + logErr(nil, 1, err, events...) panic(err) } @@ -241,7 +238,7 @@ func setError(setter ErrSetter, err error) { } } -func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { +func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog.Event)) { if err == nil { return } @@ -258,8 +255,8 @@ func logErr(ctx context.Context, err error, events ...func(e *zerolog.Event)) { } }). Str(zerolog.ErrorFieldName, err.Error()). - CallerSkipFrame(2). - Msgf("%s\n%s\n", err.Error(), prototext.Format(errors.ParseErrToPb(err))) + CallerSkipFrame(2+skip). + Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } var pretty = sync.OnceValue(func() *pp.PrettyPrinter { From 83b32e5f6b6acd6a21334528137d53061f0fade2 Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 23 Sep 2025 20:27:31 +0800 Subject: [PATCH 18/43] chore: quick update fix/version at 2025-09-23 23:13:48 --- config/config.go | 16 ++++++++++++---- config/envs.go | 2 -- env/env.go | 3 ++- env/reload.go | 26 ++++++++++++-------------- env/util.go | 12 ------------ env/util_test.go | 19 +++++++------------ log/logfields/fields.go | 9 ++++++--- v2/result/result.go | 14 +++++++------- 8 files changed, 46 insertions(+), 55 deletions(-) diff --git a/config/config.go b/config/config.go index 188438e..5c5cab9 100644 --- a/config/config.go +++ b/config/config.go @@ -83,14 +83,22 @@ func loadEnvConfigMap(cfgPath string) EnvSpecMap { pathList := listAllPath(envPath).Expect("failed to list env config path: %s", envPath) for _, p := range pathList { - envConfigBytes := result.Wrap(os.ReadFile(p)).Expect("failed to handler env config data, path=%s", p) - envConfigBytes = bytes.TrimSpace(envConfigBytes) + envConfigBytes := result.Wrap(os.ReadFile(p)). + Map(bytes.TrimSpace). + Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to handler env config data, path=%s", p)) + }) if len(envConfigBytes) == 0 { continue } - envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)).Expect("failed to handler config env data: %s", envConfigBytes) - assert.MustF(yaml.Unmarshal(envConfigBytes, &envSpecMap), "failed to unmarshal env config, data=%s path=%s", envConfigBytes, p) + envConfigBytes = cfgFormat(envConfigBytes, &config{workDir: filepath.Dir(cfgPath)}) + envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)).Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to handler config env data: %s", envConfigBytes)) + }) + result.Must(yaml.Unmarshal(envConfigBytes, &envSpecMap), func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to unmarshal env config, data=%s path=%s", envConfigBytes, p)) + }) } } initEnv(envSpecMap) diff --git a/config/envs.go b/config/envs.go index 6b6d268..9351da9 100644 --- a/config/envs.go +++ b/config/envs.go @@ -15,8 +15,6 @@ type EnvSpec struct { Default string `yaml:"default"` Required bool `yaml:"required"` Example string `yaml:"example"` - Versions string `yaml:"versions"` - Tags string `yaml:"tags"` } func initEnv(envMap EnvSpecMap) { diff --git a/env/env.go b/env/env.go index e399f30..6054ef0 100644 --- a/env/env.go +++ b/env/env.go @@ -9,10 +9,11 @@ import ( "github.com/a8m/envsubst" "github.com/joho/godotenv" + "github.com/samber/lo" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/v2/result" - "github.com/samber/lo" ) func Set(key, value string) result.Error { diff --git a/env/reload.go b/env/reload.go index 6588e14..c78a888 100644 --- a/env/reload.go +++ b/env/reload.go @@ -1,17 +1,14 @@ package env import ( + "fmt" + "log/slog" "os" "strings" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" + "github.com/pubgo/funk/log/logfields" ) -func init() { - loadEnv() -} - func Reload() { loadEnv() } @@ -26,16 +23,17 @@ func Init() { // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { envPrefix := getEnvPrefix() - logger := log.With().Str("operation", "reload_env").Logger() - envPrefixEventFn := func(e *zerolog.Event) { - e.Dict("env_prefix", zerolog.Dict().Str("key", PrefixKey).Str("value", envPrefix)) - } - logRecord(logger.Info(), envPrefixEventFn).Msg("reload env") + + logger := slog.With( + slog.String(logfields.Module, "env"), + slog.String(logfields.Operation, "reload_env"), + ) + logger.Info("reload env", slog.Any("env_prefix", map[string]any{"key": PrefixKey, "value": envPrefix})) for _, env := range os.Environ() { kvs := strings.SplitN(env, "=", 2) if len(kvs) != 2 { - logRecord(logger.Error()).Msg("split env error") + logger.Error("split env error") continue } @@ -44,7 +42,7 @@ func loadEnv() { strings.HasPrefix(rawEnvKey, "_") || strings.HasPrefix(rawEnvKey, "=") || !hasEnvPrefix(rawEnvKey, envPrefix) { - logRecord(logger.Warn()).Msgf("unset env, key=%s", rawEnvKey) + logger.Warn(fmt.Sprintf("unset env, key=%s", rawEnvKey)) _ = os.Unsetenv(rawEnvKey) continue } @@ -56,7 +54,7 @@ func loadEnv() { } setOk := os.Setenv(key, kvs[1]) == nil - logRecord(logger.Info()).Msgf("reset env, old_key=%s new_key=%s set_ok=%v", rawEnvKey, key, setOk) + logger.Info(fmt.Sprintf("reset env, old_key=%s new_key=%s set_ok=%v", rawEnvKey, key, setOk)) } else { _ = os.Unsetenv(rawEnvKey) } diff --git a/env/util.go b/env/util.go index ca2f554..dce159b 100644 --- a/env/util.go +++ b/env/util.go @@ -5,16 +5,8 @@ import ( "strings" "github.com/ettle/strcase" - "github.com/rs/zerolog" - - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/log/logutil" ) -var logFn = func(e *zerolog.Event) { - e.Str(logfields.Module, "env") -} - const PrefixKey = "ENV_PREFIX" func hasEnvPrefix(key string, prefix string) bool { @@ -58,7 +50,3 @@ func Normalize(key string) (string, bool) { return KeyHandler(key), true } - -func logRecord(evt *zerolog.Event, funcs ...func(e *zerolog.Event)) *zerolog.Event { - return logutil.Record(evt, append(funcs, logFn)...) -} diff --git a/env/util_test.go b/env/util_test.go index e73b50a..2b7f6ab 100644 --- a/env/util_test.go +++ b/env/util_test.go @@ -1,23 +1,22 @@ package env_test import ( + "log/slog" "os" - "strings" "testing" "github.com/pubgo/funk/env" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/pretty" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" "github.com/samber/lo" "github.com/stretchr/testify/assert" ) func TestResetEnv(t *testing.T) { - os.Setenv("abc", "1") - t.Log(os.Getenv("abc")) - os.Setenv("abc", "2") - t.Log(os.Getenv("abc")) + assert.NoError(t, os.Setenv("abc", "1")) + assert.Equal(t, os.Getenv("abc"), "1") + assert.NoError(t, os.Setenv("abc", "2")) + assert.Equal(t, os.Getenv("abc"), "2") } func TestNormalize(t *testing.T) { @@ -27,11 +26,7 @@ func TestNormalize(t *testing.T) { } func TestEnvPrefix(t *testing.T) { - log.Logger = log.Hook(zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, message string) { - if strings.HasPrefix(message, "unset not match env") { - e.Discard() - } - })) + slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("")))) env.Reload() pretty.Println("env_keys", lo.Keys(env.Map())) diff --git a/log/logfields/fields.go b/log/logfields/fields.go index 7fb9857..c4124e3 100644 --- a/log/logfields/fields.go +++ b/log/logfields/fields.go @@ -1,9 +1,12 @@ package logfields const ( - Module = "module" - Msg = "log_msg" - Logger = "logger" + Module = "module" + Operation = "operation" + Action = "action" + Msg = "log_msg" + Logger = "logger" + Error = "error" ErrorDetail = "error_detail" ErrorStack = "error_stack" diff --git a/v2/result/result.go b/v2/result/result.go index 11ac622..636fe4e 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -94,14 +94,14 @@ func (r Result[T]) IsErr() bool { return r.getErr() != nil } func (r Result[T]) IsOK() bool { return r.getErr() == nil } -func (r Result[T]) InspectErr(fn func(error)) Result[T] { +func (r Result[T]) InspectErr(fn func(err error)) Result[T] { if r.IsErr() { fn(r.getErr()) } return r } -func (r Result[T]) Inspect(fn func(T)) Result[T] { +func (r Result[T]) Inspect(fn func(val T)) Result[T] { if r.IsOK() { fn(r.getValue()) } @@ -118,21 +118,21 @@ func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { return r } -func (r Result[T]) Map(fn func(T) T) Result[T] { +func (r Result[T]) Map(fn func(val T) T) Result[T] { if r.IsErr() { return r } return OK(fn(r.getValue())) } -func (r Result[T]) FlatMap(fn func(T) Result[T]) Result[T] { +func (r Result[T]) FlatMap(fn func(val T) Result[T]) Result[T] { if r.IsErr() { return r } return fn(r.getValue()) } -func (r Result[T]) Validate(fn func(T) error) Result[T] { +func (r Result[T]) Validate(fn func(val T) error) Result[T] { if r.IsErr() { return r } @@ -144,14 +144,14 @@ func (r Result[T]) Validate(fn func(T) error) Result[T] { return OK(r.getValue()) } -func (r Result[T]) MapErr(fn func(error) error) Result[T] { +func (r Result[T]) MapErr(fn func(err error) error) Result[T] { if r.IsOK() { return r } return Fail[T](fn(r.getErr())) } -func (r Result[T]) MapErrOr(fn func(error) Result[T]) Result[T] { +func (r Result[T]) MapErrOr(fn func(err error) Result[T]) Result[T] { if r.IsOK() { return r } From 51ec515025df828cc7499a0616b7556e5e6392bf Mon Sep 17 00:00:00 2001 From: barry Date: Tue, 23 Sep 2025 20:27:31 +0800 Subject: [PATCH 19/43] chore: quick update fix/version at 2025-09-24 11:45:48 --- config/config.go | 16 ++++++++++++---- config/envs.go | 8 +++----- env/env.go | 5 +++-- env/reload.go | 26 ++++++++++++-------------- env/util.go | 12 ------------ env/util_test.go | 19 +++++++------------ log/impl.slog.go | 7 ++++++- log/logfields/fields.go | 9 ++++++--- log/slogutil/util.go | 13 +++++++++++++ log/z_slog_test.go | 18 ++++++++++++++++++ v2/result/result.go | 14 +++++++------- 11 files changed, 87 insertions(+), 60 deletions(-) create mode 100644 log/slogutil/util.go create mode 100644 log/z_slog_test.go diff --git a/config/config.go b/config/config.go index 188438e..5c5cab9 100644 --- a/config/config.go +++ b/config/config.go @@ -83,14 +83,22 @@ func loadEnvConfigMap(cfgPath string) EnvSpecMap { pathList := listAllPath(envPath).Expect("failed to list env config path: %s", envPath) for _, p := range pathList { - envConfigBytes := result.Wrap(os.ReadFile(p)).Expect("failed to handler env config data, path=%s", p) - envConfigBytes = bytes.TrimSpace(envConfigBytes) + envConfigBytes := result.Wrap(os.ReadFile(p)). + Map(bytes.TrimSpace). + Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to handler env config data, path=%s", p)) + }) if len(envConfigBytes) == 0 { continue } - envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)).Expect("failed to handler config env data: %s", envConfigBytes) - assert.MustF(yaml.Unmarshal(envConfigBytes, &envSpecMap), "failed to unmarshal env config, data=%s path=%s", envConfigBytes, p) + envConfigBytes = cfgFormat(envConfigBytes, &config{workDir: filepath.Dir(cfgPath)}) + envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)).Must(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to handler config env data: %s", envConfigBytes)) + }) + result.Must(yaml.Unmarshal(envConfigBytes, &envSpecMap), func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to unmarshal env config, data=%s path=%s", envConfigBytes, p)) + }) } } initEnv(envSpecMap) diff --git a/config/envs.go b/config/envs.go index 6b6d268..5bc47e3 100644 --- a/config/envs.go +++ b/config/envs.go @@ -4,7 +4,7 @@ import ( "strings" "github.com/pubgo/funk/env" - "github.com/samber/lo" + "github.com/pubgo/funk/strutil" ) type EnvSpecMap map[string]*EnvSpec @@ -13,16 +13,14 @@ type EnvSpec struct { Name string `yaml:"name"` Description string `yaml:"description"` Default string `yaml:"default"` + Value string `yaml:"value"` Required bool `yaml:"required"` Example string `yaml:"example"` - Versions string `yaml:"versions"` - Tags string `yaml:"tags"` } func initEnv(envMap EnvSpecMap) { for name, cfg := range envMap { - envData := env.Get(name) - envData = strings.TrimSpace(lo.Ternary(envData != "", envData, cfg.Default)) + envData := strings.TrimSpace(strutil.FirstNotEmpty(env.Get(name), cfg.Value, cfg.Default)) if cfg.Required && envData == "" { panic("env " + cfg.Name + " is required") } diff --git a/env/env.go b/env/env.go index e399f30..4ad24ae 100644 --- a/env/env.go +++ b/env/env.go @@ -9,10 +9,11 @@ import ( "github.com/a8m/envsubst" "github.com/joho/godotenv" + "github.com/samber/lo" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/v2/result" - "github.com/samber/lo" ) func Set(key, value string) result.Error { @@ -120,7 +121,7 @@ func Key(key string) string { func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) - if result.Catch(&r, godotenv.Load(files...)) { + if result.Catch(&r, godotenv.Overload(files...)) { return } diff --git a/env/reload.go b/env/reload.go index 6588e14..c78a888 100644 --- a/env/reload.go +++ b/env/reload.go @@ -1,17 +1,14 @@ package env import ( + "fmt" + "log/slog" "os" "strings" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" + "github.com/pubgo/funk/log/logfields" ) -func init() { - loadEnv() -} - func Reload() { loadEnv() } @@ -26,16 +23,17 @@ func Init() { // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { envPrefix := getEnvPrefix() - logger := log.With().Str("operation", "reload_env").Logger() - envPrefixEventFn := func(e *zerolog.Event) { - e.Dict("env_prefix", zerolog.Dict().Str("key", PrefixKey).Str("value", envPrefix)) - } - logRecord(logger.Info(), envPrefixEventFn).Msg("reload env") + + logger := slog.With( + slog.String(logfields.Module, "env"), + slog.String(logfields.Operation, "reload_env"), + ) + logger.Info("reload env", slog.Any("env_prefix", map[string]any{"key": PrefixKey, "value": envPrefix})) for _, env := range os.Environ() { kvs := strings.SplitN(env, "=", 2) if len(kvs) != 2 { - logRecord(logger.Error()).Msg("split env error") + logger.Error("split env error") continue } @@ -44,7 +42,7 @@ func loadEnv() { strings.HasPrefix(rawEnvKey, "_") || strings.HasPrefix(rawEnvKey, "=") || !hasEnvPrefix(rawEnvKey, envPrefix) { - logRecord(logger.Warn()).Msgf("unset env, key=%s", rawEnvKey) + logger.Warn(fmt.Sprintf("unset env, key=%s", rawEnvKey)) _ = os.Unsetenv(rawEnvKey) continue } @@ -56,7 +54,7 @@ func loadEnv() { } setOk := os.Setenv(key, kvs[1]) == nil - logRecord(logger.Info()).Msgf("reset env, old_key=%s new_key=%s set_ok=%v", rawEnvKey, key, setOk) + logger.Info(fmt.Sprintf("reset env, old_key=%s new_key=%s set_ok=%v", rawEnvKey, key, setOk)) } else { _ = os.Unsetenv(rawEnvKey) } diff --git a/env/util.go b/env/util.go index ca2f554..dce159b 100644 --- a/env/util.go +++ b/env/util.go @@ -5,16 +5,8 @@ import ( "strings" "github.com/ettle/strcase" - "github.com/rs/zerolog" - - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/log/logutil" ) -var logFn = func(e *zerolog.Event) { - e.Str(logfields.Module, "env") -} - const PrefixKey = "ENV_PREFIX" func hasEnvPrefix(key string, prefix string) bool { @@ -58,7 +50,3 @@ func Normalize(key string) (string, bool) { return KeyHandler(key), true } - -func logRecord(evt *zerolog.Event, funcs ...func(e *zerolog.Event)) *zerolog.Event { - return logutil.Record(evt, append(funcs, logFn)...) -} diff --git a/env/util_test.go b/env/util_test.go index e73b50a..2b7f6ab 100644 --- a/env/util_test.go +++ b/env/util_test.go @@ -1,23 +1,22 @@ package env_test import ( + "log/slog" "os" - "strings" "testing" "github.com/pubgo/funk/env" + "github.com/pubgo/funk/log" "github.com/pubgo/funk/pretty" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" "github.com/samber/lo" "github.com/stretchr/testify/assert" ) func TestResetEnv(t *testing.T) { - os.Setenv("abc", "1") - t.Log(os.Getenv("abc")) - os.Setenv("abc", "2") - t.Log(os.Getenv("abc")) + assert.NoError(t, os.Setenv("abc", "1")) + assert.Equal(t, os.Getenv("abc"), "1") + assert.NoError(t, os.Setenv("abc", "2")) + assert.Equal(t, os.Getenv("abc"), "2") } func TestNormalize(t *testing.T) { @@ -27,11 +26,7 @@ func TestNormalize(t *testing.T) { } func TestEnvPrefix(t *testing.T) { - log.Logger = log.Hook(zerolog.HookFunc(func(e *zerolog.Event, level zerolog.Level, message string) { - if strings.HasPrefix(message, "unset not match env") { - e.Discard() - } - })) + slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("")))) env.Reload() pretty.Println("env_keys", lo.Keys(env.Map())) diff --git a/log/impl.slog.go b/log/impl.slog.go index 508d191..56c3951 100644 --- a/log/impl.slog.go +++ b/log/impl.slog.go @@ -4,6 +4,7 @@ import ( "context" "log/slog" + "github.com/pubgo/funk/log/slogutil" "github.com/rs/zerolog" slogcommon "github.com/samber/slog-common" ) @@ -56,7 +57,11 @@ func (s slogImpl) Handle(ctx context.Context, r slog.Record) error { } r.Attrs(func(attr slog.Attr) bool { - evt.Any(attr.Key, attr.Value.Any()) + if fn, ok := attr.Value.Any().(slogutil.LogFunc); ok { + evt.Func(fn) + } else { + evt.Any(attr.Key, attr.Value.Any()) + } return true }) diff --git a/log/logfields/fields.go b/log/logfields/fields.go index 7fb9857..c4124e3 100644 --- a/log/logfields/fields.go +++ b/log/logfields/fields.go @@ -1,9 +1,12 @@ package logfields const ( - Module = "module" - Msg = "log_msg" - Logger = "logger" + Module = "module" + Operation = "operation" + Action = "action" + Msg = "log_msg" + Logger = "logger" + Error = "error" ErrorDetail = "error_detail" ErrorStack = "error_stack" diff --git a/log/slogutil/util.go b/log/slogutil/util.go new file mode 100644 index 0000000..b89e445 --- /dev/null +++ b/log/slogutil/util.go @@ -0,0 +1,13 @@ +package slogutil + +import ( + "log/slog" + + "github.com/rs/zerolog" +) + +type LogFunc func(evt *zerolog.Event) + +func Func(fn LogFunc) slog.Attr { + return slog.Any("func", fn) +} diff --git a/log/z_slog_test.go b/log/z_slog_test.go new file mode 100644 index 0000000..6a511ab --- /dev/null +++ b/log/z_slog_test.go @@ -0,0 +1,18 @@ +package log_test + +import ( + "log/slog" + "testing" + + "github.com/pubgo/funk/log" + "github.com/pubgo/funk/log/slogutil" + "github.com/rs/zerolog" +) + +func TestSlog(t *testing.T) { + slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("")))) + slog.Info("ok") + slog.Info("ok", slogutil.Func(func(evt *zerolog.Event) { + evt.Str("record", "ok") + })) +} diff --git a/v2/result/result.go b/v2/result/result.go index 11ac622..636fe4e 100644 --- a/v2/result/result.go +++ b/v2/result/result.go @@ -94,14 +94,14 @@ func (r Result[T]) IsErr() bool { return r.getErr() != nil } func (r Result[T]) IsOK() bool { return r.getErr() == nil } -func (r Result[T]) InspectErr(fn func(error)) Result[T] { +func (r Result[T]) InspectErr(fn func(err error)) Result[T] { if r.IsErr() { fn(r.getErr()) } return r } -func (r Result[T]) Inspect(fn func(T)) Result[T] { +func (r Result[T]) Inspect(fn func(val T)) Result[T] { if r.IsOK() { fn(r.getValue()) } @@ -118,21 +118,21 @@ func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { return r } -func (r Result[T]) Map(fn func(T) T) Result[T] { +func (r Result[T]) Map(fn func(val T) T) Result[T] { if r.IsErr() { return r } return OK(fn(r.getValue())) } -func (r Result[T]) FlatMap(fn func(T) Result[T]) Result[T] { +func (r Result[T]) FlatMap(fn func(val T) Result[T]) Result[T] { if r.IsErr() { return r } return fn(r.getValue()) } -func (r Result[T]) Validate(fn func(T) error) Result[T] { +func (r Result[T]) Validate(fn func(val T) error) Result[T] { if r.IsErr() { return r } @@ -144,14 +144,14 @@ func (r Result[T]) Validate(fn func(T) error) Result[T] { return OK(r.getValue()) } -func (r Result[T]) MapErr(fn func(error) error) Result[T] { +func (r Result[T]) MapErr(fn func(err error) error) Result[T] { if r.IsOK() { return r } return Fail[T](fn(r.getErr())) } -func (r Result[T]) MapErrOr(fn func(error) Result[T]) Result[T] { +func (r Result[T]) MapErrOr(fn func(err error) Result[T]) Result[T] { if r.IsOK() { return r } From 7571a946138830907e305b9a7aaef9d0ed554c57 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 24 Sep 2025 20:43:37 +0800 Subject: [PATCH 20/43] chore: quick update fix/version at 2025-09-24 23:16:29 --- config/envs.go | 2 ++ env/env.go | 78 ++++++++++++++++++++++++++++++++++++--------- env/reload.go | 35 +++++++------------- env/util.go | 35 ++------------------ env/util_test.go | 16 ++++------ v2/result/future.go | 68 +++++++++++++++++++++++++++++++++++++++ v2/result/util.go | 25 +++++++++++++-- 7 files changed, 178 insertions(+), 81 deletions(-) create mode 100644 v2/result/future.go diff --git a/config/envs.go b/config/envs.go index 5bc47e3..4d1c143 100644 --- a/config/envs.go +++ b/config/envs.go @@ -20,6 +20,8 @@ type EnvSpec struct { func initEnv(envMap EnvSpecMap) { for name, cfg := range envMap { + cfg.Name = name + envData := strings.TrimSpace(strutil.FirstNotEmpty(env.Get(name), cfg.Value, cfg.Default)) if cfg.Required && envData == "" { panic("env " + cfg.Name + " is required") diff --git a/env/env.go b/env/env.go index 4ad24ae..eca60ac 100644 --- a/env/env.go +++ b/env/env.go @@ -9,17 +9,25 @@ import ( "github.com/a8m/envsubst" "github.com/joho/godotenv" + "github.com/rs/zerolog" "github.com/samber/lo" "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/log/logfields" "github.com/pubgo/funk/pathutil" "github.com/pubgo/funk/v2/result" ) func Set(key, value string) result.Error { - return result.ErrOf(os.Setenv(KeyHandler(key), value)) + return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str("value", value) + e.Str(logfields.Msg, "env_set_error") + }) } +func MustSet(key, value string) { Set(key, value).Must() } + func GetDefault(name string, defaultVal string) string { val := Get(name) return lo.If(val != "", val).Else(defaultVal) @@ -28,14 +36,14 @@ func GetDefault(name string, defaultVal string) string { func Get(names ...string) string { var val string GetVal(&val, names...) - return trim(val) + return val } func MustGet(names ...string) string { var val string GetVal(&val, names...) assert.If(val == "", "env not found, names=%q", names) - return trim(val) + return val } func GetVal(val *string, names ...string) { @@ -43,14 +51,14 @@ func GetVal(val *string, names ...string) { env, ok := Lookup(name) env = trim(env) if ok && env != "" { - *val = trim(env) + *val = env break } } } func GetBoolVal(val *bool, names ...string) { - dt := trim(Get(names...)) + dt := Get(names...) if dt == "" { return } @@ -65,7 +73,7 @@ func GetBoolVal(val *bool, names ...string) { } func GetIntVal(val *int, names ...string) { - dt := trim(Get(names...)) + dt := Get(names...) if dt == "" { return } @@ -80,7 +88,7 @@ func GetIntVal(val *int, names ...string) { } func GetFloatVal(val *float64, names ...string) { - dt := trim(Get(names...)) + dt := Get(names...) if dt == "" { return } @@ -94,37 +102,77 @@ func GetFloatVal(val *float64, names ...string) { *val = v } -func Lookup(key string) (string, bool) { - return os.LookupEnv(Key(key)) -} +func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } func Delete(key string) result.Error { - return result.ErrOf(os.Unsetenv(Key(key))) + return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str(logfields.Msg, "env_delete_error") + }) } func Expand(value string) result.Result[string] { - return result.Wrap(envsubst.String(value)) + return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { + e.Str("value", value) + e.Str(logfields.Msg, "env_expand_error") + }) } func Map() map[string]string { data := make(map[string]string, len(os.Environ())) for _, env := range os.Environ() { envs := strings.SplitN(env, "=", 2) - data[envs[0]] = envs[1] + if len(envs) != 2 { + continue + } + + data[keyHandler(envs[0])] = envs[1] } return data } func Key(key string) string { - return KeyHandler(key) + return keyHandler(key) } func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) - if result.Catch(&r, godotenv.Overload(files...)) { + if len(files) == 0 { return } + for _, file := range files { + data := result.Wrap(os.ReadFile(file)).Unwrap(&r) + if r.IsErr() { + return + } + + dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + if r.IsErr() { + return + } + + for k, v := range dataMap { + if k == "" || v == "" { + continue + } + + if Set(k, v).Catch(&r) { + return + } + } + } + loadEnv() return } + +// Normalize a-b=>a_b, a.b=>a_b, a/b=>a_b +func Normalize(key string) (string, bool) { + key = trim(key) + if key == "" || strings.HasPrefix(key, "_") || strings.HasPrefix(key, "=") { + return key, false + } + + return keyHandler(key), true +} diff --git a/env/reload.go b/env/reload.go index c78a888..a3067ff 100644 --- a/env/reload.go +++ b/env/reload.go @@ -6,6 +6,7 @@ import ( "os" "strings" + "github.com/pubgo/funk/assert" "github.com/pubgo/funk/log/logfields" ) @@ -22,41 +23,29 @@ func Init() { // 环境变量处理, key转大写, 同时把`-./`转换为`_` // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { - envPrefix := getEnvPrefix() - - logger := slog.With( - slog.String(logfields.Module, "env"), - slog.String(logfields.Operation, "reload_env"), - ) - logger.Info("reload env", slog.Any("env_prefix", map[string]any{"key": PrefixKey, "value": envPrefix})) + logger := slog.With(slog.String(logfields.Module, "env"), slog.String(logfields.Operation, "reload_env")) + logger.Info("reload env") for _, env := range os.Environ() { kvs := strings.SplitN(env, "=", 2) if len(kvs) != 2 { - logger.Error("split env error") - continue - } - - rawEnvKey := trim(kvs[0]) - if rawEnvKey == "" || - strings.HasPrefix(rawEnvKey, "_") || - strings.HasPrefix(rawEnvKey, "=") || - !hasEnvPrefix(rawEnvKey, envPrefix) { - logger.Warn(fmt.Sprintf("unset env, key=%s", rawEnvKey)) - _ = os.Unsetenv(rawEnvKey) + logger.Error("split env error", slog.String("env", env)) continue } - key, ok := Normalize(rawEnvKey) + oldKey := trim(kvs[0]) + newKey, ok := Normalize(oldKey) if ok { - if key == rawEnvKey { + if newKey == oldKey { continue } - setOk := os.Setenv(key, kvs[1]) == nil - logger.Info(fmt.Sprintf("reset env, old_key=%s new_key=%s set_ok=%v", rawEnvKey, key, setOk)) + assert.Exit(os.Unsetenv(oldKey)) + assert.Exit(os.Setenv(newKey, kvs[1])) + logger.Info(fmt.Sprintf("reset env, old_key=%s new_key=%s", oldKey, newKey)) } else { - _ = os.Unsetenv(rawEnvKey) + logger.Warn(fmt.Sprintf("unset env, key=%s", oldKey)) + assert.Exit(os.Unsetenv(oldKey)) } } } diff --git a/env/util.go b/env/util.go index dce159b..ddcccb1 100644 --- a/env/util.go +++ b/env/util.go @@ -1,26 +1,11 @@ package env import ( - "os" "strings" "github.com/ettle/strcase" ) -const PrefixKey = "ENV_PREFIX" - -func hasEnvPrefix(key string, prefix string) bool { - return strings.HasPrefix(strings.ToUpper(key), strings.ToUpper(prefix)) -} - -func getEnvPrefix() string { - prefix := strings.TrimSpace(os.Getenv(PrefixKey)) - if prefix != "" { - prefix = strings.ReplaceAll(prefix+"_", "__", "_") - } - return strings.ToUpper(prefix) -} - var trim = strings.TrimSpace var replacer = strcase.NewCaser( true, @@ -32,21 +17,7 @@ var replacer = strcase.NewCaser( strcase.PreserveNumberFormatting, )) -func KeyHandler(key string) string { - key = strings.ToUpper(replacer.ToSNAKE(key)) - envPrefix := getEnvPrefix() - if envPrefix != "" { - key = envPrefix + "_" + strings.TrimPrefix(key, envPrefix) - } - return strings.ToUpper(trim(strings.ReplaceAll(key, "__", "_"))) -} - -// Normalize a-b=>a_b, a.b=>a_b, a/b=>a_b -func Normalize(key string) (string, bool) { - key = trim(key) - if key == "" || strings.HasPrefix(key, "_") || strings.HasPrefix(key, "=") { - return key, false - } - - return KeyHandler(key), true +func keyHandler(key string) string { + key = strings.ReplaceAll(replacer.ToSNAKE(key), "__", "_") + return strings.ToUpper(trim(key)) } diff --git a/env/util_test.go b/env/util_test.go index 2b7f6ab..bdd1451 100644 --- a/env/util_test.go +++ b/env/util_test.go @@ -5,13 +5,16 @@ import ( "os" "testing" + "github.com/stretchr/testify/assert" + "github.com/pubgo/funk/env" "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pretty" - "github.com/samber/lo" - "github.com/stretchr/testify/assert" ) +func init() { + slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("")))) +} + func TestResetEnv(t *testing.T) { assert.NoError(t, os.Setenv("abc", "1")) assert.Equal(t, os.Getenv("abc"), "1") @@ -26,16 +29,11 @@ func TestNormalize(t *testing.T) { } func TestEnvPrefix(t *testing.T) { - slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("")))) - env.Reload() - pretty.Println("env_keys", lo.Keys(env.Map())) - env.Set(env.PrefixKey, "test").Must() - env.Set("test_hello", "world").Must() + env.MustSet("test_hello", "world") env.Reload() envMap := env.Map() assert.Equal(t, envMap["TEST_HELLO"], "world") - pretty.Println(os.Environ()) } diff --git a/v2/result/future.go b/v2/result/future.go new file mode 100644 index 0000000..2cc05fe --- /dev/null +++ b/v2/result/future.go @@ -0,0 +1,68 @@ +package result + +import ( + "context" + + "github.com/pubgo/funk/assert" + "github.com/samber/lo" +) + +func AsyncErr(fn func() Error) ErrFuture { + assert.If(fn == nil, "[fn] is nil") + + var future = newErrFuture() + go func() { defer future.close(); future.setErr(try(func() error { return fn().getErr() })) }() + return future +} + +func Async[T any](fn func() Result[T]) *Future[T] { + assert.If(fn == nil, "[fn] is nil") + + var future = newFuture[T]() + go func() { defer future.close(); future.setVal(tryResult(fn)) }() + return future +} + +func newFuture[T any]() *Future[T] { + return &Future[T]{done: make(chan struct{})} +} + +type Future[T any] struct { + v Result[T] + done chan struct{} +} + +func (f *Future[T]) close() { close(f.done) } +func (f *Future[T]) setVal(val Result[T]) { f.v = val } + +func (f *Future[T]) Await(ctxL ...context.Context) Result[T] { + ctx := lo.FirstOr(ctxL, context.Background()) + select { + case <-f.done: + return f.v + case <-ctx.Done(): + return f.v.WithErr(ctx.Err()) + } +} + +func newErrFuture() ErrFuture { + return ErrFuture{done: make(chan struct{})} +} + +type ErrFuture struct { + e error + done chan struct{} +} + +func (f *ErrFuture) close() { close(f.done) } +func (f *ErrFuture) setErr(err error) { f.e = err } + +func (f *ErrFuture) Await(ctxL ...context.Context) Error { + ctx := lo.FirstOr(ctxL, context.Background()) + select { + case <-f.done: + return ErrOf(f.e) + case <-ctx.Done(): + return ErrOf(ctx.Err()) + } +} diff --git a/v2/result/util.go b/v2/result/util.go index 0c4bbd5..b415d01 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -14,6 +14,7 @@ import ( "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" + "github.com/pubgo/funk" "github.com/pubgo/funk/errors" "github.com/pubgo/funk/generic" "github.com/pubgo/funk/log" @@ -43,6 +44,27 @@ func try(fn func() error) (gErr error) { return } +func tryResult[T any](fn func() Result[T]) (r Result[T]) { + if fn == nil { + return r.WithErr(errFnIsNil) + } + + defer func() { + var gErr error + if err := errors.Parse(recover()); !funk.IsNil(err) { + gErr = errors.WrapStack(err) + } + + if gErr != nil { + gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn)) + } + + r = r.WithErr(gErr) + }() + + return fn() +} + func try1[T any](fn func() (T, error)) (t T, gErr error) { if fn == nil { return t, errors.WrapStack(errFnIsNil) @@ -245,9 +267,8 @@ func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog. log.Error(ctx). Func(func(e *zerolog.Event) { - e.Str(logfields.Module, "resultv2") + e.Str(logfields.Module, "result2") e.Str(logfields.ErrorStack, string(debug.Stack())) - e.Str(logfields.ErrorDetail, pretty().Sprint(err)) e.Str(logfields.ErrorID, errors.GetErrorId(err)) for _, fn := range events { From 2d5aebe02f545000c55f144e807b47e07acf9753 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 25 Sep 2025 10:43:48 +0800 Subject: [PATCH 21/43] refactor(log): improve slog level conversion and error handling --- log/impl.slog.go | 31 +++++++++++++++++++++++-------- v2/result/future.go | 16 ++++++++++------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/log/impl.slog.go b/log/impl.slog.go index 56c3951..720a46f 100644 --- a/log/impl.slog.go +++ b/log/impl.slog.go @@ -19,6 +19,20 @@ var logLevels = map[slog.Level]zerolog.Level{ slog.LevelWarn: zerolog.WarnLevel, slog.LevelError: zerolog.ErrorLevel, } + +func convertSlog(lvl slog.Level) slog.Level { + switch { + case lvl < slog.LevelInfo: + return slog.LevelDebug + case lvl < slog.LevelWarn: + return slog.LevelInfo + case lvl < slog.LevelError: + return slog.LevelWarn + default: + return slog.LevelError + } +} + var _ slog.Handler = (*slogImpl)(nil) type slogImpl struct { @@ -26,25 +40,22 @@ type slogImpl struct { } func (s slogImpl) Enabled(ctx context.Context, level slog.Level) bool { - return s.l.(*loggerImpl).enabled(ctx, logLevels[level]) + return s.l.(*loggerImpl).enabled(ctx, logLevels[convertSlog(level)]) } func (s slogImpl) Handle(ctx context.Context, r slog.Record) error { - if r.Level < 0 { - r.Level = slog.LevelDebug - } - - logger := s.l.WithLevel(logLevels[r.Level]) + level := convertSlog(r.Level) + logger := s.l.WithLevel(logLevels[level]) var evt *Event - switch r.Level { + switch level { case slog.LevelDebug: evt = logger.Debug(ctx) case slog.LevelInfo: evt = logger.Info(ctx) case slog.LevelWarn: evt = logger.Warn(ctx) - case slog.LevelError: + default: evt = logger.Error(ctx) } @@ -52,6 +63,10 @@ func (s slogImpl) Handle(ctx context.Context, r slog.Record) error { return nil } + if isLogDisabled(ctx) { + return nil + } + if !r.Time.IsZero() { evt.Time(zerolog.TimestampFieldName, r.Time) } diff --git a/v2/result/future.go b/v2/result/future.go index 2cc05fe..747b00b 100644 --- a/v2/result/future.go +++ b/v2/result/future.go @@ -3,28 +3,32 @@ package result import ( "context" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/errors" "github.com/samber/lo" ) func AsyncErr(fn func() Error) ErrFuture { - assert.If(fn == nil, "[fn] is nil") + if fn == nil { + return ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} + } var future = newErrFuture() go func() { defer future.close(); future.setErr(try(func() error { return fn().getErr() })) }() return future } -func Async[T any](fn func() Result[T]) *Future[T] { - assert.If(fn == nil, "[fn] is nil") +func Async[T any](fn func() Result[T]) Future[T] { + if fn == nil { + return Future[T]{v: Fail[T](errors.WrapCaller(errFnIsNil, 1))} + } var future = newFuture[T]() go func() { defer future.close(); future.setVal(tryResult(fn)) }() return future } -func newFuture[T any]() *Future[T] { - return &Future[T]{done: make(chan struct{})} +func newFuture[T any]() Future[T] { + return Future[T]{done: make(chan struct{})} } type Future[T any] struct { From 0fbd459d8690ee5e0758ccb8ba29e8c33b0b459b Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 25 Sep 2025 13:53:13 +0800 Subject: [PATCH 22/43] chore: add merge package placeholder --- merge/_.go | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 merge/_.go diff --git a/merge/_.go b/merge/_.go new file mode 100644 index 0000000..45ebffe --- /dev/null +++ b/merge/_.go @@ -0,0 +1,3 @@ +package merge + +// https://github.com/TwiN/deepmerge From dcc97b1525cb9e7262c674186a22a0ce5d5f06e4 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 11:35:36 +0800 Subject: [PATCH 23/43] chore: quick update fix/version at 2025-09-26 15:25:41 --- component/gormclient/migratecmd/cmd.go | 291 ++++++++++++------------- config/envs.go | 7 +- go.mod | 1 - go.sum | 2 - monster/monster.go | 2 +- v2/result/util.go | 28 +-- 6 files changed, 157 insertions(+), 174 deletions(-) diff --git a/component/gormclient/migratecmd/cmd.go b/component/gormclient/migratecmd/cmd.go index 191e644..b66a973 100644 --- a/component/gormclient/migratecmd/cmd.go +++ b/component/gormclient/migratecmd/cmd.go @@ -1,156 +1,139 @@ package migratecmd -import ( - "context" - "path/filepath" - "time" - - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/gormclient" - "github.com/pubgo/funk/component/gormclient/migrates" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - cli "github.com/urfave/cli/v3" - "gorm.io/gen" -) - -type params struct { - Log log.Logger - Db *gormclient.Client - Migrations []migrates.Migrate - Generations migrates.Generation -} - -func migrate(m []migrates.Migrate) []*migrates.Migration { - var migrations []*migrates.Migration - for i := range m { - migrations = append(migrations, m[i]()) - } - return migrations -} - -func New(di *dix.Dix) *cli.Command { - var id string - - options := migrates.DefaultConfig - return &cli.Command{ - Name: "migrate", - Usage: "db migrate", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "id", - Usage: "migration id", - Destination: &id, - }, - }, - Before: func(ctx context.Context, command *cli.Command) (context.Context, error) { - p := dix.Inject(di, new(params)) - options.TableName = p.Db.TablePrefix + migrates.DefaultConfig.TableName - return ctx, nil - }, - Commands: []*cli.Command{ - { - Name: "migrate", - Usage: "do migrate", - Aliases: []string{"m"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - p := dix.Inject(di, new(params)) - m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) - if id == "" { - assert.Must(m.Migrate()) - } else { - assert.Must(m.MigrateTo(id)) - } - p.Log.Info().Msg("migration ok") - return nil - }, - }, - { - Name: "list", - Usage: "list migrate", - Aliases: []string{"l"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - p := dix.Inject(di, new(params)) - - var ids []string - assert.Must(p.Db.Table(options.TableName).Select("id").Find(&ids).Error) - - for _, m := range migrate(p.Migrations) { - p.Log.Info().Msgf("migration-id=%s %s", m.ID, generic.Ternary(generic.Contains(ids, m.ID), "done", "missing")) - ids = generic.Delete(ids, m.ID) - } - - for i := range ids { - p.Log.Info().Msgf("migration-id=%s %s", ids[i], "undo") - } - - time.Sleep(time.Millisecond * 10) - return nil - }, - }, - { - Name: "rollback", - Usage: "do rollback", - Aliases: []string{"r"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Recovery(func(err error) { - if errors.Is(err, migrates.ErrNoRunMigration) { - return - } - - assert.Exit(err) - }) - - p := dix.Inject(di, new(params)) - m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) - if id == "" { - assert.Must(m.RollbackLast()) - } else { - assert.Must(m.RollbackTo(id)) - } - p.Log.Info().Msg("rollback last ok") - return nil - }, - }, - { - Name: "gen", - Usage: "do gen orm model and query code", - Aliases: []string{"g"}, - UsageText: "migrate gen [./internal/db]", - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - genPath := "./internal/db" - if command.NArg() > 0 { - genPath = command.Args().First() - } - - g := gen.NewGenerator(gen.Config{ - OutPath: filepath.Join(genPath, "query"), - ModelPkgPath: filepath.Join(genPath, "models"), - FieldWithTypeTag: true, - FieldWithIndexTag: true, - FieldNullable: true, - FieldCoverable: true, - Mode: gen.WithQueryInterface | gen.WithDefaultQuery | gen.WithoutContext, - }) - - p := dix.Inject(di, new(params)) - g.UseDB(p.Db.DB) - - g.ApplyBasic(p.Generations(g)...) - g.Execute() - - return nil - }, - }, - }, - } -} +//type params struct { +// Log log.Logger +// Db *gormclient.Client +// Migrations []migrates.Migrate +// Generations migrates.Generation +//} +// +//func migrate(m []migrates.Migrate) []*migrates.Migration { +// var migrations []*migrates.Migration +// for i := range m { +// migrations = append(migrations, m[i]()) +// } +// return migrations +//} +// +//func New(di *dix.Dix) *cli.Command { +// var id string +// +// options := migrates.DefaultConfig +// return &cli.Command{ +// Name: "migrate", +// Usage: "db migrate", +// Flags: []cli.Flag{ +// &cli.StringFlag{ +// Name: "id", +// Usage: "migration id", +// Destination: &id, +// }, +// }, +// Before: func(ctx context.Context, command *cli.Command) (context.Context, error) { +// p := dix.Inject(di, new(params)) +// options.TableName = p.Db.TablePrefix + migrates.DefaultConfig.TableName +// return ctx, nil +// }, +// Commands: []*cli.Command{ +// { +// Name: "migrate", +// Usage: "do migrate", +// Aliases: []string{"m"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// p := dix.Inject(di, new(params)) +// m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) +// if id == "" { +// assert.Must(m.Migrate()) +// } else { +// assert.Must(m.MigrateTo(id)) +// } +// p.Log.Info().Msg("migration ok") +// return nil +// }, +// }, +// { +// Name: "list", +// Usage: "list migrate", +// Aliases: []string{"l"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// p := dix.Inject(di, new(params)) +// +// var ids []string +// assert.Must(p.Db.Table(options.TableName).Select("id").Find(&ids).Error) +// +// for _, m := range migrate(p.Migrations) { +// p.Log.Info().Msgf("migration-id=%s %s", m.ID, generic.Ternary(generic.Contains(ids, m.ID), "done", "missing")) +// ids = generic.Delete(ids, m.ID) +// } +// +// for i := range ids { +// p.Log.Info().Msgf("migration-id=%s %s", ids[i], "undo") +// } +// +// time.Sleep(time.Millisecond * 10) +// return nil +// }, +// }, +// { +// Name: "rollback", +// Usage: "do rollback", +// Aliases: []string{"r"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Recovery(func(err error) { +// if errors.Is(err, migrates.ErrNoRunMigration) { +// return +// } +// +// assert.Exit(err) +// }) +// +// p := dix.Inject(di, new(params)) +// m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) +// if id == "" { +// assert.Must(m.RollbackLast()) +// } else { +// assert.Must(m.RollbackTo(id)) +// } +// p.Log.Info().Msg("rollback last ok") +// return nil +// }, +// }, +// { +// Name: "gen", +// Usage: "do gen orm model and query code", +// Aliases: []string{"g"}, +// UsageText: "migrate gen [./internal/db]", +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// genPath := "./internal/db" +// if command.NArg() > 0 { +// genPath = command.Args().First() +// } +// +// g := gen.NewGenerator(gen.Config{ +// OutPath: filepath.Join(genPath, "query"), +// ModelPkgPath: filepath.Join(genPath, "models"), +// FieldWithTypeTag: true, +// FieldWithIndexTag: true, +// FieldNullable: true, +// FieldCoverable: true, +// Mode: gen.WithQueryInterface | gen.WithDefaultQuery | gen.WithoutContext, +// }) +// +// p := dix.Inject(di, new(params)) +// g.UseDB(p.Db.DB) +// +// g.ApplyBasic(p.Generations(g)...) +// g.Execute() +// +// return nil +// }, +// }, +// }, +// } +//} diff --git a/config/envs.go b/config/envs.go index 4d1c143..f3b9f29 100644 --- a/config/envs.go +++ b/config/envs.go @@ -10,8 +10,11 @@ import ( type EnvSpecMap map[string]*EnvSpec type EnvSpec struct { - Name string `yaml:"name"` + Name string `yaml:"name"` + + // Description Deprecated: use Desc instead. Description string `yaml:"description"` + Desc string `yaml:"desc"` Default string `yaml:"default"` Value string `yaml:"value"` Required bool `yaml:"required"` @@ -21,7 +24,7 @@ type EnvSpec struct { func initEnv(envMap EnvSpecMap) { for name, cfg := range envMap { cfg.Name = name - + envData := strings.TrimSpace(strutil.FirstNotEmpty(env.Get(name), cfg.Value, cfg.Default)) if cfg.Required && envData == "" { panic("env " + cfg.Name + " is required") diff --git a/go.mod b/go.mod index 67e8dc2..514a48a 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/phuslu/goid v1.0.0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 - github.com/pubgo/dix v0.3.15 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.51.0 diff --git a/go.sum b/go.sum index c9580c5..04e3504 100644 --- a/go.sum +++ b/go.sum @@ -300,8 +300,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q= github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= -github.com/pubgo/dix v0.3.15 h1:DLjXfnyhcxT3skM1pZi60i/QgnUEg9nM6CI8wom7gVc= -github.com/pubgo/dix v0.3.15/go.mod h1:0j+i8YYn4vJnsJQCsyHXUGovR+Mgkh3uZPRhacw09us= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= diff --git a/monster/monster.go b/monster/monster.go index 1d9714d..0febca4 100644 --- a/monster/monster.go +++ b/monster/monster.go @@ -69,7 +69,7 @@ func (m *Monster) VisitAll(fn func(*Entry)) { } } -func AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { +func Register(name string, get Getter, set Setter, usage string, tags ...map[string]any) { defaultMonster.AddFunc(name, get, set, usage, tags...) } diff --git a/v2/result/util.go b/v2/result/util.go index b415d01..a76fff8 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -2,14 +2,13 @@ package result import ( "context" + "encoding/base64" "fmt" "log/slog" "reflect" "runtime/debug" "strings" - "sync" - "github.com/k0kubun/pp/v3" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" @@ -268,23 +267,24 @@ func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog. log.Error(ctx). Func(func(e *zerolog.Event) { e.Str(logfields.Module, "result2") - e.Str(logfields.ErrorStack, string(debug.Stack())) + e.Str(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())) e.Str(logfields.ErrorID, errors.GetErrorId(err)) - + e.Str(zerolog.ErrorFieldName, err.Error()) + e.CallerSkipFrame(2 + skip) + }). + Func(func(e *zerolog.Event) { for _, fn := range events { fn(e) } }). - Str(zerolog.ErrorFieldName, err.Error()). - CallerSkipFrame(2+skip). Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } -var pretty = sync.OnceValue(func() *pp.PrettyPrinter { - printer := pp.New() - printer.SetColoringEnabled(false) - printer.SetExportedOnly(false) - printer.SetOmitEmpty(true) - printer.SetMaxDepth(5) - return printer -}) +//var pretty = sync.OnceValue(func() *pp.PrettyPrinter { +// printer := pp.New() +// printer.SetColoringEnabled(false) +// printer.SetExportedOnly(false) +// printer.SetOmitEmpty(true) +// printer.SetMaxDepth(5) +// return printer +//}) From 403889aa5e4c378dc74d7bbf3ab191ea76acbbfd Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 21:07:33 +0800 Subject: [PATCH 24/43] refactor: replace Unwrap with Must in config merge calls --- component/etcdv3/client.go | 2 +- component/gormclient/builder.go | 2 +- env/env.go | 72 ++++++++++++++++++--------------- migrates/entmigrates/migrate.go | 2 +- running/runtime.go | 17 ++++---- 5 files changed, 50 insertions(+), 45 deletions(-) diff --git a/component/etcdv3/client.go b/component/etcdv3/client.go index 7ceddb7..b025bc9 100644 --- a/component/etcdv3/client.go +++ b/component/etcdv3/client.go @@ -12,7 +12,7 @@ import ( ) func New(conf *Config) *Client { - conf = config.MergeR(DefaultCfg(), *conf).Unwrap() + conf = config.MergeR(DefaultCfg(), *conf).Must() cfg := merge.Struct(new(client3.Config), conf).Unwrap() cfg.DialOptions = append( cfg.DialOptions, diff --git a/component/gormclient/builder.go b/component/gormclient/builder.go index 0836a9c..73c6be8 100644 --- a/component/gormclient/builder.go +++ b/component/gormclient/builder.go @@ -23,7 +23,7 @@ func NewClients(conf map[string]*Config, logs log.Logger) map[string]*Client { func New(conf *Config, logs log.Logger) *Client { logs = logs.WithName(Name) - conf = config.MergeR(generic.Ptr(DefaultCfg()), conf).Unwrap() + conf = config.MergeR(generic.Ptr(DefaultCfg()), conf).Must() ormCfg := merge.Copy(new(gorm.Config), conf).Unwrap() ormCfg.NowFunc = func() time.Time { return time.Now().UTC() } diff --git a/env/env.go b/env/env.go index eca60ac..02ce4b2 100644 --- a/env/env.go +++ b/env/env.go @@ -28,25 +28,26 @@ func Set(key, value string) result.Error { func MustSet(key, value string) { Set(key, value).Must() } -func GetDefault(name string, defaultVal string) string { - val := Get(name) - return lo.If(val != "", val).Else(defaultVal) -} - func Get(names ...string) string { var val string - GetVal(&val, names...) + getVal(&val, names...) return val } func MustGet(names ...string) string { - var val string - GetVal(&val, names...) + val := Get(names...) assert.If(val == "", "env not found, names=%q", names) return val } -func GetVal(val *string, names ...string) { +func GetOr(name string, defaultVal string) string { + val := Get(name) + return lo.If(val != "", val).Else(defaultVal) +} + +func GetWith(val *string, names ...string) { getVal(val, names...) } + +func getVal(val *string, names ...string) { for _, name := range names { env, ok := Lookup(name) env = trim(env) @@ -57,49 +58,52 @@ func GetVal(val *string, names ...string) { } } -func GetBoolVal(val *bool, names ...string) { - dt := Get(names...) - if dt == "" { - return +func GetBool(names ...string) bool { + var val string + getVal(&val, names...) + if val == "" { + return false } - v, err := strconv.ParseBool(dt) + v, err := strconv.ParseBool(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to bool, keys=%q value=%s err=%v", names, dt, err)) - return + slog.Error(fmt.Sprintf("env: failed to parse string to bool, keys=%q value=%s err=%v", names, val, err)) + return false } - *val = v + return v } -func GetIntVal(val *int, names ...string) { - dt := Get(names...) - if dt == "" { - return +func GetInt(names ...string) int { + var val string + getVal(&val, names...) + if val == "" { + return -1 } - v, err := strconv.Atoi(dt) + v, err := strconv.Atoi(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to int, keys=%q value=%s err=%v", names, dt, err)) - return + slog.Error(fmt.Sprintf("env: failed to parse string to int, keys=%q value=%s err=%v", names, val, err)) + return -1 } - *val = v + return v } -func GetFloatVal(val *float64, names ...string) { - dt := Get(names...) - if dt == "" { - return +func GetFloat(names ...string) float64 { + var val string + getVal(&val, names...) + if val == "" { + return -1 } - v, err := strconv.ParseFloat(dt, 64) + v, err := strconv.ParseFloat(val, 64) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to float, keys=%q value=%s err=%v", names, dt, err)) - return + slog.Error(fmt.Sprintf("env: failed to parse string to float, keys=%q value=%s err=%v", names, val, err)) + return -1 } - *val = v + return v } func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } @@ -111,6 +115,8 @@ func Delete(key string) result.Error { }) } +func MustDelete(key string) { Delete(key).Must() } + func Expand(value string) result.Result[string] { return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { e.Str("value", value) diff --git a/migrates/entmigrates/migrate.go b/migrates/entmigrates/migrate.go index 5582e4d..276a0b9 100644 --- a/migrates/entmigrates/migrate.go +++ b/migrates/entmigrates/migrate.go @@ -58,7 +58,7 @@ type GoMigrate struct { // New returns a new GoMigrate. func New(db *entsql.Driver, cfg *Config, migrations []*Migration, tables []*schema.Table) *GoMigrate { - cfg = config.MergeR(generic.Ptr(DefaultConfig), cfg).Unwrap() + cfg = config.MergeR(generic.Ptr(DefaultConfig), cfg).Must() orm := assert.Must1(gorm.Open(dp.New(dp.Config{ DriverName: db.Dialect(), diff --git a/running/runtime.go b/running/runtime.go index ba58fe4..2a85916 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -24,10 +24,6 @@ var ( Env = "debug" - // IsDebug - // Deprecated: use Debug - IsDebug = true - // InstanceID service id InstanceID = xid.New().String() @@ -66,13 +62,16 @@ var ( enableDebug = monster.Bool("debug", false, "enable debug") ) -func Debug() bool { - return IsDebug || enableDebug.Get() -} +func Debug() bool { return enableDebug.Get() } func init() { - env.GetBoolVal(&IsDebug, "enable_debug", "debug", "dev_mode") - env.GetVal(&Env, "env", "run_mode", "run_env") + if env.GetBool("enable_debug", "debug", "dev_mode") { + assert.Exit(enableDebug.Set(true)) + } + + if e := env.Get("env", "run_mode", "run_env"); e != "" { + Env = e + } id, err := machineid.ID() if err == nil { From 3e5f4c76e7057b738cdcd58f7877f8a7c666137c Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 22:04:22 +0800 Subject: [PATCH 25/43] fix: encode error stack as base64 and improve error formatting --- assert/util.go | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/assert/util.go b/assert/util.go index cacae59..7b173f8 100644 --- a/assert/util.go +++ b/assert/util.go @@ -1,6 +1,7 @@ package assert import ( + "encoding/base64" "fmt" "log/slog" "reflect" @@ -8,8 +9,11 @@ import ( "sync" "github.com/k0kubun/pp/v3" - "github.com/pubgo/funk/log/logfields" "github.com/samber/lo" + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/proto" + + "github.com/pubgo/funk/log/logfields" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { @@ -34,7 +38,7 @@ func logErr(err error, message string, attrs ...slog.Attr) { attrs = append(attrs, slog.String(logfields.Module, "assert"), slog.String(logfields.Error, err.Error()), - slog.String(logfields.ErrorStack, string(debug.Stack())), + slog.String(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())), slog.String(logfields.ErrorDetail, pretty().Sprint(err)), ) slog.Error(message, lo.ToAnySlice(attrs)...) @@ -45,14 +49,29 @@ func must(err error, messageArgs ...any) { return } + var attrs = []slog.Attr{slog.Bool("panic", true)} + if v, ok := lo.ErrorsAs[interface { + ID() string + Error() string + }](err); ok && v != nil { + attrs = append(attrs, slog.String(logfields.ErrorID, v.ID())) + } + message := messageFromMsgAndArgs(messageArgs...) if message == "" { - message = err.Error() + if v, ok := lo.ErrorsAs[interface { + Proto() proto.Message + Error() string + }](err); ok && v != nil { + message = fmt.Sprintf("%s\n%s", err.Error(), prototext.Format(v.Proto())) + } else { + message = err.Error() + } } else { message = fmt.Sprintf("msg:%v err:%s", message, err.Error()) } - logErr(err, message, slog.Bool("panic", true)) + logErr(err, message, attrs...) panic(err) } From e41d241bc4c2ce3d917a6ad1af1e31e58406a8e4 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 22:09:30 +0800 Subject: [PATCH 26/43] chore: quick update fix/version at 2025-09-26 22:09:29 --- assert/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assert/util.go b/assert/util.go index 7b173f8..813592c 100644 --- a/assert/util.go +++ b/assert/util.go @@ -39,7 +39,7 @@ func logErr(err error, message string, attrs ...slog.Attr) { slog.String(logfields.Module, "assert"), slog.String(logfields.Error, err.Error()), slog.String(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())), - slog.String(logfields.ErrorDetail, pretty().Sprint(err)), + slog.String(logfields.ErrorDetail, fmt.Sprintf("%v", err)), ) slog.Error(message, lo.ToAnySlice(attrs)...) } From a87a3f96afad5c6b3bb6c4836b44a45c15f20c37 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 22:32:21 +0800 Subject: [PATCH 27/43] refactor(assert): improve error logging with stack traces --- assert/must_test.go | 9 ++++++++- assert/util.go | 9 +++++++-- stack/trace_test.go | 4 ++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/assert/must_test.go b/assert/must_test.go index 7eea19d..2248305 100644 --- a/assert/must_test.go +++ b/assert/must_test.go @@ -2,13 +2,20 @@ package assert_test import ( "fmt" + "log/slog" "testing" + "github.com/stretchr/testify/assert" + assert1 "github.com/pubgo/funk/assert" "github.com/pubgo/funk/errors" - "github.com/stretchr/testify/assert" + "github.com/pubgo/funk/log" ) +func init() { + slog.SetDefault(slog.New(log.NewSlog(log.GetLogger("fastcommit")))) +} + type errBase struct { msg string } diff --git a/assert/util.go b/assert/util.go index 813592c..c84a25f 100644 --- a/assert/util.go +++ b/assert/util.go @@ -1,7 +1,6 @@ package assert import ( - "encoding/base64" "fmt" "log/slog" "reflect" @@ -14,6 +13,7 @@ import ( "google.golang.org/protobuf/proto" "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/stack" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { @@ -30,15 +30,20 @@ func messageFromMsgAndArgs(msgAndArgs ...any) string { return pretty().Sprint(msgAndArgs...) } +var assetFile = stack.Caller(0) + func logErr(err error, message string, attrs ...slog.Attr) { if err == nil { return } + traces := lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { + return !item.IsRuntime() && item.Pkg != assetFile.Pkg + }) attrs = append(attrs, slog.String(logfields.Module, "assert"), slog.String(logfields.Error, err.Error()), - slog.String(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())), + slog.Any(logfields.ErrorStack, lo.Map(traces, func(item *stack.Frame, index int) string { return item.String() })), slog.String(logfields.ErrorDetail, fmt.Sprintf("%v", err)), ) slog.Error(message, lo.ToAnySlice(attrs)...) diff --git a/stack/trace_test.go b/stack/trace_test.go index b044829..76443c4 100644 --- a/stack/trace_test.go +++ b/stack/trace_test.go @@ -5,9 +5,13 @@ import ( "github.com/pubgo/funk/pretty" "github.com/pubgo/funk/stack" + "github.com/samber/lo" ) func TestTrace(t *testing.T) { traces := stack.Trace() t.Log(pretty.Sprint(traces)) + + traces = lo.Filter(traces, func(item *stack.Frame, index int) bool { return !item.IsRuntime() }) + t.Log(pretty.Sprint(lo.Map(traces, func(item *stack.Frame, index int) string { return item.String() }))) } From 3637372cc3bc954b1e9a88b2f6d71ca841c38c2c Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 22:36:53 +0800 Subject: [PATCH 28/43] refactor(result): improve error logging with stack traces --- v2/result/util.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/v2/result/util.go b/v2/result/util.go index a76fff8..469e91f 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -2,7 +2,6 @@ package result import ( "context" - "encoding/base64" "fmt" "log/slog" "reflect" @@ -259,16 +258,23 @@ func setError(setter ErrSetter, err error) { } } +var resultFile = stack.Caller(0) + func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog.Event)) { if err == nil { return } + traces := lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { + return !item.IsRuntime() && item.Pkg != resultFile.Pkg + }) + log.Error(ctx). Func(func(e *zerolog.Event) { e.Str(logfields.Module, "result2") - e.Str(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())) + e.Strs(logfields.ErrorStack, lo.Map(traces, func(item *stack.Frame, index int) string { return item.String() })) e.Str(logfields.ErrorID, errors.GetErrorId(err)) + e.Str(logfields.ErrorDetail, fmt.Sprintf("%v", err)) e.Str(zerolog.ErrorFieldName, err.Error()) e.CallerSkipFrame(2 + skip) }). @@ -279,12 +285,3 @@ func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog. }). Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } - -//var pretty = sync.OnceValue(func() *pp.PrettyPrinter { -// printer := pp.New() -// printer.SetColoringEnabled(false) -// printer.SetExportedOnly(false) -// printer.SetOmitEmpty(true) -// printer.SetMaxDepth(5) -// return printer -//}) From 75c337fb16cb1d9b7b308a434e15e8e1304a9157 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 27 Sep 2025 09:45:40 +0800 Subject: [PATCH 29/43] chore: quick update fix/version at 2025-09-27 19:04:57 --- assert/assert_test.go | 4 +- assert/must_test.go | 6 +- assert/util.go | 4 +- async/base.go | 2 +- async/base_test.go | 2 +- async/future.go | 2 +- async/go.go | 14 +- async/go_test.go | 8 +- async/iterator.go | 2 +- async/promise.go | 8 +- async/promise_test.go | 14 +- cmds/configcmd/cmd.go | 6 +- cmds/ent/main1.go | 2 +- cmds/envcmd/cmd.go | 8 +- cmds/protoc-gen-go-cloudevent/internal/gen.go | 8 +- cmds/protoc-gen-go-cloudevent/main.go | 2 +- cmds/protoc-gen-go-enum/main.go | 2 +- cmds/protoc-gen-go-errors/internal/gen.go | 6 +- cmds/protoc-gen-go-errors/main.go | 2 +- cmds/protoc-gen-go-sql/main.go | 2 +- cmds/testmain/main.go | 10 +- cmds/versioncmd/cmd.go | 8 +- cmux/mux.go | 4 +- component/bbolt/client.go | 22 +- component/bbolt/config.go | 4 +- component/cloudevent/aaa.go | 4 +- component/cloudevent/client.go | 28 +- component/cloudevent/config.go | 8 +- component/cloudevent/context.go | 2 +- component/cloudevent/errors.go | 2 +- component/cloudevent/publisher.go | 30 +- component/cloudevent/register.go | 8 +- component/cloudevent/util.go | 10 +- component/etcdv3/client.go | 10 +- component/gormclient/builder.go | 12 +- component/gormclient/client.go | 6 +- component/gormclient/config.go | 2 +- component/gormclient/drivers/mysql/driver.go | 14 +- .../gormclient/drivers/postgres/driver.go | 10 +- component/gormclient/drivers/sqlite/driver.go | 12 +- component/gormclient/factory.go | 6 +- component/gormclient/migrates/migrate.go | 6 +- component/natsclient/client.go | 8 +- config/config.go | 18 +- config/envs.go | 4 +- config/types.go | 2 +- config/util.go | 12 +- config/util_test.go | 2 +- cryptoutil/util.go | 13 +- ctxutil/util_test.go | 2 +- env/env.go | 26 +- env/reload.go | 4 +- env/util_test.go | 4 +- errors/aaa.go | 2 +- errors/err_code.go | 8 +- errors/err_msg.go | 8 +- errors/err_simple.go | 6 +- errors/err_wrap.go | 4 +- errors/errinter/colorfield.go | 2 +- errors/errinter/utils.go | 6 +- errors/errinter/z_util_test.go | 6 +- errors/errors.go | 6 +- errors/errutil/util.go | 12 +- errors/errutil/util_test.go | 4 +- errors/registry.go | 2 +- errors/stack_filters.go | 2 +- errors/util.go | 8 +- errors/z_code_test.go | 4 +- errors/z_err_code_test.go | 6 +- errors/z_error_stack_test.go | 4 +- errors/z_error_test.go | 6 +- generic/util.go | 2 +- go.mod | 2 +- internal/anyhow/aherrcheck/errcheck.go | 2 +- internal/anyhow/anyhow.go | 2 +- internal/anyhow/error.go | 6 +- internal/anyhow/error_test.go | 2 +- internal/anyhow/result.go | 6 +- internal/anyhow/result_test.go | 12 +- internal/anyhow/util.go | 10 +- internal/example/app/main.go | 2 +- internal/example/env/main.go | 4 +- internal/example/errors/main.go | 6 +- internal/example/log/main.go | 2 +- log/global.go | 6 +- log/impl.log.go | 4 +- log/impl.slog.go | 2 +- log/util.go | 2 +- log/z_log_std_test.go | 2 +- log/z_log_test.go | 6 +- log/z_slog_test.go | 4 +- merge/merge.go | 6 +- merge/merge_test.go | 4 +- migrates/entmigrates/config.go | 2 +- migrates/entmigrates/migrate.go | 12 +- monster/example/main.go | 2 +- monster/monster.go | 24 +- monster/types.go | 22 +- netutil/conn.go | 4 +- netutil/conncheck.go | 2 +- netutil/util.go | 2 +- pathutil/file.go | 6 +- proto/testcodepb/test.errors.pb.go | 4 +- proto/testcodepb/test.pb.go | 2 +- protoutils/ext.go | 2 +- protoutils/util.go | 4 +- recovery/recovery.go | 2 +- recovery/recovery_test.go | 12 +- {v2/result => result}/api.go | 2 +- {v2/result => result}/error.go | 6 +- {v2/result => result}/error_test.go | 4 +- {v2/result => result}/future.go | 2 +- {v2/result => result}/interface.go | 0 {v2/result => result}/proxy.go | 0 {v2/result => result}/proxy_test.go | 0 result/result.go | 328 +++++++----------- result/result_test.go | 80 +++-- .../resultchecker/checker.go | 2 +- .../resultchecker/checker_test.go | 0 .../resultchecker/context.go | 0 {v2/result => result}/util.go | 18 +- retry/backoff_constant.go | 2 +- retry/backoff_exponential.go | 2 +- retry/backoff_fibonacci.go | 2 +- retry/retry.go | 2 +- running/runtime.go | 14 +- running/util.go | 6 +- shutil/shell.go | 14 +- stack/stack_test.go | 8 +- stack/trace_test.go | 4 +- stack/util.go | 2 +- strutil/template.go | 2 +- syncutil/base.go | 2 +- syncutil/waitgroup.go | 6 +- template/template.go | 4 +- try/try.go | 6 +- try/try_test.go | 2 +- typex/lock_map.go | 2 +- typex/set.go | 6 +- typex/sync_map.go | 6 +- typex/yaml.go | 4 +- utils/utils.go | 2 +- v2/result/result.go | 224 ------------ v2/result/result_test.go | 93 ----- vars/vars.go | 4 +- vars/z_test.go | 6 +- 146 files changed, 610 insertions(+), 966 deletions(-) rename {v2/result => result}/api.go (98%) rename {v2/result => result}/error.go (95%) rename {v2/result => result}/error_test.go (71%) rename {v2/result => result}/future.go (97%) rename {v2/result => result}/interface.go (100%) rename {v2/result => result}/proxy.go (100%) rename {v2/result => result}/proxy_test.go (100%) rename {v2/result => result}/resultchecker/checker.go (96%) rename {v2/result => result}/resultchecker/checker_test.go (100%) rename {v2/result => result}/resultchecker/context.go (100%) rename {v2/result => result}/util.go (91%) delete mode 100644 v2/result/result.go delete mode 100644 v2/result/result_test.go diff --git a/assert/assert_test.go b/assert/assert_test.go index f6bf99b..124d0eb 100644 --- a/assert/assert_test.go +++ b/assert/assert_test.go @@ -3,8 +3,8 @@ package assert_test import ( "testing" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) func TestCheckNil(t *testing.T) { diff --git a/assert/must_test.go b/assert/must_test.go index 2248305..e6d41e4 100644 --- a/assert/must_test.go +++ b/assert/must_test.go @@ -7,9 +7,9 @@ import ( "github.com/stretchr/testify/assert" - assert1 "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" + assert1 "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" ) func init() { diff --git a/assert/util.go b/assert/util.go index c84a25f..a6a5000 100644 --- a/assert/util.go +++ b/assert/util.go @@ -12,8 +12,8 @@ import ( "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/stack" ) func messageFromMsgAndArgs(msgAndArgs ...any) string { diff --git a/async/base.go b/async/base.go index 1afc19a..1b97674 100644 --- a/async/base.go +++ b/async/base.go @@ -1,6 +1,6 @@ package async -import "github.com/pubgo/funk/log" +import "github.com/pubgo/funk/v2/log" const Name = "async" diff --git a/async/base_test.go b/async/base_test.go index 36445ec..d6c5f06 100644 --- a/async/base_test.go +++ b/async/base_test.go @@ -3,7 +3,7 @@ package async import ( "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestLogger(t *testing.T) { diff --git a/async/future.go b/async/future.go index f30fbb5..d6f7e70 100644 --- a/async/future.go +++ b/async/future.go @@ -1,7 +1,7 @@ package async import ( - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" ) func newFuture[T any]() *Future[T] { diff --git a/async/go.go b/async/go.go index 0edd939..7ffe439 100644 --- a/async/go.go +++ b/async/go.go @@ -6,13 +6,13 @@ import ( "runtime/debug" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/try" ) // Async 异步执行函数并同步等待 diff --git a/async/go_test.go b/async/go_test.go index 09f65c8..0e9ff34 100644 --- a/async/go_test.go +++ b/async/go_test.go @@ -13,8 +13,8 @@ func TestAsync(t *testing.T) { ret := Async(func() (*http.Response, error) { //nolint return http.Get("https://httpbin.org") }).Await() - assert.NoError(t, ret.Err()) - rsp := ret.Unwrap() + assert.NoError(t, ret.GetErr()) + rsp := ret.Must() if b := rsp.Body; b != nil { defer b.Close() } @@ -36,9 +36,9 @@ func TestGoChan(t *testing.T) { val2 := Async(func() (string, error) { time.Sleep(time.Millisecond * 10) fmt.Println("2") - ret := val1.Await().Unwrap() + ret := val1.Await().Must() return ret + " hello2", nil }) - assert.Equal(t, "hello1 hello2", val2.Await().Unwrap()) + assert.Equal(t, "hello1 hello2", val2.Await().Must()) } diff --git a/async/iterator.go b/async/iterator.go index d3d39eb..b97b323 100644 --- a/async/iterator.go +++ b/async/iterator.go @@ -1,7 +1,7 @@ package async import ( - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/result" ) func iteratorOf[T any]() *Iterator[T] { diff --git a/async/promise.go b/async/promise.go index 56bed6b..d857f25 100644 --- a/async/promise.go +++ b/async/promise.go @@ -3,10 +3,10 @@ package async import ( "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/stack" ) func Promise[T any](fn func(resolve func(T), reject func(err error))) *Future[T] { diff --git a/async/promise_test.go b/async/promise_test.go index 390e5ac..cdb2d4b 100644 --- a/async/promise_test.go +++ b/async/promise_test.go @@ -16,7 +16,7 @@ func TestPromise(t *testing.T) { resolve("ok") }) - assert.Equal(t, future.Await().Unwrap(), "ok") + assert.Equal(t, future.Await().Must(), "ok") }) t.Run("err", func(t *testing.T) { @@ -26,7 +26,7 @@ func TestPromise(t *testing.T) { reject(err) }) - assert.Equal(t, future.Await().Err(), err) + assert.Equal(t, future.Await().GetErr(), err) }) } @@ -38,7 +38,7 @@ func TestYield(t *testing.T) { yield(3) return nil }) - assert.Equal(t, iter.Await().Unwrap(), []int{1, 2, 3}) + assert.Equal(t, iter.Await().Must(), []int{1, 2, 3}) }) err := fmt.Errorf("test error") @@ -49,7 +49,7 @@ func TestYield(t *testing.T) { yield(3) return err }) - assert.Equal(t, iter.Await().Err(), err) + assert.Equal(t, iter.Await().GetErr(), err) }) } @@ -60,10 +60,10 @@ func TestGroup(t *testing.T) { }() rsp := httpGetList().Await() - assert.NoError(t, rsp.Err()) - assert.Equal(t, len(rsp.Unwrap()), 10) + assert.NoError(t, rsp.GetErr()) + assert.Equal(t, len(rsp.Must()), 10) - data := rsp.Unwrap() + data := rsp.Must() sort.Ints(data) assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, data) } diff --git a/cmds/configcmd/cmd.go b/cmds/configcmd/cmd.go index 8ff03fa..653bad5 100644 --- a/cmds/configcmd/cmd.go +++ b/cmds/configcmd/cmd.go @@ -7,9 +7,9 @@ import ( "github.com/urfave/cli/v3" "gopkg.in/yaml.v3" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/recovery" ) func New[Cfg any]() *cli.Command { diff --git a/cmds/ent/main1.go b/cmds/ent/main1.go index 8c15c01..1ff5059 100644 --- a/cmds/ent/main1.go +++ b/cmds/ent/main1.go @@ -13,7 +13,7 @@ import ( "entgo.io/ent/dialect/sql/schema" "entgo.io/ent/entc" "entgo.io/ent/entc/gen" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" // https://github.com/ent/ent/blob/master/cmd/internal/base/base.go ) diff --git a/cmds/envcmd/cmd.go b/cmds/envcmd/cmd.go index 4e19283..0c8cc40 100644 --- a/cmds/envcmd/cmd.go +++ b/cmds/envcmd/cmd.go @@ -6,10 +6,10 @@ import ( "github.com/urfave/cli/v3" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" ) func New() *cli.Command { diff --git a/cmds/protoc-gen-go-cloudevent/internal/gen.go b/cmds/protoc-gen-go-cloudevent/internal/gen.go index 12ae491..6371fa6 100644 --- a/cmds/protoc-gen-go-cloudevent/internal/gen.go +++ b/cmds/protoc-gen-go-cloudevent/internal/gen.go @@ -13,10 +13,10 @@ import ( "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/cloudevent" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/cloudevent" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" + "github.com/pubgo/funk/v2/stack" ) var cloudeventPkg = reflect.TypeOf(cloudevent.Client{}).PkgPath() diff --git a/cmds/protoc-gen-go-cloudevent/main.go b/cmds/protoc-gen-go-cloudevent/main.go index 8dfcb72..4b8660f 100644 --- a/cmds/protoc-gen-go-cloudevent/main.go +++ b/cmds/protoc-gen-go-cloudevent/main.go @@ -3,7 +3,7 @@ package main import ( "flag" - "github.com/pubgo/funk/cmds/protoc-gen-go-cloudevent/internal" + "github.com/pubgo/funk/v2/cmds/protoc-gen-go-cloudevent/internal" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/types/pluginpb" ) diff --git a/cmds/protoc-gen-go-enum/main.go b/cmds/protoc-gen-go-enum/main.go index 6c8b0a4..ec234fe 100644 --- a/cmds/protoc-gen-go-enum/main.go +++ b/cmds/protoc-gen-go-enum/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/pubgo/funk/cmds/protoc-gen-go-enum/internal" + "github.com/pubgo/funk/v2/cmds/protoc-gen-go-enum/internal" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/types/pluginpb" ) diff --git a/cmds/protoc-gen-go-errors/internal/gen.go b/cmds/protoc-gen-go-errors/internal/gen.go index 506e8a5..7c19e35 100644 --- a/cmds/protoc-gen-go-errors/internal/gen.go +++ b/cmds/protoc-gen-go-errors/internal/gen.go @@ -6,12 +6,12 @@ import ( "github.com/dave/jennifer/jen" "github.com/iancoleman/strcase" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/proto/errorpb" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/proto" ) -const errorPbPkg = "github.com/pubgo/funk/proto/errorpb" +const errorPbPkg = "github.com/pubgo/funk/v2/proto/errorpb" // GenerateFile generates a .errors.pb.go file containing service definitions. func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { @@ -93,7 +93,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated jen.Id("Message"): jen.Lit(rr), }) genFile.Var().Id("_").Op("="). - Qual("github.com/pubgo/funk/errors", "RegisterErrCodes"). + Qual("github.com/pubgo/funk/v2/errors", "RegisterErrCodes"). Call(jen.Id(errCodeName)).Line() } } diff --git a/cmds/protoc-gen-go-errors/main.go b/cmds/protoc-gen-go-errors/main.go index 8088a78..8a10aab 100644 --- a/cmds/protoc-gen-go-errors/main.go +++ b/cmds/protoc-gen-go-errors/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/pubgo/funk/cmds/protoc-gen-go-errors/internal" + "github.com/pubgo/funk/v2/cmds/protoc-gen-go-errors/internal" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/types/pluginpb" ) diff --git a/cmds/protoc-gen-go-sql/main.go b/cmds/protoc-gen-go-sql/main.go index 236c99b..f50f3b6 100644 --- a/cmds/protoc-gen-go-sql/main.go +++ b/cmds/protoc-gen-go-sql/main.go @@ -4,7 +4,7 @@ import ( "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/types/pluginpb" - "github.com/pubgo/funk/cmds/protoc-gen-go-sql/internal" + "github.com/pubgo/funk/v2/cmds/protoc-gen-go-sql/internal" ) func main() { diff --git a/cmds/testmain/main.go b/cmds/testmain/main.go index ff3b9fb..ed7054d 100644 --- a/cmds/testmain/main.go +++ b/cmds/testmain/main.go @@ -7,11 +7,11 @@ import ( "sort" "github.com/moby/term" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/cliutils" - "github.com/pubgo/funk/cmds/versioncmd" - "github.com/pubgo/funk/ctxutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/cliutils" + "github.com/pubgo/funk/v2/cmds/versioncmd" + "github.com/pubgo/funk/v2/ctxutil" + "github.com/pubgo/funk/v2/version" "github.com/urfave/cli/v3" ) diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index dfceabf..f14713b 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -6,10 +6,10 @@ import ( "github.com/urfave/cli/v3" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/version" ) func New() *cli.Command { diff --git a/cmux/mux.go b/cmux/mux.go index 4353574..d01672e 100644 --- a/cmux/mux.go +++ b/cmux/mux.go @@ -7,8 +7,8 @@ package cmux // "os" // "strings" // -// "github.com/pubgo/funk/config" -// "github.com/pubgo/funk/log" +// "github.com/pubgo/funk/v2/config" +// "github.com/pubgo/funk/v2/log" // "github.com/soheilhy/cmux" // "github.com/tmc/grpc-websocket-proxy/wsproxy" // clientv3 "go.etcd.io/etcd/client/v3" diff --git a/component/bbolt/client.go b/component/bbolt/client.go index f8e33e4..36b89b8 100644 --- a/component/bbolt/client.go +++ b/component/bbolt/client.go @@ -2,22 +2,22 @@ package bbolt import ( "context" + result2 "github.com/pubgo/funk/v2/result" "path/filepath" bolt "go.etcd.io/bbolt" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/strutil" ) func New(cfg *Config, log log.Logger) *Client { - cfg = merge.Copy(DefaultConfig(), cfg).Unwrap() + cfg = merge.Copy(DefaultConfig(), cfg).Must() path := filepath.Join(config.GetConfigDir(), cfg.Path) assert.Must(pathutil.IsNotExistMkDir(filepath.Dir(path))) @@ -46,7 +46,7 @@ func (t *Client) Set(ctx context.Context, key string, val []byte, names ...strin }, names...) } -func (t *Client) Get(ctx context.Context, key string, names ...string) result.Result[[]byte] { +func (t *Client) Get(ctx context.Context, key string, names ...string) result2.Result[[]byte] { var ( val []byte err = t.View(ctx, func(bucket *bolt.Bucket) error { @@ -55,7 +55,7 @@ func (t *Client) Get(ctx context.Context, key string, names ...string) result.Re }, names...) ) - return result.Wrap(val, err) + return result2.Wrap(val, err) } func (t *Client) List(ctx context.Context, fn func(k, v []byte) error, names ...string) error { diff --git a/component/bbolt/config.go b/component/bbolt/config.go index d700212..e1bfb4d 100644 --- a/component/bbolt/config.go +++ b/component/bbolt/config.go @@ -4,7 +4,7 @@ import ( "io/fs" "time" - "github.com/pubgo/funk/merge" + "github.com/pubgo/funk/v2/merge" bolt "go.etcd.io/bbolt" ) @@ -27,7 +27,7 @@ type Config struct { func (t *Config) getOpts() *bolt.Options { options := bolt.DefaultOptions options.Timeout = time.Second * 2 - return merge.Struct(options, t).Unwrap() + return merge.Struct(options, t).Must() } func DefaultConfig() *Config { diff --git a/component/cloudevent/aaa.go b/component/cloudevent/aaa.go index 5379613..0044ead 100644 --- a/component/cloudevent/aaa.go +++ b/component/cloudevent/aaa.go @@ -5,8 +5,8 @@ import ( "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" - "github.com/pubgo/funk/log" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" + "github.com/pubgo/funk/v2/log" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/emptypb" ) diff --git a/component/cloudevent/client.go b/component/cloudevent/client.go index ca491f7..1b5e93c 100644 --- a/component/cloudevent/client.go +++ b/component/cloudevent/client.go @@ -3,6 +3,7 @@ package cloudevent import ( "context" "fmt" + "github.com/pubgo/funk/v2/result" "net/http" "strings" "time" @@ -10,20 +11,19 @@ import ( mapset "github.com/deckarep/golang-set/v2" "github.com/nats-io/nats.go/jetstream" ants "github.com/panjf2000/ants/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/lifecycle" - "github.com/pubgo/funk/component/natsclient" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/internal/anyhow" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/try" - "github.com/pubgo/funk/typex" - "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/lifecycle" + "github.com/pubgo/funk/v2/component/natsclient" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/internal/anyhow" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/try" + "github.com/pubgo/funk/v2/typex" + "github.com/pubgo/funk/v2/version" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/proto" diff --git a/component/cloudevent/config.go b/component/cloudevent/config.go index c163c0e..624c4f4 100644 --- a/component/cloudevent/config.go +++ b/component/cloudevent/config.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/running" - "github.com/pubgo/funk/typex" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/running" + "github.com/pubgo/funk/v2/typex" "google.golang.org/protobuf/proto" yaml "gopkg.in/yaml.v3" ) diff --git a/component/cloudevent/context.go b/component/cloudevent/context.go index ea9c277..bbc758a 100644 --- a/component/cloudevent/context.go +++ b/component/cloudevent/context.go @@ -5,7 +5,7 @@ import ( "net/http" "time" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" "github.com/rs/xid" "google.golang.org/protobuf/proto" ) diff --git a/component/cloudevent/errors.go b/component/cloudevent/errors.go index b4fc6ad..3e026b8 100644 --- a/component/cloudevent/errors.go +++ b/component/cloudevent/errors.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" ) var errReject = errors.New("cloudevent: reject retry and discard msg") diff --git a/component/cloudevent/publisher.go b/component/cloudevent/publisher.go index f687c07..352e88a 100644 --- a/component/cloudevent/publisher.go +++ b/component/cloudevent/publisher.go @@ -3,18 +3,18 @@ package cloudevent import ( "context" "fmt" + result2 "github.com/pubgo/funk/v2/result" "time" "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" - "github.com/pubgo/funk/ctxutil" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log/logfields" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/try" - "github.com/pubgo/funk/typex" - "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/ctxutil" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log/logfields" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/try" + "github.com/pubgo/funk/v2/typex" "github.com/rs/xid" "github.com/rs/zerolog" "github.com/samber/lo" @@ -22,8 +22,8 @@ import ( "google.golang.org/protobuf/types/known/anypb" ) -func PushEvent[T any](handler func(*Client, context.Context, T, ...*cloudeventpb.PushEventOptions) (*PubAckInfo, error), jobCli *Client, ctx context.Context, t T, opts ...*cloudeventpb.PushEventOptions) chan result.Result[*PubAckInfo] { - errChan := make(chan result.Result[*PubAckInfo]) +func PushEvent[T any](handler func(*Client, context.Context, T, ...*cloudeventpb.PushEventOptions) (*PubAckInfo, error), jobCli *Client, ctx context.Context, t T, opts ...*cloudeventpb.PushEventOptions) chan result2.Result[*PubAckInfo] { + errChan := make(chan result2.Result[*PubAckInfo]) timeout := ctxutil.GetTimeout(ctx) now := time.Now() fnCaller := stack.Caller(1).String() @@ -53,7 +53,7 @@ func PushEvent[T any](handler func(*Client, context.Context, T, ...*cloudeventpb }) return err }) - errChan <- result.Wrap(pubAck, err) + errChan <- result2.Wrap(pubAck, err) }() return errChan } @@ -98,7 +98,7 @@ func (c *Client) Publish(ctx context.Context, topic string, args proto.Message, } func (c *Client) publish(ctx context.Context, topic string, args proto.Message, opts ...*cloudeventpb.PushEventOptions) (_ *PubAckInfo, gErr error) { - defer result.RecoveryErr(&gErr) + defer result2.RecoveryErr(&gErr) var timeout = ctxutil.GetTimeout(ctx) var now = time.Now() var msgId = xid.New().String() @@ -129,7 +129,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, msgId = pushEventOpt.GetMsgId() } - pb := result.Wrap(anypb.New(args)). + pb := result2.Wrap(anypb.New(args)). Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal args to any proto") }). @@ -139,7 +139,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, } // TODO get parent event info from ctx - data := result.Wrap(proto.Marshal(pb)). + data := result2.Wrap(proto.Marshal(pb)). Log(func(e *zerolog.Event) { e.Str(logfields.Msg, "failed to marshal any proto to bytes") }). @@ -163,7 +163,7 @@ func (c *Client) publish(ctx context.Context, topic string, args proto.Message, msg := &nats.Msg{Subject: topic, Data: data, Header: header} jetOpts := append([]jetstream.PublishOpt{}, jetstream.WithMsgID(msgId)) - pubActInfo = result.Wrap(c.js.PublishMsg(ctx, msg, jetOpts...)). + pubActInfo = result2.Wrap(c.js.PublishMsg(ctx, msg, jetOpts...)). Log(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to publish msg to stream, topic=%s msg_id=%s", topic, msgId)) }). diff --git a/component/cloudevent/register.go b/component/cloudevent/register.go index f79bb98..89f92c5 100644 --- a/component/cloudevent/register.go +++ b/component/cloudevent/register.go @@ -5,10 +5,10 @@ import ( "fmt" "reflect" - "github.com/pubgo/funk/assert" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/assert" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/vars" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/proto" diff --git a/component/cloudevent/util.go b/component/cloudevent/util.go index c1751e5..bc7a45a 100644 --- a/component/cloudevent/util.go +++ b/component/cloudevent/util.go @@ -7,11 +7,11 @@ import ( "time" "github.com/nats-io/nats.go/jetstream" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - cloudeventpb "github.com/pubgo/funk/proto/cloudevent" - "github.com/pubgo/funk/protoutils" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" + "github.com/pubgo/funk/v2/protoutils" + "github.com/pubgo/funk/v2/result" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/reflect/protoreflect" diff --git a/component/etcdv3/client.go b/component/etcdv3/client.go index b025bc9..a777295 100644 --- a/component/etcdv3/client.go +++ b/component/etcdv3/client.go @@ -5,15 +5,15 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/retry" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/retry" ) func New(conf *Config) *Client { conf = config.MergeR(DefaultCfg(), *conf).Must() - cfg := merge.Struct(new(client3.Config), conf).Unwrap() + cfg := merge.Struct(new(client3.Config), conf).Must() cfg.DialOptions = append( cfg.DialOptions, grpc.WithBlock(), diff --git a/component/gormclient/builder.go b/component/gormclient/builder.go index 73c6be8..b29daf2 100644 --- a/component/gormclient/builder.go +++ b/component/gormclient/builder.go @@ -3,11 +3,11 @@ package gormclient import ( "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/merge" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/merge" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" @@ -25,7 +25,7 @@ func New(conf *Config, logs log.Logger) *Client { logs = logs.WithName(Name) conf = config.MergeR(generic.Ptr(DefaultCfg()), conf).Must() - ormCfg := merge.Copy(new(gorm.Config), conf).Unwrap() + ormCfg := merge.Copy(new(gorm.Config), conf).Must() ormCfg.NowFunc = func() time.Time { return time.Now().UTC() } ormCfg.NamingStrategy = schema.NamingStrategy{TablePrefix: conf.TablePrefix} diff --git a/component/gormclient/client.go b/component/gormclient/client.go index 7986ffe..9508b71 100644 --- a/component/gormclient/client.go +++ b/component/gormclient/client.go @@ -3,8 +3,8 @@ package gormclient import ( "database/sql" - "github.com/pubgo/funk/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/vars" "gorm.io/gorm" ) @@ -47,5 +47,5 @@ func (c *Client) Stats() (r result.Result[sql.DBStats]) { if err != nil { return r.WithErr(err) } - return r.WithVal(db.Stats()) + return r.WithValue(db.Stats()) } diff --git a/component/gormclient/config.go b/component/gormclient/config.go index 9e42809..a2b674e 100644 --- a/component/gormclient/config.go +++ b/component/gormclient/config.go @@ -3,7 +3,7 @@ package gormclient import ( "time" - "github.com/pubgo/funk/config" + "github.com/pubgo/funk/v2/config" "gorm.io/gorm/logger" ) diff --git a/component/gormclient/drivers/mysql/driver.go b/component/gormclient/drivers/mysql/driver.go index 6f837b0..2f6be5e 100644 --- a/component/gormclient/drivers/mysql/driver.go +++ b/component/gormclient/drivers/mysql/driver.go @@ -1,12 +1,12 @@ package mysql import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/gormclient" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/merge" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/gormclient" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/merge" + "github.com/pubgo/funk/v2/recovery" "gorm.io/driver/mysql" "gorm.io/gorm" ) @@ -32,7 +32,7 @@ func init() { conf := DefaultCfg() assert.Must(cfg.Decode(&conf)) - ret := merge.Struct(new(mysql.Config), conf).Unwrap() + ret := merge.Struct(new(mysql.Config), conf).Must() return mysql.New(*ret) }) } diff --git a/component/gormclient/drivers/postgres/driver.go b/component/gormclient/drivers/postgres/driver.go index 34dfd16..b33bec3 100644 --- a/component/gormclient/drivers/postgres/driver.go +++ b/component/gormclient/drivers/postgres/driver.go @@ -3,11 +3,11 @@ package sqlite import ( "fmt" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/gormclient" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/gormclient" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/recovery" "gorm.io/driver/postgres" "gorm.io/gorm" ) diff --git a/component/gormclient/drivers/sqlite/driver.go b/component/gormclient/drivers/sqlite/driver.go index 3f618a1..6c4e0c0 100644 --- a/component/gormclient/drivers/sqlite/driver.go +++ b/component/gormclient/drivers/sqlite/driver.go @@ -4,12 +4,12 @@ import ( "fmt" "path/filepath" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/gormclient" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/gormclient" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/recovery" "gorm.io/driver/sqlite" "gorm.io/gorm" ) diff --git a/component/gormclient/factory.go b/component/gormclient/factory.go index 39ddd46..c889191 100644 --- a/component/gormclient/factory.go +++ b/component/gormclient/factory.go @@ -1,9 +1,9 @@ package gormclient import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/recovery" "gorm.io/gorm" ) diff --git a/component/gormclient/migrates/migrate.go b/component/gormclient/migrates/migrate.go index 5faaa9e..a7ff865 100644 --- a/component/gormclient/migrates/migrate.go +++ b/component/gormclient/migrates/migrate.go @@ -3,8 +3,8 @@ package migrates import ( "fmt" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/merge" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/merge" "gorm.io/gorm" ) @@ -47,7 +47,7 @@ func (e *DuplicatedIDError) Error() string { // New returns a new GoMigrate. func New(db *gorm.DB, config *Config, migrations []*Migration) *GoMigrate { - config = merge.Struct(generic.Ptr(DefaultConfig), config).Unwrap() + config = merge.Struct(generic.Ptr(DefaultConfig), config).Must() return &GoMigrate{ db: db, options: config, diff --git a/component/natsclient/client.go b/component/natsclient/client.go index 1ca3cc2..2e50c2d 100644 --- a/component/natsclient/client.go +++ b/component/natsclient/client.go @@ -4,10 +4,10 @@ import ( "fmt" "github.com/nats-io/nats.go" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/lifecycle" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/running" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/component/lifecycle" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/running" ) type Param struct { diff --git a/config/config.go b/config/config.go index 5c5cab9..26f19d2 100644 --- a/config/config.go +++ b/config/config.go @@ -3,6 +3,7 @@ package config import ( "bytes" "fmt" + "github.com/pubgo/funk/v2/result" "os" "path/filepath" "reflect" @@ -14,15 +15,14 @@ import ( "github.com/samber/lo" "gopkg.in/yaml.v3" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/typex" - "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/typex" + "github.com/pubgo/funk/v2/vars" ) const ( diff --git a/config/envs.go b/config/envs.go index f3b9f29..04fb351 100644 --- a/config/envs.go +++ b/config/envs.go @@ -3,8 +3,8 @@ package config import ( "strings" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/strutil" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/strutil" ) type EnvSpecMap map[string]*EnvSpec diff --git a/config/types.go b/config/types.go index a1dbd53..c5d52ec 100644 --- a/config/types.go +++ b/config/types.go @@ -4,7 +4,7 @@ import ( "encoding/base64" "encoding/json" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "gopkg.in/yaml.v3" ) diff --git a/config/util.go b/config/util.go index 640996d..f993853 100644 --- a/config/util.go +++ b/config/util.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/base64" "fmt" + "github.com/pubgo/funk/v2/result" "io" "io/fs" "os" @@ -17,12 +18,11 @@ import ( "github.com/valyala/fasttemplate" "gopkg.in/yaml.v3" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/pathutil" ) func GetConfigDir() string { diff --git a/config/util_test.go b/config/util_test.go index bf2d1ab..c2466b5 100644 --- a/config/util_test.go +++ b/config/util_test.go @@ -9,7 +9,7 @@ import ( "testing" "github.com/a8m/envsubst" - "github.com/pubgo/funk/env" + "github.com/pubgo/funk/v2/env" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v3" ) diff --git a/cryptoutil/util.go b/cryptoutil/util.go index f28fd88..bf3b3bf 100644 --- a/cryptoutil/util.go +++ b/cryptoutil/util.go @@ -13,10 +13,11 @@ import ( "io" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/result" "golang.org/x/crypto/bcrypt" + + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/result" ) // SecureKey generates a random 256-bit key for Encrypt() and @@ -67,7 +68,7 @@ func AesCBCEncrypt(orig, key string) result.Result[string] { cryted := make([]byte, len(origData)) // 加密 blockMode.CryptBlocks(cryted, origData) - return val.WithVal(base64.StdEncoding.EncodeToString(cryted)) + return val.WithValue(base64.StdEncoding.EncodeToString(cryted)) } func AesCBCDecrypt(cryted, key string) result.Result[string] { @@ -76,7 +77,7 @@ func AesCBCDecrypt(cryted, key string) result.Result[string] { // 转成字节数组 crytedByte, err := base64.StdEncoding.DecodeString(cryted) if err != nil { - return result.Err[string](err) + return result.Fail[string](err) } k := []byte(key) @@ -96,7 +97,7 @@ func AesCBCDecrypt(cryted, key string) result.Result[string] { blockMode.CryptBlocks(orig, crytedByte) // 去补全码 orig = PKCS7UnPadding(orig) - return val.WithVal(string(orig)) + return val.WithValue(string(orig)) } // PKCS7Padding 补码 diff --git a/ctxutil/util_test.go b/ctxutil/util_test.go index 892445f..7b9ad5a 100644 --- a/ctxutil/util_test.go +++ b/ctxutil/util_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/pubgo/funk/ctxutil" + "github.com/pubgo/funk/v2/ctxutil" "github.com/stretchr/testify/assert" ) diff --git a/env/env.go b/env/env.go index 02ce4b2..a1481a5 100644 --- a/env/env.go +++ b/env/env.go @@ -2,6 +2,7 @@ package env import ( "fmt" + result2 "github.com/pubgo/funk/v2/result" "log/slog" "os" "strconv" @@ -12,14 +13,13 @@ import ( "github.com/rs/zerolog" "github.com/samber/lo" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/pathutil" ) -func Set(key, value string) result.Error { - return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { +func Set(key, value string) result2.Error { + return result2.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str("value", value) e.Str(logfields.Msg, "env_set_error") @@ -108,8 +108,8 @@ func GetFloat(names ...string) float64 { func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } -func Delete(key string) result.Error { - return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { +func Delete(key string) result2.Error { + return result2.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str(logfields.Msg, "env_delete_error") }) @@ -117,8 +117,8 @@ func Delete(key string) result.Error { func MustDelete(key string) { Delete(key).Must() } -func Expand(value string) result.Result[string] { - return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { +func Expand(value string) result2.Result[string] { + return result2.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { e.Str("value", value) e.Str(logfields.Msg, "env_expand_error") }) @@ -141,19 +141,19 @@ func Key(key string) string { return keyHandler(key) } -func LoadFiles(files ...string) (r result.Error) { +func LoadFiles(files ...string) (r result2.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) if len(files) == 0 { return } for _, file := range files { - data := result.Wrap(os.ReadFile(file)).Unwrap(&r) + data := result2.Wrap(os.ReadFile(file)).Unwrap(&r) if r.IsErr() { return } - dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + dataMap := result2.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) if r.IsErr() { return } diff --git a/env/reload.go b/env/reload.go index a3067ff..9844c69 100644 --- a/env/reload.go +++ b/env/reload.go @@ -6,8 +6,8 @@ import ( "os" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log/logfields" ) func Reload() { diff --git a/env/util_test.go b/env/util_test.go index bdd1451..2552180 100644 --- a/env/util_test.go +++ b/env/util_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/assert" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/log" ) func init() { diff --git a/errors/aaa.go b/errors/aaa.go index 5fe40d0..aaddd2c 100644 --- a/errors/aaa.go +++ b/errors/aaa.go @@ -1,7 +1,7 @@ package errors import ( - "github.com/pubgo/funk/errors/errinter" + "github.com/pubgo/funk/v2/errors/errinter" ) type Maps = errinter.Maps diff --git a/errors/err_code.go b/errors/err_code.go index 819fdec..332e30d 100644 --- a/errors/err_code.go +++ b/errors/err_code.go @@ -7,10 +7,10 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" diff --git a/errors/err_msg.go b/errors/err_msg.go index 4785690..2ffa04c 100644 --- a/errors/err_msg.go +++ b/errors/err_msg.go @@ -6,10 +6,10 @@ import ( "errors" "fmt" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" ) diff --git a/errors/err_simple.go b/errors/err_simple.go index 466ef88..faab465 100644 --- a/errors/err_simple.go +++ b/errors/err_simple.go @@ -5,9 +5,9 @@ import ( "encoding/json" "fmt" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/proto/errorpb" "github.com/rs/xid" "github.com/samber/lo" "google.golang.org/protobuf/proto" diff --git a/errors/err_wrap.go b/errors/err_wrap.go index 8ff546c..3e8165d 100644 --- a/errors/err_wrap.go +++ b/errors/err_wrap.go @@ -5,8 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/proto/errorpb" "google.golang.org/protobuf/proto" ) diff --git a/errors/errinter/colorfield.go b/errors/errinter/colorfield.go index 823625e..4bcc717 100644 --- a/errors/errinter/colorfield.go +++ b/errors/errinter/colorfield.go @@ -3,7 +3,7 @@ package errinter import ( "strings" - "github.com/pubgo/funk/internal/color" + "github.com/pubgo/funk/v2/internal/color" ) var width = 11 diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index 3a71a70..ebfbadc 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -16,9 +16,9 @@ import ( "google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/structpb" - "github.com/pubgo/funk" - "github.com/pubgo/funk/log/logutil" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/log/logutil" + "github.com/pubgo/funk/v2/proto/errorpb" ) func ParseError(val interface{}) error { diff --git a/errors/errinter/z_util_test.go b/errors/errinter/z_util_test.go index 239e518..30507cc 100644 --- a/errors/errinter/z_util_test.go +++ b/errors/errinter/z_util_test.go @@ -9,9 +9,9 @@ import ( "github.com/stretchr/testify/assert" "google.golang.org/protobuf/encoding/prototext" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/proto/errorpb" ) func TestGetErrorId(t *testing.T) { diff --git a/errors/errors.go b/errors/errors.go index 0e94c2b..15d815d 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -10,9 +10,9 @@ import ( "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/stack" ) func IfErr(err error, fn func(err error) error) error { diff --git a/errors/errutil/util.go b/errors/errutil/util.go index ccc937d..0aa61be 100644 --- a/errors/errutil/util.go +++ b/errors/errutil/util.go @@ -13,12 +13,12 @@ import ( "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/anypb" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/version" ) func Json(err error) []byte { diff --git a/errors/errutil/util_test.go b/errors/errutil/util_test.go index b363a44..4ae8459 100644 --- a/errors/errutil/util_test.go +++ b/errors/errutil/util_test.go @@ -4,8 +4,8 @@ import ( "fmt" "testing" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" ) func TestJson(t *testing.T) { diff --git a/errors/registry.go b/errors/registry.go index 0a48c6a..62abbec 100644 --- a/errors/registry.go +++ b/errors/registry.go @@ -3,7 +3,7 @@ package errors import ( "fmt" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/proto/errorpb" ) var codes = make(map[string]*errorpb.ErrCode) diff --git a/errors/stack_filters.go b/errors/stack_filters.go index 022cdea..9c1edfc 100644 --- a/errors/stack_filters.go +++ b/errors/stack_filters.go @@ -1,7 +1,7 @@ package errors import ( - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/stack" ) var stackFilters []func(frame *stack.Frame) bool diff --git a/errors/util.go b/errors/util.go index 275938c..d7d63ef 100644 --- a/errors/util.go +++ b/errors/util.go @@ -10,10 +10,10 @@ import ( "github.com/samber/lo" "google.golang.org/protobuf/proto" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/stack" ) func cloneAndCheck(code *errorpb.ErrCode) *errorpb.ErrCode { diff --git a/errors/z_code_test.go b/errors/z_code_test.go index 16be6e5..113354f 100644 --- a/errors/z_code_test.go +++ b/errors/z_code_test.go @@ -4,8 +4,8 @@ import ( "fmt" "testing" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/proto/errorpb" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/proto/errorpb" "github.com/stretchr/testify/assert" ) diff --git a/errors/z_err_code_test.go b/errors/z_err_code_test.go index 8ab09ff..d5d76b2 100644 --- a/errors/z_err_code_test.go +++ b/errors/z_err_code_test.go @@ -3,9 +3,9 @@ package errors_test import ( "testing" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/proto/testcodepb" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/proto/testcodepb" ) func TestErrCode(t *testing.T) { diff --git a/errors/z_error_stack_test.go b/errors/z_error_stack_test.go index ade03b2..d85d3e9 100644 --- a/errors/z_error_stack_test.go +++ b/errors/z_error_stack_test.go @@ -3,9 +3,9 @@ package errors_test import ( "testing" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/stack" ) func TestStack(t *testing.T) { diff --git a/errors/z_error_test.go b/errors/z_error_test.go index 0646697..34d6c36 100644 --- a/errors/z_error_test.go +++ b/errors/z_error_test.go @@ -6,9 +6,9 @@ import ( "google.golang.org/protobuf/encoding/protojson" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/proto/errorpb" - "github.com/pubgo/funk/proto/testcodepb" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/proto/errorpb" + "github.com/pubgo/funk/v2/proto/testcodepb" ) func TestFormat(t *testing.T) { diff --git a/generic/util.go b/generic/util.go index 4a09d8e..c044898 100644 --- a/generic/util.go +++ b/generic/util.go @@ -1,7 +1,7 @@ package generic import ( - "github.com/pubgo/funk" + "github.com/pubgo/funk/v2" "golang.org/x/exp/constraints" ) diff --git a/go.mod b/go.mod index 514a48a..b264a00 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/pubgo/funk +module github.com/pubgo/funk/v2 go 1.23.0 diff --git a/internal/anyhow/aherrcheck/errcheck.go b/internal/anyhow/aherrcheck/errcheck.go index 607d099..058e99b 100644 --- a/internal/anyhow/aherrcheck/errcheck.go +++ b/internal/anyhow/aherrcheck/errcheck.go @@ -4,7 +4,7 @@ import ( "context" "reflect" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/stack" ) var errChecks []ErrChecker diff --git a/internal/anyhow/anyhow.go b/internal/anyhow/anyhow.go index 730a313..ab5f131 100644 --- a/internal/anyhow/anyhow.go +++ b/internal/anyhow/anyhow.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" ) func All[T any](results ...Result[T]) Result[[]T] { diff --git a/internal/anyhow/error.go b/internal/anyhow/error.go index 5455f28..b0bda79 100644 --- a/internal/anyhow/error.go +++ b/internal/anyhow/error.go @@ -4,9 +4,9 @@ import ( "context" "fmt" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/log" ) var _ Catchable = new(Error) diff --git a/internal/anyhow/error_test.go b/internal/anyhow/error_test.go index e547b29..8ff59b4 100644 --- a/internal/anyhow/error_test.go +++ b/internal/anyhow/error_test.go @@ -3,7 +3,7 @@ package anyhow import ( "testing" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" ) func TestErrorLog(t *testing.T) { diff --git a/internal/anyhow/result.go b/internal/anyhow/result.go index cfad946..ca2e7f1 100644 --- a/internal/anyhow/result.go +++ b/internal/anyhow/result.go @@ -5,9 +5,9 @@ import ( "encoding/json" "fmt" - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" "github.com/samber/lo" ) diff --git a/internal/anyhow/result_test.go b/internal/anyhow/result_test.go index 86da95d..57d42c0 100644 --- a/internal/anyhow/result_test.go +++ b/internal/anyhow/result_test.go @@ -6,12 +6,12 @@ import ( "fmt" "testing" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/internal/anyhow" - "github.com/pubgo/funk/internal/anyhow/aherrcheck" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/internal/anyhow" + "github.com/pubgo/funk/v2/internal/anyhow/aherrcheck" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" ) type hello struct { diff --git a/internal/anyhow/util.go b/internal/anyhow/util.go index f3b3c15..2f8463c 100644 --- a/internal/anyhow/util.go +++ b/internal/anyhow/util.go @@ -5,11 +5,11 @@ import ( "fmt" "runtime/debug" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/internal/anyhow/aherrcheck" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/internal/anyhow/aherrcheck" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" ) diff --git a/internal/example/app/main.go b/internal/example/app/main.go index f3547aa..643ac20 100644 --- a/internal/example/app/main.go +++ b/internal/example/app/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" ) // 应用的集成开发, 在最后扑捉panic diff --git a/internal/example/env/main.go b/internal/example/env/main.go index ab54ce9..eeeff9b 100644 --- a/internal/example/env/main.go +++ b/internal/example/env/main.go @@ -3,8 +3,8 @@ package main import ( "os" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/pretty" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/pretty" ) func main() { diff --git a/internal/example/errors/main.go b/internal/example/errors/main.go index 56a55ad..6e19214 100644 --- a/internal/example/errors/main.go +++ b/internal/example/errors/main.go @@ -1,9 +1,9 @@ package main import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/recovery" ) // 单个pkg的error处理 diff --git a/internal/example/log/main.go b/internal/example/log/main.go index eba0442..e9641c9 100644 --- a/internal/example/log/main.go +++ b/internal/example/log/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) var dd = log.GetLogger("dd") diff --git a/log/global.go b/log/global.go index 13b8f50..24817e7 100644 --- a/log/global.go +++ b/log/global.go @@ -7,9 +7,9 @@ import ( "os" "time" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" "github.com/rs/zerolog" zlog "github.com/rs/zerolog/log" diff --git a/log/impl.log.go b/log/impl.log.go index 11fce24..7d2d139 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -8,8 +8,8 @@ import ( "github.com/rs/zerolog" - "github.com/pubgo/funk/errors/errinter" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/log/logfields" ) var _ Logger = (*loggerImpl)(nil) diff --git a/log/impl.slog.go b/log/impl.slog.go index 720a46f..df85d6e 100644 --- a/log/impl.slog.go +++ b/log/impl.slog.go @@ -4,7 +4,7 @@ import ( "context" "log/slog" - "github.com/pubgo/funk/log/slogutil" + "github.com/pubgo/funk/v2/log/slogutil" "github.com/rs/zerolog" slogcommon "github.com/samber/slog-common" ) diff --git a/log/util.go b/log/util.go index 17f83e0..764d76c 100644 --- a/log/util.go +++ b/log/util.go @@ -3,7 +3,7 @@ package log import ( "context" - "github.com/pubgo/funk/errors/errinter" + "github.com/pubgo/funk/v2/errors/errinter" "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" ) diff --git a/log/z_log_std_test.go b/log/z_log_std_test.go index a4e67ba..426a2f8 100644 --- a/log/z_log_std_test.go +++ b/log/z_log_std_test.go @@ -3,7 +3,7 @@ package log_test import ( "testing" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func TestStdLog(t *testing.T) { diff --git a/log/z_log_test.go b/log/z_log_test.go index 82ed98a..bb71d20 100644 --- a/log/z_log_test.go +++ b/log/z_log_test.go @@ -10,9 +10,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/tidwall/gjson" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logutil" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logutil" ) func TestLogLevel(t *testing.T) { diff --git a/log/z_slog_test.go b/log/z_slog_test.go index 6a511ab..58bd7d8 100644 --- a/log/z_slog_test.go +++ b/log/z_slog_test.go @@ -4,8 +4,8 @@ import ( "log/slog" "testing" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/slogutil" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/slogutil" "github.com/rs/zerolog" ) diff --git a/merge/merge.go b/merge/merge.go index 63bbfb3..8438223 100644 --- a/merge/merge.go +++ b/merge/merge.go @@ -4,8 +4,8 @@ import ( "github.com/jinzhu/copier" "github.com/mitchellh/mapstructure" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/result" ) type Option func(opts *copier.Option) @@ -29,7 +29,7 @@ func Copy[A, B any](dst *A, src *B, opts ...Option) result.Result[*A] { err := copier.CopyWithOption(dst, src, opt) if err != nil { - return result.Err[*A](errH(err)) + return result.Fail[*A](errH(err)) } return result.OK(dst) diff --git a/merge/merge_test.go b/merge/merge_test.go index d9e5ef6..63d6291 100644 --- a/merge/merge_test.go +++ b/merge/merge_test.go @@ -3,7 +3,7 @@ package merge import ( "testing" - "github.com/pubgo/funk/pretty" + "github.com/pubgo/funk/v2/pretty" ) type dst struct { @@ -29,7 +29,7 @@ func TestStruct(t *testing.T) { d1 := map[string]interface{}{"a": src{Name: "2", Hello: "2"}} d2 := map[string]dst{"a": {Name: "1", Hello: "1"}, "b": {Name: "1", Hello: "1"}} - Copy(&d1, &d2).Unwrap() + Copy(&d1, &d2).Must() } func TestMapStruct(t *testing.T) { diff --git a/migrates/entmigrates/config.go b/migrates/entmigrates/config.go index 711b4f4..0aa6654 100644 --- a/migrates/entmigrates/config.go +++ b/migrates/entmigrates/config.go @@ -3,7 +3,7 @@ package entmigrates import ( _ "embed" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" "gopkg.in/yaml.v3" ) diff --git a/migrates/entmigrates/migrate.go b/migrates/entmigrates/migrate.go index 276a0b9..c04483c 100644 --- a/migrates/entmigrates/migrate.go +++ b/migrates/entmigrates/migrate.go @@ -13,12 +13,12 @@ import ( "entgo.io/ent/dialect/sql/schema" "github.com/dave/jennifer/jen" mapset "github.com/deckarep/golang-set/v2" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/config" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/version" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/wait" diff --git a/monster/example/main.go b/monster/example/main.go index f8d1903..78da6e8 100644 --- a/monster/example/main.go +++ b/monster/example/main.go @@ -7,7 +7,7 @@ import ( "net/http" "time" - "github.com/pubgo/funk/monster" + "github.com/pubgo/funk/v2/monster" ) func main() { diff --git a/monster/monster.go b/monster/monster.go index 0febca4..2ea2d58 100644 --- a/monster/monster.go +++ b/monster/monster.go @@ -1,6 +1,8 @@ package monster -import "sync" +import ( + "sync" +) // Getter returns the current value as any type Getter func() any @@ -19,8 +21,8 @@ type Entry struct { // Monster manages all registered values type Monster struct { - m map[string]*Entry - mu sync.RWMutex + mutex sync.RWMutex + m map[string]*Entry } var defaultMonster = NewMonster() @@ -34,8 +36,8 @@ func NewMonster() *Monster { // AddFunc registers a new value with getter, setter, usage, and optional tags func (m *Monster) AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { - m.mu.Lock() - defer m.mu.Unlock() + m.mutex.Lock() + defer m.mutex.Unlock() tagMap := make(map[string]any) if len(tags) > 0 && tags[0] != nil { @@ -55,15 +57,15 @@ func (m *Monster) AddFunc(name string, get Getter, set Setter, usage string, tag // Lookup returns the entry by name func (m *Monster) Lookup(name string) *Entry { - m.mu.RLock() - defer m.mu.RUnlock() + m.mutex.RLock() + defer m.mutex.RUnlock() return m.m[name] } // VisitAll calls fn for each entry func (m *Monster) VisitAll(fn func(*Entry)) { - m.mu.RLock() - defer m.mu.RUnlock() + m.mutex.RLock() + defer m.mutex.RUnlock() for _, e := range m.m { fn(e) } @@ -77,6 +79,4 @@ func Lookup(name string) *Entry { return defaultMonster.Lookup(name) } -func VisitAll(fn func(*Entry)) { - defaultMonster.VisitAll(fn) -} +func VisitAll(fn func(*Entry)) { defaultMonster.VisitAll(fn) } diff --git a/monster/types.go b/monster/types.go index 1fc58dc..060c691 100644 --- a/monster/types.go +++ b/monster/types.go @@ -20,8 +20,9 @@ func mergeTags(maps ...map[string]any) map[string]any { } type StringValue struct { - p string - name string + p string + name string + onset func(val string) } func (s *StringValue) Key() string { return s.name } @@ -37,9 +38,10 @@ func (s *StringValue) set(val any) error { } return nil } -func (s *StringValue) Get() string { return s.p } -func (s *StringValue) Set(val string) error { return s.set(val) } -func (s *StringValue) String() string { return s.p } +func (s *StringValue) Get() string { return s.p } +func (s *StringValue) Set(val string) error { return s.set(val) } +func (s *StringValue) OnSet(onset func(val string)) *StringValue { s.onset = onset; return s } +func (s *StringValue) String() string { return s.p } func String(name, value, usage string, tags ...map[string]any) *StringValue { s := &StringValue{p: value, name: name} @@ -233,8 +235,9 @@ func Time(name string, value time.Time, usage string, tags ...map[string]any) *T // type JsonValue[T any] struct { - p T - name string + p T + name string + onset func(val T) } func (t *JsonValue[T]) Key() string { return t.name } @@ -249,8 +252,9 @@ func (t *JsonValue[T]) get() any { func (t *JsonValue[T]) set(val any) error { return json.Unmarshal(val.([]byte), &t.p) } -func (t *JsonValue[T]) Get() T { return t.p } -func (t *JsonValue[T]) Set(val T) error { return t.set(val) } +func (t *JsonValue[T]) Get() T { return t.p } +func (t *JsonValue[T]) Set(val T) error { return t.set(val) } +func (t *JsonValue[T]) OnSet(onset func(val T)) *JsonValue[T] { t.onset = onset; return t } func (t *JsonValue[T]) String() string { data, err := json.Marshal(t.p) if err != nil { diff --git a/netutil/conn.go b/netutil/conn.go index 9e484b9..97501dc 100644 --- a/netutil/conn.go +++ b/netutil/conn.go @@ -9,8 +9,8 @@ import ( "strconv" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) type sockOpts struct { diff --git a/netutil/conncheck.go b/netutil/conncheck.go index 45a3246..3a8c159 100644 --- a/netutil/conncheck.go +++ b/netutil/conncheck.go @@ -8,7 +8,7 @@ import ( "net" "syscall" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" ) var errUnexpectedRead = errors.New("unexpected read from socket") diff --git a/netutil/util.go b/netutil/util.go index 0d68d89..d621f3e 100644 --- a/netutil/util.go +++ b/netutil/util.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) var localIpReg = assert.Exit1(regexp.Compile(`\d+\.\d+\.\d+\.\d+`)) diff --git a/pathutil/file.go b/pathutil/file.go index 2c83a2a..455f97d 100755 --- a/pathutil/file.go +++ b/pathutil/file.go @@ -10,9 +10,9 @@ import ( "regexp" "strings" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/recovery" ) // IsNotExist check if the file exists diff --git a/proto/testcodepb/test.errors.pb.go b/proto/testcodepb/test.errors.pb.go index c046400..d6185c2 100644 --- a/proto/testcodepb/test.errors.pb.go +++ b/proto/testcodepb/test.errors.pb.go @@ -7,8 +7,8 @@ package testcodepb import ( - errors "github.com/pubgo/funk/errors" - errorpb "github.com/pubgo/funk/proto/errorpb" + errors "github.com/pubgo/funk/v2/errors" + errorpb "github.com/pubgo/funk/v2/proto/errorpb" grpc "google.golang.org/grpc" ) diff --git a/proto/testcodepb/test.pb.go b/proto/testcodepb/test.pb.go index 6d09da6..55d684f 100644 --- a/proto/testcodepb/test.pb.go +++ b/proto/testcodepb/test.pb.go @@ -7,7 +7,7 @@ package testcodepb import ( - _ "github.com/pubgo/funk/proto/errorpb" + _ "github.com/pubgo/funk/v2/proto/errorpb" _ "google.golang.org/genproto/googleapis/api/annotations" httpbody "google.golang.org/genproto/googleapis/api/httpbody" protoreflect "google.golang.org/protobuf/reflect/protoreflect" diff --git a/protoutils/ext.go b/protoutils/ext.go index a74f993..a06cca7 100644 --- a/protoutils/ext.go +++ b/protoutils/ext.go @@ -1,7 +1,7 @@ package protoutils import ( - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" diff --git a/protoutils/util.go b/protoutils/util.go index cc888da..dc1d9e4 100644 --- a/protoutils/util.go +++ b/protoutils/util.go @@ -9,8 +9,8 @@ import ( "strings" "unicode" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" options "google.golang.org/genproto/googleapis/api/annotations" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/descriptorpb" diff --git a/recovery/recovery.go b/recovery/recovery.go index 132f81a..bdc6ffc 100644 --- a/recovery/recovery.go +++ b/recovery/recovery.go @@ -5,7 +5,7 @@ import ( "runtime/debug" "testing" - "github.com/pubgo/funk/errors/errinter" + "github.com/pubgo/funk/v2/errors/errinter" "github.com/samber/lo" ) diff --git a/recovery/recovery_test.go b/recovery/recovery_test.go index cc3d080..a0c0e5e 100644 --- a/recovery/recovery_test.go +++ b/recovery/recovery_test.go @@ -4,10 +4,10 @@ import ( "fmt" "testing" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" ) func testExit1() { @@ -40,9 +40,9 @@ func TestResult(t *testing.T) { } handler := func() (r result.Result[A]) { - defer recovery.Err(&r.E) + defer result.Recovery(&r) - r = r.WithVal(A{A: "hello"}) + r = r.WithValue(A{A: "hello"}) panic("ok") } diff --git a/v2/result/api.go b/result/api.go similarity index 98% rename from v2/result/api.go rename to result/api.go index 41d0e89..fb9999e 100644 --- a/v2/result/api.go +++ b/result/api.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/rs/zerolog" ) diff --git a/v2/result/error.go b/result/error.go similarity index 95% rename from v2/result/error.go rename to result/error.go index 9fe9ef0..2fa74ea 100644 --- a/v2/result/error.go +++ b/result/error.go @@ -6,9 +6,9 @@ import ( "github.com/rs/zerolog" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/errors/errutil" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/errors/errutil" + "github.com/pubgo/funk/v2/log/logfields" ) var _ Catchable = new(Error) diff --git a/v2/result/error_test.go b/result/error_test.go similarity index 71% rename from v2/result/error_test.go rename to result/error_test.go index ebbc69f..7865cd5 100644 --- a/v2/result/error_test.go +++ b/result/error_test.go @@ -3,8 +3,8 @@ package result import ( "testing" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log/logfields" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log/logfields" "github.com/rs/zerolog" ) diff --git a/v2/result/future.go b/result/future.go similarity index 97% rename from v2/result/future.go rename to result/future.go index 747b00b..4af99cd 100644 --- a/v2/result/future.go +++ b/result/future.go @@ -3,7 +3,7 @@ package result import ( "context" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" "github.com/samber/lo" ) diff --git a/v2/result/interface.go b/result/interface.go similarity index 100% rename from v2/result/interface.go rename to result/interface.go diff --git a/v2/result/proxy.go b/result/proxy.go similarity index 100% rename from v2/result/proxy.go rename to result/proxy.go diff --git a/v2/result/proxy_test.go b/result/proxy_test.go similarity index 100% rename from v2/result/proxy_test.go rename to result/proxy_test.go diff --git a/result/result.go b/result/result.go index ce92083..6b62417 100644 --- a/result/result.go +++ b/result/result.go @@ -1,315 +1,231 @@ package result import ( + "context" "encoding/json" "fmt" - "runtime/debug" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/stack" - "github.com/rs/zerolog/log" + "github.com/rs/zerolog" "github.com/samber/lo" -) - -var _ error = (*Error)(nil) - -type Error struct { - Msg string - Stack string -} - -func (e Error) String() string { - return fmt.Sprintf("%s:\n%s", e.Msg, e.Stack) -} - -func (e Error) Error() string { - return e.String() -} - -type R[T any] interface { - Unwrap() T - IsErr() bool - Err() error - Expect(format string, args ...any) T -} - -func OK[T any](v T) Result[T] { - return Result[T]{v: &v} -} - -func Err[T any](err error) Result[T] { - return Result[T]{E: errors.WrapCaller(err, 1)} -} -func Wrap[T any](v T, err error) Result[T] { - return Result[T]{v: &v, E: errors.WrapCaller(err, 1)} -} + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log/logfields" +) -func Of[T any](v T, err error) Result[T] { - return Result[T]{v: &v, E: errors.WrapCaller(err, 1)} -} +var _ Catchable = new(Result[any]) +var _ Checkable = new(Result[any]) +var _ ErrSetter = new(Result[any]) type Result[T any] struct { - v *T - E error -} + _ [0]func() // disallow == -func (r Result[T]) WithErrorf(format string, args ...any) Result[T] { - return Result[T]{E: errors.WrapCaller(errors.Errorf(format, args...), 1)} + v *T + err error } -func (r Result[T]) WithErr(err error) Result[T] { - return Result[T]{E: errors.WrapCaller(err, 1)} -} - -func (r Result[T]) WithVal(v T) Result[T] { - return OK(v) -} - -func (r Result[T]) ValueTo(v *T) error { +func (r Result[T]) GetValue() (t T) { if r.IsErr() { - return errors.WrapCaller(r.E, 1) + return } - *v = generic.FromPtr(r.v) - return nil + return r.getValue() } -func (r Result[T]) OnValue(fn func(t T) error) error { +func (r Result[T]) WithFn(fn func() (T, error)) Result[T] { if r.IsErr() { - return r.E + err := errors.WrapCaller(r.getErr(), 1) + return Result[T]{err: err} } - return errors.WrapCaller(fn(generic.FromPtr(r.v)), 1) + return WrapFn(fn) } -func (r Result[T]) OnErr(check func(err error)) { - if r.IsOK() { - return - } - - check(r.E) -} - -func (r Result[T]) GetErr() error { - if r.IsOK() { - return nil +func (r Result[T]) WithValue(v T) Result[T] { + if r.IsErr() { + err := errors.WrapCaller(r.getErr(), 1) + return Result[T]{err: err} } - return errors.WrapCaller(r.E, 1) + return OK(v) } -func (r Result[T]) Err(check ...func(err error) error) error { - if r.IsOK() { - return nil +func (r Result[T]) ValueTo(v *T) Error { + if r.IsErr() { + return newError(errors.WrapCaller(r.getErr(), 1)) } - if len(check) > 0 && check[0] != nil { - return errors.WrapCaller(check[0](r.E), 1) + if v == nil { + return newError(errors.WrapStack(errors.New("v param is nil"))) } - return errors.WrapCaller(r.E, 1) + *v = r.getValue() + return newError(nil) } -func (r Result[T]) IsErr() bool { return r.E != nil } - -func (r Result[T]) IsOK() bool { return r.E == nil } - func (r Result[T]) OrElse(v T) T { if r.IsErr() { return v } - return generic.FromPtr(r.v) + return lo.FromPtr(r.v) } -func (r Result[T]) UnwrapErr(setter *error) T { - if setter == nil { - debug.PrintStack() - panic("UnwrapErr: setter is nil") - } - +func (r Result[T]) Expect(format string, args ...any) T { if r.IsErr() { - *setter = errors.WrapCaller(r.E, 1) + err := errors.WrapCaller(r.getErr(), 1) + errNilOrPanic(err, func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf(format, args...)) + }) } - return lo.FromPtr(r.v) + return r.getValue() } -func (r Result[T]) Unwrap(check ...func(err error) error) T { - if r.IsOK() { - return generic.FromPtr(r.v) +func (r Result[T]) Must(events ...func(e *zerolog.Event)) T { + if r.IsErr() { + errNilOrPanic(errors.WrapCaller(r.getErr(), 1), events...) } - if len(check) > 0 && check[0] != nil { - panic(check[0](r.E)) - } else { - panic(r.E) - } + return r.getValue() } -func (r Result[T]) GetValue() T { - if r.IsOK() { - return generic.FromPtr(r.v) - } +func (r Result[T]) CatchErr(setter *error, ctx ...context.Context) bool { + return catchErr(newError(r.err), nil, setter, ctx...) +} - panic(errors.WrapStack(r.E)) +func (r Result[T]) Catch(setter ErrSetter, ctx ...context.Context) bool { + return catchErr(newError(r.err), setter, nil, ctx...) } -func (r Result[T]) Expect(format string, args ...any) T { - if r.IsOK() { - return generic.FromPtr(r.v) - } +func (r Result[T]) IsErr() bool { return r.getErr() != nil } - panic(errors.WrapStack(errors.Wrapf(r.E, format, args...))) -} +func (r Result[T]) IsOK() bool { return r.getErr() == nil } -func (r Result[T]) String() string { - if r.IsOK() { - return fmt.Sprintf("%v", generic.FromPtr(r.v)) +func (r Result[T]) InspectErr(fn func(err error)) Result[T] { + if r.IsErr() { + fn(r.getErr()) } - - return fmt.Sprint(errors.WrapCaller(r.E, 1)) + return r } -func (r Result[T]) MarshalJSON() ([]byte, error) { - if r.IsErr() { - return nil, errors.WrapCaller(r.E, 1) +func (r Result[T]) Inspect(fn func(val T)) Result[T] { + if r.IsOK() { + fn(r.getValue()) } + return r +} - return json.Marshal(generic.FromPtr(r.v)) +func (r Result[T]) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Result[T] { + logErr(ctx, 0, r.err, events...) + return r } -func (r Result[T]) UnmarshalJSON([]byte) error { - panic("unimplemented") +func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { + logErr(nil, 0, r.err, events...) + return r } -func (r Result[T]) Do(fn func(v T)) { +func (r Result[T]) Map(fn func(val T) T) Result[T] { if r.IsErr() { - return + return r } - - fn(generic.FromPtr(r.v)) + return OK(fn(r.getValue())) } -func (r Result[T]) CatchTo(setter *error, callbacks ...func(err error) error) bool { - if setter == nil { - debug.PrintStack() - panic("CatchTo: setter is nil") - } - - if r.IsOK() { - return false - } - - // setter err is not nil - if *setter != nil { - log.Err(*setter).Msgf("CatchTo: setter error is not nil") - return true - } - - var err = r.E - for _, fn := range callbacks { - err = fn(err) - if err == nil { - return false - } +func (r Result[T]) FlatMap(fn func(val T) Result[T]) Result[T] { + if r.IsErr() { + return r } - - *setter = errors.WrapCaller(err, 1) - return true + return fn(r.getValue()) } -func (r Result[T]) InspectErr(fn func(error)) Result[T] { +func (r Result[T]) Validate(fn func(val T) error) Result[T] { if r.IsErr() { - fn(r.E) + return r } - return r -} -func (r Result[T]) Inspect(fn func(T)) Result[T] { - if r.IsOK() { - fn(generic.FromPtr(r.v)) + err := fn(r.getValue()) + if err != nil { + return Fail[T](errors.WrapCaller(err, 1)) } - return r + return OK(r.getValue()) } -func (r Result[T]) FlatMap(fn func(T) Result[T]) Result[T] { +func (r Result[T]) MapErr(fn func(err error) error) Result[T] { if r.IsOK() { return r } - return fn(generic.FromPtr(r.v)) + return Fail[T](fn(r.getErr())) } -func (r Result[T]) Map(fn func(T) T) Result[T] { +func (r Result[T]) MapErrOr(fn func(err error) Result[T]) Result[T] { if r.IsOK() { return r } - return OK(fn(generic.FromPtr(r.v))) + return fn(r.getErr()) } -func (r Result[T]) MapErr(fn func(error) error) Result[T] { +func (r Result[T]) GetErr() error { if r.IsOK() { - return r + return nil } - return Err[T](fn(r.E)) + + return r.getErr() } -func MapTo[Src any, To any](s Result[Src], do func(s Src) To) Result[To] { - if s.IsErr() { - return Err[To](errors.WrapCaller(s.Err(), 1)) +func (r Result[T]) String() string { + if r.IsOK() { + return fmt.Sprintf("Ok(%v)", r.getValue()) } + return fmt.Sprintf("Error(%v)", r.getErr()) +} - return OK(do(s.Unwrap())) +func (r Result[T]) WithErrorf(format string, args ...any) Result[T] { + err := fmt.Errorf(format, args...) + err = errors.WrapCaller(err, 1) + return Result[T]{err: err} } -func FlatMap[Src any, To any](s Result[Src], do func(s Src) (r Result[To])) Result[To] { - if s.IsErr() { - return Err[To](errors.WrapCaller(s.Err(), 1)) +func (r Result[T]) WithErr(err error) Result[T] { + if err == nil { + return r } - return do(s.Unwrap()) + err = errors.WrapCaller(err, 1) + return Result[T]{err: err} } -func Unwrap[T any](ret Result[T], gErr *error, callback ...func(err error) error) T { - if gErr == nil { - debug.PrintStack() - panic("Unwrap: gErr is nil") - } +func (r Result[T]) WrapErr(err *errors.Err, tags ...errors.Tag) Result[T] { + return Result[T]{err: errors.WrapTag(errors.WrapCaller(err, 1), tags...)} +} - if ret.IsOK() { - return ret.GetValue() +func (r Result[T]) UnwrapErr(setter *error, contexts ...context.Context) T { + ret, err := unwrapErr(r, setter, nil, contexts...) + if err != nil { + *setter = errors.WrapCaller(err, 1) } + return ret +} - var t T - err := ret.Err() - for _, fn := range callback { - if err == nil { - return t - } - - err = fn(err) +func (r Result[T]) Unwrap(setter ErrSetter, contexts ...context.Context) T { + ret, err := unwrapErr(r, nil, setter, contexts...) + if err != nil { + setError(setter, errors.WrapCaller(err, 1)) } - - *gErr = errors.WrapCaller(err, 1) - return t + return ret } -func Try[T any](fn func() Result[T]) (g Result[T]) { - if fn == nil { - return g.WithErr(errors.WrapStack(errors.New("[fn] is nil"))) +func (r Result[T]) MarshalJSON() ([]byte, error) { + if r.IsErr() { + return nil, errors.WrapCaller(r.err, 1) } - defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { - g = g.WithErr(errors.WrapStack(err)) - } + return json.Marshal(funk.FromPtr(r.v)) +} + +func (r Result[T]) getValue() T { return lo.FromPtr(r.v) } - if g.IsErr() { - g = g.WithErr(errors.WrapKV(g.Err(), "fn_stack", stack.CallerWithFunc(fn))) - } - }() +func (r Result[T]) getErr() error { return r.err } - g = fn() - return +func (r Result[T]) setErrorInner() { } diff --git a/result/result_test.go b/result/result_test.go index 8703c33..5a3d0c8 100644 --- a/result/result_test.go +++ b/result/result_test.go @@ -1,52 +1,92 @@ package result_test import ( + "context" "encoding/json" "fmt" + result2 "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/result/resultchecker" "testing" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/result" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/recovery" ) +func TestMust(t *testing.T) { + defer recovery.Testing(t) + result2.Must(fmt.Errorf("test must")) +} + type hello struct { Name string `json:"name"` } func TestName(t *testing.T) { - ok := result.OK(&hello{Name: "abc"}) - okBytes := result.Of(json.Marshal(&ok)) + defer recovery.DebugPrint() + ok := &hello{Name: "abc"} + okBytes := result2.Wrap(json.Marshal(&ok)) data := string(okBytes.Expect("failed to encode json data")) t.Log(data) if data != `{"name":"abc"}` { t.Log(data) t.Fatal("not match") } - - var ok1 hello - if err := json.Unmarshal([]byte(data), &ok1); err != nil { - t.Fatal(err) - } - t.Log("ok", ok1.Name) } func TestResultDo(t *testing.T) { - ok := result.OK(&hello{Name: "abc"}) - ok.Do(func(v *hello) { + ok := result2.OK(&hello{Name: "abc"}) + ok.Inspect(func(v *hello) { assert.If(v.Name != "abc", "not match") - }) - ok.Do(func(v *hello) { + }).Inspect(func(v *hello) { assert.If(v.Name != "abc", "not match") }) + ok.InspectErr(func(err error) { + t.Log(err) + }) +} + +func TestErrOf(t *testing.T) { + var ctx = log.UpdateEventCtx(context.Background(), log.Map{"test": "ok"}) + resultchecker.RegisterErrCheck(log.RecordErr()) + + var err result2.Error + if fn1().Catch(&err, ctx) { + errors.Debug(err.GetErr()) + } +} + +func fn1() (r result2.Result[string]) { + if fn3().Catch(&r) { + return + } + + val := fn2().Unwrap(&r) + if r.IsErr() { + return + } - assert.Assert(err1().Err() == nil, "failed to check CatchTo") - assert.Assert(err1().Err().Error() != "test error", "error not match") + return r.WithValue(val) } -func err1() (gErr result.Result[any]) { - ret := result.Err[any](fmt.Errorf("test error")) - if ret.CatchTo(&gErr.E) { +func fn2() (r result2.Result[string]) { + fn3(). + InspectErr(func(err error) { + log.Err(err).Msg("test error") + }). + Catch(&r) + if r.IsErr() { return } - return + + return r.WithValue("ok") +} + +func fn3() result2.Error { + return result2.ErrOf(fmt.Errorf("error test, this is error")). + InspectErr(func(err error) { + log.Err(err).Msg("ddd") + }). + Log() } diff --git a/v2/result/resultchecker/checker.go b/result/resultchecker/checker.go similarity index 96% rename from v2/result/resultchecker/checker.go rename to result/resultchecker/checker.go index 5888b45..b9dec84 100644 --- a/v2/result/resultchecker/checker.go +++ b/result/resultchecker/checker.go @@ -4,7 +4,7 @@ import ( "context" "reflect" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/stack" ) var errChecks []ErrChecker diff --git a/v2/result/resultchecker/checker_test.go b/result/resultchecker/checker_test.go similarity index 100% rename from v2/result/resultchecker/checker_test.go rename to result/resultchecker/checker_test.go diff --git a/v2/result/resultchecker/context.go b/result/resultchecker/context.go similarity index 100% rename from v2/result/resultchecker/context.go rename to result/resultchecker/context.go diff --git a/v2/result/util.go b/result/util.go similarity index 91% rename from v2/result/util.go rename to result/util.go index 469e91f..cc3939d 100644 --- a/v2/result/util.go +++ b/result/util.go @@ -3,6 +3,7 @@ package result import ( "context" "fmt" + resultchecker2 "github.com/pubgo/funk/v2/result/resultchecker" "log/slog" "reflect" "runtime/debug" @@ -12,13 +13,12 @@ import ( "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/v2/result/resultchecker" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/stack" ) var errFnIsNil = errors.New("[fn] is nil") @@ -150,7 +150,7 @@ func catchErr(r Error, setter ErrSetter, rawSetter *error, contexts ...context.C log.Err(err, ctx).Msgf("error setter has already set the error, err=%s", err.Error()) } - var checkers = append(resultchecker.GetErrChecks(), resultchecker.GetCheckersFromCtx(ctx)...) + var checkers = append(resultchecker2.GetErrChecks(), resultchecker2.GetCheckersFromCtx(ctx)...) var err = r.getErr() for _, fn := range checkers { err = fn(ctx, err) @@ -212,7 +212,7 @@ func unwrapErr[T any](r Result[T], setter1 *error, setter2 ErrSetter, contexts . } var err = r.getErr() - var checkers = append(resultchecker.GetErrChecks(), resultchecker.GetCheckersFromCtx(ctx)...) + var checkers = append(resultchecker2.GetErrChecks(), resultchecker2.GetCheckersFromCtx(ctx)...) for _, fn := range checkers { err = fn(ctx, err) if err == nil { diff --git a/retry/backoff_constant.go b/retry/backoff_constant.go index bc84da7..c8abb55 100644 --- a/retry/backoff_constant.go +++ b/retry/backoff_constant.go @@ -3,7 +3,7 @@ package retry import ( "time" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) const DefaultConstant = time.Second diff --git a/retry/backoff_exponential.go b/retry/backoff_exponential.go index 57a4c90..c439b78 100644 --- a/retry/backoff_exponential.go +++ b/retry/backoff_exponential.go @@ -4,7 +4,7 @@ import ( "sync/atomic" "time" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) // NewExponential creates a new exponential backoff using the starting value of diff --git a/retry/backoff_fibonacci.go b/retry/backoff_fibonacci.go index 94f3b48..2a60604 100644 --- a/retry/backoff_fibonacci.go +++ b/retry/backoff_fibonacci.go @@ -5,7 +5,7 @@ import ( "time" "unsafe" - "github.com/pubgo/funk/assert" + "github.com/pubgo/funk/v2/assert" ) // NewFibonacci creates a new Fibonacci backoff using the starting value of diff --git a/retry/retry.go b/retry/retry.go index 9732ce5..7c65eda 100644 --- a/retry/retry.go +++ b/retry/retry.go @@ -3,7 +3,7 @@ package retry import ( "time" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/recovery" ) type Retry func() Backoff diff --git a/running/runtime.go b/running/runtime.go index 2a85916..717af69 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -7,13 +7,13 @@ import ( "github.com/projectdiscovery/machineid" "github.com/rs/xid" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/env" - "github.com/pubgo/funk/monster" - "github.com/pubgo/funk/netutil" - "github.com/pubgo/funk/pathutil" - "github.com/pubgo/funk/strutil" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/env" + "github.com/pubgo/funk/v2/monster" + "github.com/pubgo/funk/v2/netutil" + "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/strutil" + "github.com/pubgo/funk/v2/version" ) // default global variables diff --git a/running/util.go b/running/util.go index 8984938..41ff5ee 100644 --- a/running/util.go +++ b/running/util.go @@ -6,9 +6,9 @@ import ( semver "github.com/hashicorp/go-version" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/version" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/version" ) func SetVersion(v string) { Version = v } diff --git a/shutil/shell.go b/shutil/shell.go index 3fc5224..f950ea2 100644 --- a/shutil/shell.go +++ b/shutil/shell.go @@ -3,35 +3,35 @@ package shutil import ( "bytes" "fmt" + result2 "github.com/pubgo/funk/v2/result" "os" "os/exec" "strings" - "github.com/pubgo/funk/log/logfields" - "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/log/logfields" "github.com/rs/zerolog" ) -func Run(args ...string) (r result.Result[string]) { - defer result.Recovery(&r) +func Run(args ...string) (r result2.Result[string]) { + defer result2.Recovery(&r) b := bytes.NewBufferString("") cmd := Shell(args...) cmd.Stdout = b - result.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { + result2.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to execute: "+strings.Join(args, " "))) }) return r.WithValue(strings.TrimSpace(b.String())) } -func GoModGraph() result.Result[string] { +func GoModGraph() result2.Result[string] { return Run("go", "mod", "graph") } -func GoList() result.Result[string] { +func GoList() result2.Result[string] { return Run("go", "list", "./...") } diff --git a/stack/stack_test.go b/stack/stack_test.go index 3e1647f..241ba84 100644 --- a/stack/stack_test.go +++ b/stack/stack_test.go @@ -5,9 +5,9 @@ import ( "reflect" "testing" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/stack" "github.com/stretchr/testify/assert" ) @@ -40,7 +40,7 @@ func TestCallerWithDepth(t *testing.T) { func TestCallType(t *testing.T) { assert.Equal(t, - "github.com/pubgo/funk/errors", + "github.com/pubgo/funk/v2/errors", stack.CallerWithType(reflect.TypeOf(errors.ErrMsg{})).Pkg, ) } diff --git a/stack/trace_test.go b/stack/trace_test.go index 76443c4..6339f0d 100644 --- a/stack/trace_test.go +++ b/stack/trace_test.go @@ -3,8 +3,8 @@ package stack_test import ( "testing" - "github.com/pubgo/funk/pretty" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2/pretty" + "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" ) diff --git a/stack/util.go b/stack/util.go index 63e0b32..2a17cd2 100644 --- a/stack/util.go +++ b/stack/util.go @@ -3,7 +3,7 @@ package stack import ( "runtime/debug" - "github.com/pubgo/funk/monster" + "github.com/pubgo/funk/v2/monster" ) var EnablePrintStack = monster.Bool("stack.enable_print_stack", false, "stack enable print stack data") diff --git a/strutil/template.go b/strutil/template.go index 2c2c376..1f06ec8 100644 --- a/strutil/template.go +++ b/strutil/template.go @@ -3,7 +3,7 @@ package strutil import ( "io" - "github.com/pubgo/funk/convert" + "github.com/pubgo/funk/v2/convert" "github.com/valyala/fasttemplate" ) diff --git a/syncutil/base.go b/syncutil/base.go index 1457486..35e11c1 100644 --- a/syncutil/base.go +++ b/syncutil/base.go @@ -1,6 +1,6 @@ package syncutil -import "github.com/pubgo/funk/log" +import "github.com/pubgo/funk/v2/log" const Name = "sync-util" diff --git a/syncutil/waitgroup.go b/syncutil/waitgroup.go index 2a09a43..efa5e9f 100644 --- a/syncutil/waitgroup.go +++ b/syncutil/waitgroup.go @@ -3,9 +3,9 @@ package syncutil import ( "sync" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/stack" - "github.com/pubgo/funk/try" + "github.com/pubgo/funk/v2/log" + "github.com/pubgo/funk/v2/stack" + "github.com/pubgo/funk/v2/try" "github.com/rs/zerolog" ) diff --git a/template/template.go b/template/template.go index 18f7aba..b17ed2d 100644 --- a/template/template.go +++ b/template/template.go @@ -8,8 +8,8 @@ import ( "github.com/open2b/scriggo" "github.com/open2b/scriggo/native" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/log" ) type Template struct { diff --git a/try/try.go b/try/try.go index ca72d60..4af6abd 100644 --- a/try/try.go +++ b/try/try.go @@ -1,9 +1,9 @@ package try import ( - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/stack" + "github.com/pubgo/funk/v2" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/stack" ) func WithErr(gErr *error, fn func() error) { diff --git a/try/try_test.go b/try/try_test.go index 9bd1f24..3b6e71b 100644 --- a/try/try_test.go +++ b/try/try_test.go @@ -3,7 +3,7 @@ package try import ( "testing" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/errors" ) func TestTry(t *testing.T) { diff --git a/typex/lock_map.go b/typex/lock_map.go index 0407b09..29bd93c 100644 --- a/typex/lock_map.go +++ b/typex/lock_map.go @@ -3,7 +3,7 @@ package typex import ( "sync" - "github.com/pubgo/funk/generic" + "github.com/pubgo/funk/v2/generic" ) var globalMutex sync.Mutex diff --git a/typex/set.go b/typex/set.go index becbefc..a877f0a 100644 --- a/typex/set.go +++ b/typex/set.go @@ -4,9 +4,9 @@ import ( "reflect" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/recovery" "go.uber.org/atomic" ) diff --git a/typex/sync_map.go b/typex/sync_map.go index c05196c..172395f 100644 --- a/typex/sync_map.go +++ b/typex/sync_map.go @@ -4,9 +4,9 @@ import ( "reflect" "sync" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/recovery" ) var NotFound = new(struct{}) diff --git a/typex/yaml.go b/typex/yaml.go index 0ca917b..3866e69 100644 --- a/typex/yaml.go +++ b/typex/yaml.go @@ -1,8 +1,8 @@ package typex import ( - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/errors" yaml "gopkg.in/yaml.v3" ) diff --git a/utils/utils.go b/utils/utils.go index 721ac43..1283022 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -3,7 +3,7 @@ package utils import ( "io" - "github.com/pubgo/funk/log" + "github.com/pubgo/funk/v2/log" ) func SafeClose(closer io.Closer) { diff --git a/v2/result/result.go b/v2/result/result.go deleted file mode 100644 index 636fe4e..0000000 --- a/v2/result/result.go +++ /dev/null @@ -1,224 +0,0 @@ -package result - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/rs/zerolog" - "github.com/samber/lo" - - "github.com/pubgo/funk" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log/logfields" -) - -var _ Catchable = new(Result[any]) -var _ Checkable = new(Result[any]) -var _ ErrSetter = new(Result[any]) - -type Result[T any] struct { - _ [0]func() // disallow == - - v *T - err error -} - -func (r Result[T]) GetValue() (t T) { - if r.IsErr() { - return - } - - return r.getValue() -} - -func (r Result[T]) WithFn(fn func() (T, error)) Result[T] { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Result[T]{err: err} - } - - return WrapFn(fn) -} - -func (r Result[T]) WithValue(v T) Result[T] { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Result[T]{err: err} - } - - return OK(v) -} - -func (r Result[T]) ValueTo(v *T) Error { - if r.IsErr() { - return newError(errors.WrapCaller(r.getErr(), 1)) - } - - if v == nil { - return newError(errors.WrapStack(errors.New("v param is nil"))) - } - - *v = r.getValue() - return newError(nil) -} - -func (r Result[T]) Expect(format string, args ...any) T { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - errNilOrPanic(err, func(e *zerolog.Event) { - e.Str(logfields.Msg, fmt.Sprintf(format, args...)) - }) - } - - return r.getValue() -} - -func (r Result[T]) Must(events ...func(e *zerolog.Event)) T { - if r.IsErr() { - errNilOrPanic(errors.WrapCaller(r.getErr(), 1), events...) - } - - return r.getValue() -} - -func (r Result[T]) CatchErr(setter *error, ctx ...context.Context) bool { - return catchErr(newError(r.err), nil, setter, ctx...) -} - -func (r Result[T]) Catch(setter ErrSetter, ctx ...context.Context) bool { - return catchErr(newError(r.err), setter, nil, ctx...) -} - -func (r Result[T]) IsErr() bool { return r.getErr() != nil } - -func (r Result[T]) IsOK() bool { return r.getErr() == nil } - -func (r Result[T]) InspectErr(fn func(err error)) Result[T] { - if r.IsErr() { - fn(r.getErr()) - } - return r -} - -func (r Result[T]) Inspect(fn func(val T)) Result[T] { - if r.IsOK() { - fn(r.getValue()) - } - return r -} - -func (r Result[T]) LogCtx(ctx context.Context, events ...func(e *zerolog.Event)) Result[T] { - logErr(ctx, 0, r.err, events...) - return r -} - -func (r Result[T]) Log(events ...func(e *zerolog.Event)) Result[T] { - logErr(nil, 0, r.err, events...) - return r -} - -func (r Result[T]) Map(fn func(val T) T) Result[T] { - if r.IsErr() { - return r - } - return OK(fn(r.getValue())) -} - -func (r Result[T]) FlatMap(fn func(val T) Result[T]) Result[T] { - if r.IsErr() { - return r - } - return fn(r.getValue()) -} - -func (r Result[T]) Validate(fn func(val T) error) Result[T] { - if r.IsErr() { - return r - } - - err := fn(r.getValue()) - if err != nil { - return Fail[T](errors.WrapCaller(err, 1)) - } - return OK(r.getValue()) -} - -func (r Result[T]) MapErr(fn func(err error) error) Result[T] { - if r.IsOK() { - return r - } - return Fail[T](fn(r.getErr())) -} - -func (r Result[T]) MapErrOr(fn func(err error) Result[T]) Result[T] { - if r.IsOK() { - return r - } - return fn(r.getErr()) -} - -func (r Result[T]) GetErr() error { - if r.IsOK() { - return nil - } - - return r.getErr() -} - -func (r Result[T]) String() string { - if r.IsOK() { - return fmt.Sprintf("Ok(%v)", r.getValue()) - } - return fmt.Sprintf("Error(%v)", r.getErr()) -} - -func (r Result[T]) WithErrorf(format string, args ...any) Result[T] { - err := fmt.Errorf(format, args...) - err = errors.WrapCaller(err, 1) - return Result[T]{err: err} -} - -func (r Result[T]) WithErr(err error) Result[T] { - if err == nil { - return r - } - - err = errors.WrapCaller(err, 1) - return Result[T]{err: err} -} - -func (r Result[T]) WrapErr(err *errors.Err, tags ...errors.Tag) Result[T] { - return Result[T]{err: errors.WrapTag(errors.WrapCaller(err, 1), tags...)} -} - -func (r Result[T]) UnwrapErr(setter *error, contexts ...context.Context) T { - ret, err := unwrapErr(r, setter, nil, contexts...) - if err != nil { - *setter = errors.WrapCaller(err, 1) - } - return ret -} - -func (r Result[T]) Unwrap(setter ErrSetter, contexts ...context.Context) T { - ret, err := unwrapErr(r, nil, setter, contexts...) - if err != nil { - setError(setter, errors.WrapCaller(err, 1)) - } - return ret -} - -func (r Result[T]) MarshalJSON() ([]byte, error) { - if r.IsErr() { - return nil, errors.WrapCaller(r.err, 1) - } - - return json.Marshal(funk.FromPtr(r.v)) -} - -func (r Result[T]) getValue() T { return lo.FromPtr(r.v) } - -func (r Result[T]) getErr() error { return r.err } - -func (r Result[T]) setErrorInner() { -} diff --git a/v2/result/result_test.go b/v2/result/result_test.go deleted file mode 100644 index daa6132..0000000 --- a/v2/result/result_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package result_test - -import ( - "context" - "encoding/json" - "fmt" - "testing" - - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/v2/result/resultchecker" -) - -func TestMust(t *testing.T) { - defer recovery.Testing(t) - result.Must(fmt.Errorf("test must")) -} - -type hello struct { - Name string `json:"name"` -} - -func TestName(t *testing.T) { - defer recovery.DebugPrint() - ok := &hello{Name: "abc"} - okBytes := result.Wrap(json.Marshal(&ok)) - data := string(okBytes.Expect("failed to encode json data")) - t.Log(data) - if data != `{"name":"abc"}` { - t.Log(data) - t.Fatal("not match") - } -} - -func TestResultDo(t *testing.T) { - ok := result.OK(&hello{Name: "abc"}) - ok.Inspect(func(v *hello) { - assert.If(v.Name != "abc", "not match") - }).Inspect(func(v *hello) { - assert.If(v.Name != "abc", "not match") - }) - ok.InspectErr(func(err error) { - t.Log(err) - }) -} - -func TestErrOf(t *testing.T) { - var ctx = log.UpdateEventCtx(context.Background(), log.Map{"test": "ok"}) - resultchecker.RegisterErrCheck(log.RecordErr()) - - var err result.Error - if fn1().Catch(&err, ctx) { - errors.Debug(err.GetErr()) - } -} - -func fn1() (r result.Result[string]) { - if fn3().Catch(&r) { - return - } - - val := fn2().Unwrap(&r) - if r.IsErr() { - return - } - - return r.WithValue(val) -} - -func fn2() (r result.Result[string]) { - fn3(). - InspectErr(func(err error) { - log.Err(err).Msg("test error") - }). - Catch(&r) - if r.IsErr() { - return - } - - return r.WithValue("ok") -} - -func fn3() result.Error { - return result. - ErrOf(fmt.Errorf("error test, this is error")). - InspectErr(func(err error) { - log.Err(err).Msg("ddd") - }). - Log() -} diff --git a/vars/vars.go b/vars/vars.go index 035fe06..287cb05 100644 --- a/vars/vars.go +++ b/vars/vars.go @@ -13,8 +13,8 @@ import ( "github.com/rs/xid" "go.uber.org/atomic" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" ) var mux sync.Mutex diff --git a/vars/z_test.go b/vars/z_test.go index 7afb037..5e00a6f 100644 --- a/vars/z_test.go +++ b/vars/z_test.go @@ -4,9 +4,9 @@ import ( "expvar" "testing" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/recovery" - "github.com/pubgo/funk/vars" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/vars" ) func TestAny(t *testing.T) { From 13870f207501ee1421deb6f3532158742d97b457 Mon Sep 17 00:00:00 2001 From: barry Date: Sat, 27 Sep 2025 19:10:02 +0800 Subject: [PATCH 30/43] chore(deps): update urfave/cli/v3 to v3.4.1 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b264a00..3110b7d 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/testcontainers/testcontainers-go/modules/postgres v0.30.0 github.com/tidwall/gjson v1.17.1 github.com/tidwall/match v1.1.1 - github.com/urfave/cli/v3 v3.3.8 + github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fastrand v1.1.0 github.com/valyala/fasttemplate v1.2.2 go.etcd.io/bbolt v1.3.7 diff --git a/go.sum b/go.sum index 04e3504..0a0ed57 100644 --- a/go.sum +++ b/go.sum @@ -364,8 +364,8 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E= -github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= +github.com/urfave/cli/v3 v3.4.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8= From f18214acdab156aad8b3d56af1ce61529693c54b Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 26 Sep 2025 11:35:36 +0800 Subject: [PATCH 31/43] chore: quick update fix/version at 2025-09-30 10:01:37 --- component/gormclient/migratecmd/cmd.go | 291 ++++++++++++------------- config/envs.go | 7 +- go.mod | 1 - go.sum | 2 - monster/monster.go | 2 +- stack/stack.go | 5 + v2/result/util.go | 28 +-- 7 files changed, 162 insertions(+), 174 deletions(-) diff --git a/component/gormclient/migratecmd/cmd.go b/component/gormclient/migratecmd/cmd.go index 191e644..b66a973 100644 --- a/component/gormclient/migratecmd/cmd.go +++ b/component/gormclient/migratecmd/cmd.go @@ -1,156 +1,139 @@ package migratecmd -import ( - "context" - "path/filepath" - "time" - - "github.com/pubgo/dix" - "github.com/pubgo/funk/assert" - "github.com/pubgo/funk/component/gormclient" - "github.com/pubgo/funk/component/gormclient/migrates" - "github.com/pubgo/funk/errors" - "github.com/pubgo/funk/generic" - "github.com/pubgo/funk/log" - "github.com/pubgo/funk/recovery" - cli "github.com/urfave/cli/v3" - "gorm.io/gen" -) - -type params struct { - Log log.Logger - Db *gormclient.Client - Migrations []migrates.Migrate - Generations migrates.Generation -} - -func migrate(m []migrates.Migrate) []*migrates.Migration { - var migrations []*migrates.Migration - for i := range m { - migrations = append(migrations, m[i]()) - } - return migrations -} - -func New(di *dix.Dix) *cli.Command { - var id string - - options := migrates.DefaultConfig - return &cli.Command{ - Name: "migrate", - Usage: "db migrate", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "id", - Usage: "migration id", - Destination: &id, - }, - }, - Before: func(ctx context.Context, command *cli.Command) (context.Context, error) { - p := dix.Inject(di, new(params)) - options.TableName = p.Db.TablePrefix + migrates.DefaultConfig.TableName - return ctx, nil - }, - Commands: []*cli.Command{ - { - Name: "migrate", - Usage: "do migrate", - Aliases: []string{"m"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - p := dix.Inject(di, new(params)) - m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) - if id == "" { - assert.Must(m.Migrate()) - } else { - assert.Must(m.MigrateTo(id)) - } - p.Log.Info().Msg("migration ok") - return nil - }, - }, - { - Name: "list", - Usage: "list migrate", - Aliases: []string{"l"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - p := dix.Inject(di, new(params)) - - var ids []string - assert.Must(p.Db.Table(options.TableName).Select("id").Find(&ids).Error) - - for _, m := range migrate(p.Migrations) { - p.Log.Info().Msgf("migration-id=%s %s", m.ID, generic.Ternary(generic.Contains(ids, m.ID), "done", "missing")) - ids = generic.Delete(ids, m.ID) - } - - for i := range ids { - p.Log.Info().Msgf("migration-id=%s %s", ids[i], "undo") - } - - time.Sleep(time.Millisecond * 10) - return nil - }, - }, - { - Name: "rollback", - Usage: "do rollback", - Aliases: []string{"r"}, - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Recovery(func(err error) { - if errors.Is(err, migrates.ErrNoRunMigration) { - return - } - - assert.Exit(err) - }) - - p := dix.Inject(di, new(params)) - m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) - if id == "" { - assert.Must(m.RollbackLast()) - } else { - assert.Must(m.RollbackTo(id)) - } - p.Log.Info().Msg("rollback last ok") - return nil - }, - }, - { - Name: "gen", - Usage: "do gen orm model and query code", - Aliases: []string{"g"}, - UsageText: "migrate gen [./internal/db]", - Action: func(ctx context.Context, command *cli.Command) error { - defer recovery.Exit() - - genPath := "./internal/db" - if command.NArg() > 0 { - genPath = command.Args().First() - } - - g := gen.NewGenerator(gen.Config{ - OutPath: filepath.Join(genPath, "query"), - ModelPkgPath: filepath.Join(genPath, "models"), - FieldWithTypeTag: true, - FieldWithIndexTag: true, - FieldNullable: true, - FieldCoverable: true, - Mode: gen.WithQueryInterface | gen.WithDefaultQuery | gen.WithoutContext, - }) - - p := dix.Inject(di, new(params)) - g.UseDB(p.Db.DB) - - g.ApplyBasic(p.Generations(g)...) - g.Execute() - - return nil - }, - }, - }, - } -} +//type params struct { +// Log log.Logger +// Db *gormclient.Client +// Migrations []migrates.Migrate +// Generations migrates.Generation +//} +// +//func migrate(m []migrates.Migrate) []*migrates.Migration { +// var migrations []*migrates.Migration +// for i := range m { +// migrations = append(migrations, m[i]()) +// } +// return migrations +//} +// +//func New(di *dix.Dix) *cli.Command { +// var id string +// +// options := migrates.DefaultConfig +// return &cli.Command{ +// Name: "migrate", +// Usage: "db migrate", +// Flags: []cli.Flag{ +// &cli.StringFlag{ +// Name: "id", +// Usage: "migration id", +// Destination: &id, +// }, +// }, +// Before: func(ctx context.Context, command *cli.Command) (context.Context, error) { +// p := dix.Inject(di, new(params)) +// options.TableName = p.Db.TablePrefix + migrates.DefaultConfig.TableName +// return ctx, nil +// }, +// Commands: []*cli.Command{ +// { +// Name: "migrate", +// Usage: "do migrate", +// Aliases: []string{"m"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// p := dix.Inject(di, new(params)) +// m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) +// if id == "" { +// assert.Must(m.Migrate()) +// } else { +// assert.Must(m.MigrateTo(id)) +// } +// p.Log.Info().Msg("migration ok") +// return nil +// }, +// }, +// { +// Name: "list", +// Usage: "list migrate", +// Aliases: []string{"l"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// p := dix.Inject(di, new(params)) +// +// var ids []string +// assert.Must(p.Db.Table(options.TableName).Select("id").Find(&ids).Error) +// +// for _, m := range migrate(p.Migrations) { +// p.Log.Info().Msgf("migration-id=%s %s", m.ID, generic.Ternary(generic.Contains(ids, m.ID), "done", "missing")) +// ids = generic.Delete(ids, m.ID) +// } +// +// for i := range ids { +// p.Log.Info().Msgf("migration-id=%s %s", ids[i], "undo") +// } +// +// time.Sleep(time.Millisecond * 10) +// return nil +// }, +// }, +// { +// Name: "rollback", +// Usage: "do rollback", +// Aliases: []string{"r"}, +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Recovery(func(err error) { +// if errors.Is(err, migrates.ErrNoRunMigration) { +// return +// } +// +// assert.Exit(err) +// }) +// +// p := dix.Inject(di, new(params)) +// m := migrates.New(p.Db.DB, &options, migrate(p.Migrations)) +// if id == "" { +// assert.Must(m.RollbackLast()) +// } else { +// assert.Must(m.RollbackTo(id)) +// } +// p.Log.Info().Msg("rollback last ok") +// return nil +// }, +// }, +// { +// Name: "gen", +// Usage: "do gen orm model and query code", +// Aliases: []string{"g"}, +// UsageText: "migrate gen [./internal/db]", +// Action: func(ctx context.Context, command *cli.Command) error { +// defer recovery.Exit() +// +// genPath := "./internal/db" +// if command.NArg() > 0 { +// genPath = command.Args().First() +// } +// +// g := gen.NewGenerator(gen.Config{ +// OutPath: filepath.Join(genPath, "query"), +// ModelPkgPath: filepath.Join(genPath, "models"), +// FieldWithTypeTag: true, +// FieldWithIndexTag: true, +// FieldNullable: true, +// FieldCoverable: true, +// Mode: gen.WithQueryInterface | gen.WithDefaultQuery | gen.WithoutContext, +// }) +// +// p := dix.Inject(di, new(params)) +// g.UseDB(p.Db.DB) +// +// g.ApplyBasic(p.Generations(g)...) +// g.Execute() +// +// return nil +// }, +// }, +// }, +// } +//} diff --git a/config/envs.go b/config/envs.go index 4d1c143..f3b9f29 100644 --- a/config/envs.go +++ b/config/envs.go @@ -10,8 +10,11 @@ import ( type EnvSpecMap map[string]*EnvSpec type EnvSpec struct { - Name string `yaml:"name"` + Name string `yaml:"name"` + + // Description Deprecated: use Desc instead. Description string `yaml:"description"` + Desc string `yaml:"desc"` Default string `yaml:"default"` Value string `yaml:"value"` Required bool `yaml:"required"` @@ -21,7 +24,7 @@ type EnvSpec struct { func initEnv(envMap EnvSpecMap) { for name, cfg := range envMap { cfg.Name = name - + envData := strings.TrimSpace(strutil.FirstNotEmpty(env.Get(name), cfg.Value, cfg.Default)) if cfg.Required && envData == "" { panic("env " + cfg.Name + " is required") diff --git a/go.mod b/go.mod index 67e8dc2..514a48a 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/phuslu/goid v1.0.0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 - github.com/pubgo/dix v0.3.15 github.com/rs/xid v1.5.0 github.com/rs/zerolog v1.33.0 github.com/samber/lo v1.51.0 diff --git a/go.sum b/go.sum index c9580c5..04e3504 100644 --- a/go.sum +++ b/go.sum @@ -300,8 +300,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q= github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= -github.com/pubgo/dix v0.3.15 h1:DLjXfnyhcxT3skM1pZi60i/QgnUEg9nM6CI8wom7gVc= -github.com/pubgo/dix v0.3.15/go.mod h1:0j+i8YYn4vJnsJQCsyHXUGovR+Mgkh3uZPRhacw09us= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= diff --git a/monster/monster.go b/monster/monster.go index 1d9714d..0febca4 100644 --- a/monster/monster.go +++ b/monster/monster.go @@ -69,7 +69,7 @@ func (m *Monster) VisitAll(fn func(*Entry)) { } } -func AddFunc(name string, get Getter, set Setter, usage string, tags ...map[string]any) { +func Register(name string, get Getter, set Setter, usage string, tags ...map[string]any) { defaultMonster.AddFunc(name, get, set, usage, tags...) } diff --git a/stack/stack.go b/stack/stack.go index 0958696..4a560cf 100644 --- a/stack/stack.go +++ b/stack/stack.go @@ -43,6 +43,8 @@ func (f *Frame) IsRuntime() bool { func GetGORoot() string { return goRoot } +// Caller returns the Frame of the caller. +// skip: skip frames, 0 means the current call, 1 means the parent call func Caller(skip int) *Frame { var pcs [1]uintptr n := runtime.Callers(skip+2, pcs[:]) @@ -53,6 +55,7 @@ func Caller(skip int) *Frame { return stack(pcs[0] - 1) } +// Callers returns the Frame of the callers. func Callers(depth int, skips ...int) []*Frame { skip := 0 if len(skips) > 0 { @@ -80,6 +83,8 @@ func CallerWithType(typ reflect.Type) *Frame { return &Frame{Pkg: typ.PkgPath(), Name: typ.Name(), File: typ.PkgPath()} } +// CallerWithFunc returns the Frame of the caller. +// fn: function func CallerWithFunc(fn interface{}) *Frame { if fn == nil { panic("[fn] param is nil") diff --git a/v2/result/util.go b/v2/result/util.go index b415d01..a76fff8 100644 --- a/v2/result/util.go +++ b/v2/result/util.go @@ -2,14 +2,13 @@ package result import ( "context" + "encoding/base64" "fmt" "log/slog" "reflect" "runtime/debug" "strings" - "sync" - "github.com/k0kubun/pp/v3" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" @@ -268,23 +267,24 @@ func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog. log.Error(ctx). Func(func(e *zerolog.Event) { e.Str(logfields.Module, "result2") - e.Str(logfields.ErrorStack, string(debug.Stack())) + e.Str(logfields.ErrorStack, base64.StdEncoding.EncodeToString(debug.Stack())) e.Str(logfields.ErrorID, errors.GetErrorId(err)) - + e.Str(zerolog.ErrorFieldName, err.Error()) + e.CallerSkipFrame(2 + skip) + }). + Func(func(e *zerolog.Event) { for _, fn := range events { fn(e) } }). - Str(zerolog.ErrorFieldName, err.Error()). - CallerSkipFrame(2+skip). Msgf("%s\n%s", err.Error(), prototext.Format(errors.ParseErrToPb(err))) } -var pretty = sync.OnceValue(func() *pp.PrettyPrinter { - printer := pp.New() - printer.SetColoringEnabled(false) - printer.SetExportedOnly(false) - printer.SetOmitEmpty(true) - printer.SetMaxDepth(5) - return printer -}) +//var pretty = sync.OnceValue(func() *pp.PrettyPrinter { +// printer := pp.New() +// printer.SetColoringEnabled(false) +// printer.SetExportedOnly(false) +// printer.SetOmitEmpty(true) +// printer.SetMaxDepth(5) +// return printer +//}) From bb06e00165a29cf56078538f5753cb7a8e8d27d9 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 8 Oct 2025 20:59:35 +0800 Subject: [PATCH 32/43] chore: quick update fix/version at 2025-10-08 20:59:34 --- config/config.go | 7 +++++- config/types.go | 3 ++- config/util.go | 9 ++----- version/.version | 1 + version/version.go | 59 ++++------------------------------------------ 5 files changed, 16 insertions(+), 63 deletions(-) create mode 100644 version/.version diff --git a/config/config.go b/config/config.go index 26f19d2..f6fc165 100644 --- a/config/config.go +++ b/config/config.go @@ -3,7 +3,6 @@ package config import ( "bytes" "fmt" - "github.com/pubgo/funk/v2/result" "os" "path/filepath" "reflect" @@ -21,6 +20,7 @@ import ( "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" "github.com/pubgo/funk/v2/typex" "github.com/pubgo/funk/v2/vars" ) @@ -47,6 +47,11 @@ func init() { }) } +func SetConfigPath(confPath string) { + assert.If(confPath == "", "config path is null") + configPath = confPath +} + func GetConfigData(cfgPath string) (_ []byte, gErr error) { var configBytes []byte defer result.RecoveryErr(&gErr, func(err error) error { diff --git a/config/types.go b/config/types.go index c5d52ec..2f5efe1 100644 --- a/config/types.go +++ b/config/types.go @@ -4,8 +4,9 @@ import ( "encoding/base64" "encoding/json" - "github.com/pubgo/funk/v2/log" "gopkg.in/yaml.v3" + + "github.com/pubgo/funk/v2/log" ) var ( diff --git a/config/util.go b/config/util.go index f993853..2c19e6a 100644 --- a/config/util.go +++ b/config/util.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/base64" "fmt" - "github.com/pubgo/funk/v2/result" "io" "io/fs" "os" @@ -23,6 +22,7 @@ import ( "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/result" ) func GetConfigDir() string { @@ -76,11 +76,6 @@ func getPathList() (paths []string) { return } -func SetConfigPath(confPath string) { - assert.If(confPath == "", "config path is null") - configPath = confPath -} - func MergeR[A any, B any | *any](dst *A, src ...B) (r result.Result[*A]) { if len(src) == 0 { return r.WithValue(dst) @@ -206,7 +201,7 @@ func listAllPath(dirOrPath string) (ret result.Result[[]string]) { } func makeList(typ reflect.Type, data []reflect.Value) reflect.Value { - val := reflect.MakeSlice(reflect.SliceOf(typ), 0, 0) + val := reflect.MakeSlice(reflect.SliceOf(typ), 0, len(data)) return reflect.Append(val, data...) } diff --git a/version/.version b/version/.version new file mode 100644 index 0000000..6eaf894 --- /dev/null +++ b/version/.version @@ -0,0 +1 @@ +v2.0.0 \ No newline at end of file diff --git a/version/version.go b/version/version.go index a5f89d5..e37ce17 100644 --- a/version/version.go +++ b/version/version.go @@ -1,61 +1,12 @@ package version import ( - "runtime/debug" - "strings" + _ "embed" ) -var mainPath string +//go:embed .version +var version string -// git rev-parse HEAD -// git describe --always --abbrev=7 --dirty -var ( - commitID string - buildTime string -) - -// git describe --tags --abbrev=0 -// git tag --sort=committerdate | tail -n 1 -var ( - version = "v0.0.1-dev-99" - project = "project" -) - -var ( - modified bool - os string - arch string - buildTags []string -) - -func init() { - bi, ok := debug.ReadBuildInfo() - if !ok { - return - } - - mainPath = bi.Main.Path - if v := bi.Main.Version; v != "" { - version = v - } +func ReleaseVersion() string { return version } - for i := range bi.Settings { - setting := bi.Settings[i] - switch setting.Key { - case "vcs.revision": - commitID = setting.Value - case "vcs.time": - buildTime = setting.Value - case "vcs.modified": - modified = setting.Value == "true" - case "GOOS": - os = setting.Value - case "GOARCH": - arch = setting.Value - case "-tags": - if setting.Value != "" { - buildTags = strings.Split(setting.Value, ",") - } - } - } -} +func ReleaseDate() string { return "2025-10-08" } From 5003f5dd2b29f9b0901b223fc0fb9c15d15f1918 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 8 Oct 2025 22:31:50 +0800 Subject: [PATCH 33/43] chore: quick update fix/version at 2025-10-08 23:20:37 --- .version | 1 - buildinfo/version.go | 61 ++++++ cmds/go.mod | 40 ++++ cmds/go.sum | 36 ++++ cmds/testmain/main.go | 7 +- cmds/versioncmd/cmd.go | 4 +- component/cloudevent/client.go | 6 +- component/go.mod | 47 ++++ component/go.sum | 44 ++++ config/config.go | 10 + config/configs/assets/assets.yaml | 1 + config/util.go | 11 - env/env.go | 20 +- errors/errutil/util.go | 80 ++----- funk.go | 31 ++- generic/util.go | 5 +- go.mod | 26 +-- go.sum | 90 -------- go.work | 7 + go.work.sum | 336 +++++++++++++++++++++++++++++ log/global.go | 11 +- migrates/entmigrates/migrate.go | 15 +- proto/commonpb/page.pb.go | 9 +- proto/commonpb/page.proto | 2 +- proto/commonpb/request-info.pb.go | 8 +- proto/commonpb/request-info.proto | 2 +- proto/commonpb/resource.pb.enum.go | 2 +- proto/commonpb/resource.pb.go | 8 +- proto/commonpb/resource.proto | 2 +- proto/commonpb/response.pb.go | 8 +- proto/commonpb/response.proto | 2 +- proto/errorpb/code.pb.enum.go | 2 +- proto/errorpb/code.pb.go | 8 +- proto/errorpb/code.proto | 4 +- proto/errorpb/errors.pb.go | 149 ++++--------- proto/errorpb/errors.proto | 10 +- proto/errorpb/options.pb.go | 13 +- proto/errorpb/options.proto | 5 +- proto/testcodepb/test.pb.enum.go | 2 +- proto/testcodepb/test.pb.go | 10 +- proto/testcodepb/test.proto | 2 +- result/future.go | 21 +- result/future_test.go | 65 ++++++ result/interface.go | 8 +- result/result_test.go | 20 +- result/resultchecker/checker.go | 10 +- running/runtime.go | 15 +- running/util.go | 22 +- shutil/shell.go | 15 +- version/export.go | 21 -- 50 files changed, 868 insertions(+), 466 deletions(-) delete mode 100644 .version create mode 100644 buildinfo/version.go create mode 100644 cmds/go.mod create mode 100644 cmds/go.sum create mode 100644 component/go.mod create mode 100644 component/go.sum create mode 100644 go.work create mode 100644 go.work.sum create mode 100644 result/future_test.go delete mode 100644 version/export.go diff --git a/.version b/.version deleted file mode 100644 index a1b3dc7..0000000 --- a/.version +++ /dev/null @@ -1 +0,0 @@ -v0.5.69 \ No newline at end of file diff --git a/buildinfo/version.go b/buildinfo/version.go new file mode 100644 index 0000000..2898052 --- /dev/null +++ b/buildinfo/version.go @@ -0,0 +1,61 @@ +package buildinfo + +import ( + "github.com/samber/lo" + "runtime/debug" + "strings" +) + +func CommitID() string { return commitID } +func MainPath() string { return mainPath } +func Version() string { return version } +func BuildTime() string { return buildTime } +func Project() string { return project } +func Domain() string { return domain } + +var domain string +var mainPath string + +// git rev-parse HEAD +// git describe --always --abbrev=7 --dirty +var ( + commitID string + buildTime string +) + +// git describe --tags --abbrev=0 +// git tag --sort=committerdate | tail -n 1 +var ( + version string + project string +) + +func init() { + bi, ok := debug.ReadBuildInfo() + if !ok { + return + } + + mainPath = bi.Main.Path + if project == "" { + project = lo.LastOrEmpty(strings.Split(mainPath, "/")) + } + + if version == "" { + version = bi.Main.Version + } + + if version == "" { + version = "v0.0.1-dev-99" + } + + for i := range bi.Settings { + setting := bi.Settings[i] + switch setting.Key { + case "vcs.revision": + commitID = setting.Value + case "vcs.time": + buildTime = setting.Value + } + } +} diff --git a/cmds/go.mod b/cmds/go.mod new file mode 100644 index 0000000..2bae87e --- /dev/null +++ b/cmds/go.mod @@ -0,0 +1,40 @@ +module github.com/pubgo/funk/v2/cmds + +go 1.23.0 + +replace github.com/pubgo/funk/v2 => ../ + +replace github.com/pubgo/funk/v2/component => ../component + +require ( + entgo.io/ent v0.13.1 + github.com/dave/jennifer v1.7.0 + github.com/iancoleman/strcase v0.2.0 + github.com/moby/term v0.5.0 + github.com/samber/lo v1.51.0 + github.com/urfave/cli/v3 v3.4.1 + google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + ariga.io/atlas v0.21.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect + github.com/agext/levenshtein v1.2.1 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/hcl/v2 v2.13.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/zclconf/go-cty v1.8.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.33.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect +) diff --git a/cmds/go.sum b/cmds/go.sum new file mode 100644 index 0000000..2c8193e --- /dev/null +++ b/cmds/go.sum @@ -0,0 +1,36 @@ +ariga.io/atlas v0.21.1 h1:Eg9XYhKTH3UHoqP7tKMWFV+Z5JnpVOJCgO3MHrUtKmk= +entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= +github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= +github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/cmds/testmain/main.go b/cmds/testmain/main.go index ed7054d..ad8ff8e 100644 --- a/cmds/testmain/main.go +++ b/cmds/testmain/main.go @@ -7,12 +7,13 @@ import ( "sort" "github.com/moby/term" + "github.com/urfave/cli/v3" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/cliutils" "github.com/pubgo/funk/v2/cmds/versioncmd" "github.com/pubgo/funk/v2/ctxutil" - "github.com/pubgo/funk/v2/version" - "github.com/urfave/cli/v3" ) func main() { @@ -21,7 +22,7 @@ func main() { Suggest: true, UseShortOptionHandling: true, ShellComplete: cli.DefaultAppComplete, - Version: version.Version(), + Version: buildinfo.Version(), Commands: []*cli.Command{ versioncmd.New(), }, diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index f14713b..e855c03 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -6,16 +6,16 @@ import ( "github.com/urfave/cli/v3" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/running" - "github.com/pubgo/funk/v2/version" ) func New() *cli.Command { return &cli.Command{ Name: "version", - Usage: fmt.Sprintf("%s version info", version.Project()), + Usage: fmt.Sprintf("%s version info", buildinfo.Project()), Commands: []*cli.Command{ { Name: "validate", diff --git a/component/cloudevent/client.go b/component/cloudevent/client.go index 1b5e93c..6d9e2f4 100644 --- a/component/cloudevent/client.go +++ b/component/cloudevent/client.go @@ -12,6 +12,7 @@ import ( "github.com/nats-io/nats.go/jetstream" ants "github.com/panjf2000/ants/v2" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/component/lifecycle" "github.com/pubgo/funk/v2/component/natsclient" "github.com/pubgo/funk/v2/errors" @@ -23,7 +24,6 @@ import ( "github.com/pubgo/funk/v2/stack" "github.com/pubgo/funk/v2/try" "github.com/pubgo/funk/v2/typex" - "github.com/pubgo/funk/v2/version" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/proto" @@ -85,7 +85,7 @@ func (c *Client) initStream() (r error) { // add subject prefix streamSubjects := lo.Map(cfg.Subjects, func(item string, index int) string { return c.subjectName(item) }) - metadata := map[string]string{"creator": fmt.Sprintf("%s/%s/%s", version.Project(), version.Version(), running.InstanceID)} + metadata := map[string]string{"creator": fmt.Sprintf("%s/%s/%s", buildinfo.Project(), buildinfo.Version(), running.InstanceID)} storageType := getStorageType(cfg.Storage) streamCfg := jetstream.StreamConfig{ Name: streamName, @@ -137,7 +137,7 @@ func (c *Client) initConsumer() (r error) { // A streaming consumer can only have one corresponding job handler assert.If(c.consumers[streamName][consumerName] != nil, "consumer %s already exists", consumerName) - metadata := map[string]string{"version": fmt.Sprintf("%s/%s", version.Project(), version.Version())} + metadata := map[string]string{"version": fmt.Sprintf("%s/%s", buildinfo.Project(), buildinfo.Version())} consumerCfg := jetstream.ConsumerConfig{ Name: consumerName, Durable: consumerName, diff --git a/component/go.mod b/component/go.mod new file mode 100644 index 0000000..eec2cbf --- /dev/null +++ b/component/go.mod @@ -0,0 +1,47 @@ +module github.com/pubgo/funk/v2/component + +go 1.23.0 + +replace github.com/pubgo/funk/v2 => ../ + +require ( + github.com/DATA-DOG/go-sqlmock v1.5.2 + github.com/deckarep/golang-set/v2 v2.6.0 + github.com/rs/xid v1.5.0 + github.com/rs/zerolog v1.33.0 + github.com/samber/lo v1.51.0 + github.com/stretchr/testify v1.10.0 + github.com/tidwall/match v1.1.1 + go.etcd.io/bbolt v1.3.7 + google.golang.org/grpc v1.66.1 + google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + gopkg.in/yaml.v3 v3.0.1 + gorm.io/driver/postgres v1.4.1 + gorm.io/gorm v1.24.5 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect +) diff --git a/component/go.sum b/component/go.sum new file mode 100644 index 0000000..c3c20fd --- /dev/null +++ b/component/go.sum @@ -0,0 +1,44 @@ +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= +google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= +google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= +gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= diff --git a/config/config.go b/config/config.go index f6fc165..abfc29e 100644 --- a/config/config.go +++ b/config/config.go @@ -47,6 +47,12 @@ func init() { }) } +func GetConfigDir() string { + return configDir +} +func GetConfigPath() string { + return configPath +} func SetConfigPath(confPath string) { assert.If(confPath == "", "config path is null") configPath = confPath @@ -88,6 +94,10 @@ func loadEnvConfigMap(cfgPath string) EnvSpecMap { pathList := listAllPath(envPath).Expect("failed to list env config path: %s", envPath) for _, p := range pathList { + if !strings.HasSuffix(p, "."+defaultConfigType) { + continue + } + envConfigBytes := result.Wrap(os.ReadFile(p)). Map(bytes.TrimSpace). Must(func(e *zerolog.Event) { diff --git a/config/configs/assets/assets.yaml b/config/configs/assets/assets.yaml index 83c7727..bdff3f0 100644 --- a/config/configs/assets/assets.yaml +++ b/config/configs/assets/assets.yaml @@ -3,3 +3,4 @@ assets: test_abc: secret: ${{embed("test.md")}} path_dir: ${{config_dir()}} + env_var: ${{env.TEST_ABC}} diff --git a/config/util.go b/config/util.go index 2c19e6a..83ee467 100644 --- a/config/util.go +++ b/config/util.go @@ -25,14 +25,6 @@ import ( "github.com/pubgo/funk/v2/result" ) -func GetConfigDir() string { - return configDir -} - -func GetConfigPath() string { - return configPath -} - func getConfigPath(name, typ string, configDir ...string) (string, string) { if len(configDir) == 0 { configDir = append(configDir, "./", defaultConfigPath) @@ -221,9 +213,6 @@ func RegisterExpr(name string, expr any) { func getEnvData(cfg *config) map[string]any { exprEnv := map[string]any{ "env": env.Map(), - "get_path_dir": func() string { - return cfg.workDir - }, "config_dir": func() string { return cfg.workDir }, diff --git a/env/env.go b/env/env.go index a1481a5..8775b6d 100644 --- a/env/env.go +++ b/env/env.go @@ -2,7 +2,6 @@ package env import ( "fmt" - result2 "github.com/pubgo/funk/v2/result" "log/slog" "os" "strconv" @@ -16,10 +15,11 @@ import ( "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/result" ) -func Set(key, value string) result2.Error { - return result2.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { +func Set(key, value string) result.Error { + return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str("value", value) e.Str(logfields.Msg, "env_set_error") @@ -108,8 +108,8 @@ func GetFloat(names ...string) float64 { func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } -func Delete(key string) result2.Error { - return result2.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { +func Delete(key string) result.Error { + return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str(logfields.Msg, "env_delete_error") }) @@ -117,8 +117,8 @@ func Delete(key string) result2.Error { func MustDelete(key string) { Delete(key).Must() } -func Expand(value string) result2.Result[string] { - return result2.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { +func Expand(value string) result.Result[string] { + return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { e.Str("value", value) e.Str(logfields.Msg, "env_expand_error") }) @@ -141,19 +141,19 @@ func Key(key string) string { return keyHandler(key) } -func LoadFiles(files ...string) (r result2.Error) { +func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) if len(files) == 0 { return } for _, file := range files { - data := result2.Wrap(os.ReadFile(file)).Unwrap(&r) + data := result.Wrap(os.ReadFile(file)).Unwrap(&r) if r.IsErr() { return } - dataMap := result2.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) if r.IsErr() { return } diff --git a/errors/errutil/util.go b/errors/errutil/util.go index 0aa61be..dd66465 100644 --- a/errors/errutil/util.go +++ b/errors/errutil/util.go @@ -13,12 +13,12 @@ import ( "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/anypb" + "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/version" ) func Json(err error) []byte { @@ -173,22 +173,18 @@ func GrpcCodeToHTTP(code codes.Code) int { } // ConvertErr2Status 内部转换,为了让err=nil的时候,监控数据里有OK信息 -func ConvertErr2Status(err *errorpb.Error) *status.Status { - if generic.IsNil(err) { +func ConvertErr2Status(errCode *errorpb.ErrCode) *status.Status { + if funk.IsNil(errCode) { return status.New(codes.OK, "OK") } - if err.Code == nil { - return status.New(codes.OK, "OK") + if (errCode.Name != "" || errCode.Code != 0) && errCode.StatusCode == 0 { + errCode.StatusCode = errorpb.Code_Internal } - if (err.Code.Name != "" || err.Code.Code != 0) && err.Code.StatusCode == 0 { - err.Code.StatusCode = errorpb.Code_Internal - } - - st := status.New(codes.Code(err.Code.StatusCode), err.Msg.Msg) - if st1, err1 := st.WithDetails(err); err1 != nil { - log.Err(err1).Any("lava-error", err).Msg("failed to convert error to grpc status") + st := status.New(codes.Code(errCode.StatusCode), errCode.Message) + if st1, err1 := st.WithDetails(errCode); err1 != nil { + log.Err(err1).Any("lava-error", errCode).Msg("failed to convert error to grpc status") return st } else { return st1 @@ -197,7 +193,7 @@ func ConvertErr2Status(err *errorpb.Error) *status.Status { // ParseError try to convert an error to *Error. // It supports wrapped errors. -func ParseError(err error) *errorpb.Error { +func ParseError(err error) *errorpb.ErrCode { if err == nil { return nil } @@ -211,27 +207,17 @@ func ParseError(err error) *errorpb.Error { details := gs.GRPCStatus().Details() if len(details) > 0 && details[0] != nil { - if e, ok := details[0].(*errorpb.Error); ok && e != nil { + if e, ok := details[0].(*errorpb.ErrCode); ok && e != nil { return e } } - return &errorpb.Error{ - Code: &errorpb.ErrCode{ - Message: gs.GRPCStatus().Message(), - StatusCode: errorpb.Code(gs.GRPCStatus().Code()), - Code: int32(GrpcCodeToHTTP(gs.GRPCStatus().Code())), - Name: "lava.grpc.status", - Details: gs.GRPCStatus().Proto().Details, - }, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", gs.GRPCStatus().Details()), - }, + return &errorpb.ErrCode{ + Message: gs.GRPCStatus().Message(), + StatusCode: errorpb.Code(gs.GRPCStatus().Code()), + Code: int32(GrpcCodeToHTTP(gs.GRPCStatus().Code())), + Name: "lava.grpc.status", + Details: gs.GRPCStatus().Proto().Details, } } @@ -242,34 +228,14 @@ func ParseError(err error) *errorpb.Error { pb.Message = err.Error() } - return &errorpb.Error{ - Code: pb, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", err), - }, - } + return pb } - return &errorpb.Error{ - Code: &errorpb.ErrCode{ - Message: err.Error(), - StatusCode: errorpb.Code_Unknown, - Code: 500, - Name: "lava.error.unknown", - Details: []*anypb.Any{errors.MustProtoToAny(errors.ParseErrToPb(err))}, - }, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", err), - }, + return &errorpb.ErrCode{ + Message: err.Error(), + StatusCode: errorpb.Code_Unknown, + Code: 500, + Name: "lava.error.unknown", + Details: []*anypb.Any{errors.MustProtoToAny(errors.ParseErrToPb(err))}, } } diff --git a/funk.go b/funk.go index dee96da..0350093 100644 --- a/funk.go +++ b/funk.go @@ -1,21 +1,11 @@ package funk import ( - _ "embed" - + "cmp" "reflect" "unsafe" - - "golang.org/x/exp/constraints" ) -//go:embed .version -var version string - -func GetReleaseVersion() string { - return version -} - func AppendOf[T any](v T, vv ...T) []T { return append(append(make([]T, 0, len(vv)+1), v), vv...) } @@ -81,8 +71,8 @@ func Map[T, V any](data []T, handle func(i int, d T) V) []V { return vv } -// Contains returns whether `vs` contains the element `e` by comparing vs[i] == e. -func Contains[T comparable](vs []T, e T) bool { +// Contain returns whether `vs` contains the element `e` by comparing vs[i] == e. +func Contain[T comparable](vs []T, e T) bool { for _, v := range vs { if v == e { return true @@ -129,7 +119,7 @@ func DeleteAll[T comparable](set []T, value T) []T { } // Max returns the max of the 2 passed values. -func Max[T constraints.Ordered](a, b T) (r T) { +func Max[T cmp.Ordered](a, b T) (r T) { if a < b { r = b } else { @@ -140,7 +130,7 @@ func Max[T constraints.Ordered](a, b T) (r T) { } // Min returns the min of the 2 passed values. -func Min[T constraints.Ordered](a, b T) (r T) { +func Min[T cmp.Ordered](a, b T) (r T) { if a < b { r = a } else { @@ -173,11 +163,18 @@ func IsNil(err interface{}) bool { } } -func Init(fn func()) error { +func Init(fn func()) Void { fn() - return nil + return Void{} } func DoFunc[T any](fn func() T) T { return fn() } + +func DoSelf[T any](t T, fn func(t T)) T { + fn(t) + return t +} + +type Void struct{} diff --git a/generic/util.go b/generic/util.go index c044898..6b66630 100644 --- a/generic/util.go +++ b/generic/util.go @@ -157,7 +157,4 @@ func IsNil(err interface{}) bool { return funk.IsNil(err) } -func Init(fn func()) any { - fn() - return nil -} +func Init(fn func()) funk.Void { return funk.Init(fn) } diff --git a/go.mod b/go.mod index 796d7bf..29367ac 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.23.0 require ( dario.cat/mergo v1.0.0 entgo.io/ent v0.13.1 - github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/a8m/envsubst v1.4.2 github.com/bradleyjkemp/memviz v0.2.3 github.com/dave/jennifer v1.7.0 @@ -25,10 +24,7 @@ require ( github.com/mattn/go-isatty v0.0.20 github.com/mattn/go-sqlite3 v1.14.16 github.com/mitchellh/mapstructure v1.5.0 - github.com/moby/term v0.5.0 - github.com/nats-io/nats.go v1.37.0 github.com/open2b/scriggo v0.56.1 - github.com/panjf2000/ants/v2 v2.10.0 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/phuslu/goid v1.0.0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 @@ -40,12 +36,9 @@ require ( github.com/testcontainers/testcontainers-go v0.30.0 github.com/testcontainers/testcontainers-go/modules/postgres v0.30.0 github.com/tidwall/gjson v1.17.1 - github.com/tidwall/match v1.1.1 github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fastrand v1.1.0 github.com/valyala/fasttemplate v1.2.2 - go.etcd.io/bbolt v1.3.7 - go.etcd.io/etcd/client/v3 v3.5.9 go.uber.org/atomic v1.10.0 golang.org/x/crypto v0.38.0 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb @@ -56,10 +49,7 @@ require ( google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/mysql v1.4.5 gorm.io/driver/postgres v1.4.1 - gorm.io/driver/sqlite v1.4.4 - gorm.io/gen v0.3.21 gorm.io/gorm v1.24.5 modernc.org/sqlite v1.18.0 ) @@ -67,6 +57,7 @@ require ( require ( ariga.io/atlas v0.21.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/agext/levenshtein v1.2.1 // indirect @@ -74,8 +65,6 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/containerd/containerd v1.7.12 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -87,9 +76,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/inflect v0.19.0 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.13.0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect @@ -113,9 +100,8 @@ require ( github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -126,14 +112,13 @@ require ( github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/zclconf/go-cty v1.8.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.26.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect @@ -141,16 +126,11 @@ require ( go.opentelemetry.io/otel/sdk v1.26.0 // indirect go.opentelemetry.io/otel/trace v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.17.0 // indirect golang.org/x/mod v0.25.0 // indirect golang.org/x/net v0.40.0 // indirect golang.org/x/sync v0.15.0 // indirect golang.org/x/tools v0.33.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect - gorm.io/datatypes v1.0.7 // indirect - gorm.io/hints v1.1.0 // indirect - gorm.io/plugin/dbresolver v1.3.0 // indirect lukechampine.com/uint128 v1.1.1 // indirect modernc.org/cc/v3 v3.36.0 // indirect modernc.org/ccgo/v3 v3.16.6 // indirect diff --git a/go.sum b/go.sum index b74c6a4..f728678 100644 --- a/go.sum +++ b/go.sum @@ -6,9 +6,6 @@ entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= entgo.io/ent v0.13.1/go.mod h1:qCEmo+biw3ccBn9OyL4ZK5dfpwg++l1Gxwac5B1206A= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -38,11 +35,8 @@ github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMP github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= @@ -57,12 +51,8 @@ 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= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/denisenkom/go-mssqldb v0.12.2 h1:1OcPn5GBIobjWNd+8yjfHNIaFX14B1pWI3F9HZy5KXw= -github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -88,9 +78,6 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -99,16 +86,8 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -121,7 +100,6 @@ 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/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -148,7 +126,6 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= @@ -167,7 +144,6 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= @@ -178,7 +154,6 @@ github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01C github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= @@ -186,7 +161,6 @@ github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= @@ -195,13 +169,11 @@ github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiw github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -250,10 +222,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ 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-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= @@ -268,28 +236,18 @@ github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/open2b/scriggo v0.56.1 h1:h3IVNM0OEvszbtdmukaJj9lPo/xSvHPclYm/RqQqUxY= github.com/open2b/scriggo v0.56.1/go.mod h1:FJS0k7CaKq2sNlrqAGMwU4dCltYqC1c+Eak3dj5w26Q= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -346,7 +304,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -381,14 +338,6 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= @@ -409,32 +358,24 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= @@ -456,14 +397,12 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -543,43 +482,14 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY= -gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/mysql v1.4.5 h1:u1lytId4+o9dDaNcPCFzNv7h6wvmc92UjNk3z8enSBU= -gorm.io/driver/mysql v1.4.5/go.mod h1:SxzItlnT1cb6e1e4ZRpgJN2VYtcqJgqnHxWr4wsP8oc= -gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw= gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= gorm.io/driver/postgres v1.4.1/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= -gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= -gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= -gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= -gorm.io/driver/sqlserver v1.4.0 h1:3fjbsNkr/YqocSBW5CP16Lq6+APjRrWMzu7NbkXr9QU= -gorm.io/driver/sqlserver v1.4.0/go.mod h1:P8BSbBwkdzXURYx3pWUSEAABRQU0vxbd6xk5+53pg7g= -gorm.io/gen v0.3.21 h1:t8329wT4tW1ZZWOm7vn4LV6OIrz8a5zCg+p78ezt+rA= -gorm.io/gen v0.3.21/go.mod h1:aWgvoKdG9f8Des4TegSa0N5a+gwhGsFo0JJMaLwokvk= -gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= -gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= -gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M= -gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/go.work b/go.work new file mode 100644 index 0000000..033a449 --- /dev/null +++ b/go.work @@ -0,0 +1,7 @@ +go 1.23.0 + +use ( + . + ./cmds + ./component +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..6f9bae5 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,336 @@ +cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0 h1:lhSJz9RMbJcTgxifR1hUNJnn6CNYtbgEDtQV22/9RBA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0 h1:OYa9vmRX2XC5GXRAzeggG12sF/z5D9Ahtdm9EJ00WN4= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0 h1:v9p9TfTbf7AwNb5NYQt7hI41IfPoLFiFkLtb+bmGjT0= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/container-orchestrated-devices/container-device-interface v0.6.1 h1:mz77uJoP8im/4Zins+mPqt677ZMaflhoGaYrRAl5jvA= +github.com/container-orchestrated-devices/container-device-interface v0.6.1/go.mod h1:40T6oW59rFrL/ksiSs7q45GzjGlbvxnA4xaK6cyq+kA= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.1.7 h1:WSf9o9EQ0KGHiUx2ESFZ+PKf4nxK9BcvV/nJDX8RkB4= +github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= +github.com/containerd/nri v0.4.0 h1:PjgIBm0RtUiFyEO6JqPBQZRQicbsIz41Fz/5VSC0zgw= +github.com/containerd/nri v0.4.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP7mkPDoSfP9VU= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.6 h1:uoG52u2e91RE4UqmBICZY8dNshgfvkdl3BW6jnxiFaI= +github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1:1iy2qD6JEhHKKhUOA9IWs7mjco7lnw2qx8FsRI2wirE= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/docker/cli v23.0.3+incompatible h1:Zcse1DuDqBdgI7OQDV8Go7b83xLgfhW1eza4HfEdxpY= +github.com/docker/cli v23.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1:IgJPqnrlY2Mr4pYB6oaMKvFvwJ9H+X6CCY5x1vCTcpc= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= +github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/intel/goresctrl v0.3.0 h1:K2D3GOzihV7xSBedGxONSlaw/un1LZgWsc9IfqipN4c= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86 h1:D6paGObi5Wud7xg83MaEFyjxQB1W5bz5d0IFppr+ymk= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c h1:bY6ktFuJkt+ZXkX0RChQch2FtHpWQLVS8Qo1YasiIVk= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= +github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 h1:aSISeOcal5irEhJd1M+IrApc0PdcN7e7Aj4yuEnOrfQ= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vektah/gqlparser/v2 v2.4.5 h1:C02NsyEsL4TXJB7ndonqTfuQOL4XPIu0aAWugdmTgmc= +github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= +github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= +github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= +github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= +github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= +github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 h1:RsQi0qJ2imFfCvZabqzM9cNXBG8k6gXMv1A0cXRmH6A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= +k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.26.2 h1:Pk8lmX4G14hYqJd1poHGC08G03nIHVqdJMR0SD3IH3o= +k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/log/global.go b/log/global.go index 24817e7..b0ef54b 100644 --- a/log/global.go +++ b/log/global.go @@ -7,12 +7,13 @@ import ( "os" "time" + "github.com/rs/zerolog" + zlog "github.com/rs/zerolog/log" + + "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/generic" - - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" ) var ( @@ -36,7 +37,7 @@ var ( e.Discard() }) - _ = generic.Init(func() { + _ = funk.Init(func() { zerolog.SetGlobalLevel(zerolog.DebugLevel) zerolog.ErrorMarshalFunc = func(err error) any { if err == nil { @@ -65,7 +66,7 @@ var ( })).Hook(logGlobalHook), ) - _ = generic.Init(func() { + _ = funk.Init(func() { zlog.Logger = generic.FromPtr(stdZeroLog) }) diff --git a/migrates/entmigrates/migrate.go b/migrates/entmigrates/migrate.go index c04483c..b11f0a8 100644 --- a/migrates/entmigrates/migrate.go +++ b/migrates/entmigrates/migrate.go @@ -13,12 +13,6 @@ import ( "entgo.io/ent/dialect/sql/schema" "github.com/dave/jennifer/jen" mapset "github.com/deckarep/golang-set/v2" - "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/config" - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/generic" - "github.com/pubgo/funk/v2/log" - "github.com/pubgo/funk/v2/version" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/wait" @@ -26,6 +20,13 @@ import ( dp "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" ) type MigrationWrap struct { @@ -148,7 +149,7 @@ func %s() *entmigrates.Migration { DataMigrate: nil, } } -`, name, name, fmt.Sprint(now.String(), " ", version.Version()), name)) +`, name, name, fmt.Sprint(now.String(), " ", buildinfo.Version()), name)) filename = filepath.Join(g.config.MigrationPath, fmt.Sprintf("%s.go", name)) err = os.WriteFile(filename, []byte(genFile.GoString()), 0o644) diff --git a/proto/commonpb/page.pb.go b/proto/commonpb/page.pb.go index f5e0355..749a2e2 100644 --- a/proto/commonpb/page.pb.go +++ b/proto/commonpb/page.pb.go @@ -92,10 +92,11 @@ var file_commonpb_page_proto_rawDesc = []byte{ 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, + 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/proto/commonpb/page.proto b/proto/commonpb/page.proto index 6eaf062..8dd9791 100644 --- a/proto/commonpb/page.proto +++ b/proto/commonpb/page.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; message PageRequest { uint64 page_size = 1; diff --git a/proto/commonpb/request-info.pb.go b/proto/commonpb/request-info.pb.go index 5172e5f..6fdaa0f 100644 --- a/proto/commonpb/request-info.pb.go +++ b/proto/commonpb/request-info.pb.go @@ -24,11 +24,11 @@ var File_commonpb_request_info_proto protoreflect.FileDescriptor var file_commonpb_request_info_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, - 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var file_commonpb_request_info_proto_goTypes = []any{} diff --git a/proto/commonpb/request-info.proto b/proto/commonpb/request-info.proto index 72476c8..5bbac90 100644 --- a/proto/commonpb/request-info.proto +++ b/proto/commonpb/request-info.proto @@ -1,4 +1,4 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; \ No newline at end of file +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; \ No newline at end of file diff --git a/proto/commonpb/resource.pb.enum.go b/proto/commonpb/resource.pb.enum.go index f0d288e..5951478 100644 --- a/proto/commonpb/resource.pb.enum.go +++ b/proto/commonpb/resource.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/commonpb/resource.pb.go b/proto/commonpb/resource.pb.go index 8708d3f..659a1f1 100644 --- a/proto/commonpb/resource.pb.go +++ b/proto/commonpb/resource.pb.go @@ -158,11 +158,11 @@ var file_commonpb_resource_proto_rawDesc = []byte{ 0x65, 0x49, 0x64, 0x2a, 0x36, 0x0a, 0x0d, 0x56, 0x49, 0x53, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x42, 0x2f, 0x5a, 0x2d, 0x67, + 0x0a, 0x0a, 0x06, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, - 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/commonpb/resource.proto b/proto/commonpb/resource.proto index 974b933..f94759d 100644 --- a/proto/commonpb/resource.proto +++ b/proto/commonpb/resource.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; enum VISIABLE_MODE { // 默认Namespace可见 diff --git a/proto/commonpb/response.pb.go b/proto/commonpb/response.pb.go index 2b7c217..5f378b7 100644 --- a/proto/commonpb/response.pb.go +++ b/proto/commonpb/response.pb.go @@ -146,11 +146,11 @@ var file_commonpb_response_proto_rawDesc = []byte{ 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, - 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/commonpb/response.proto b/proto/commonpb/response.proto index a1f4a19..cf6eb26 100644 --- a/proto/commonpb/response.proto +++ b/proto/commonpb/response.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; import "google/protobuf/any.proto"; diff --git a/proto/errorpb/code.pb.enum.go b/proto/errorpb/code.pb.enum.go index fa03993..4c8a797 100644 --- a/proto/errorpb/code.pb.enum.go +++ b/proto/errorpb/code.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/errorpb/code.pb.go b/proto/errorpb/code.pb.go index 3113c86..f46a89a 100644 --- a/proto/errorpb/code.pb.go +++ b/proto/errorpb/code.pb.go @@ -139,10 +139,10 @@ var file_errorpb_code_proto_rawDesc = []byte{ 0x4c, 0x6f, 0x73, 0x73, 0x10, 0x0f, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x10, 0x11, - 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/errorpb/code.proto b/proto/errorpb/code.proto index 1b5f1f6..113ae23 100644 --- a/proto/errorpb/code.proto +++ b/proto/errorpb/code.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package errors; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; enum Code { OK = 0; @@ -23,4 +23,4 @@ enum Code { DataLoss = 15; Unauthenticated = 16; TooManyRequests = 17; -} \ No newline at end of file +} diff --git a/proto/errorpb/errors.pb.go b/proto/errorpb/errors.pb.go index ac6b552..e1450f6 100644 --- a/proto/errorpb/errors.pb.go +++ b/proto/errorpb/errors.pb.go @@ -167,7 +167,8 @@ type ErrCode struct { Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Error detail include request or other user defined information Details []*anypb.Any `protobuf:"bytes,5,rep,name=details,proto3" json:"details,omitempty"` - Id *string `protobuf:"bytes,6,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Error id, which can be used to trace error + Id *string `protobuf:"bytes,6,opt,name=id,proto3,oneof" json:"id,omitempty"` } func (x *ErrCode) Reset() { @@ -311,67 +312,6 @@ func (x *ErrTrace) GetVersion() string { return "" } -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code *ErrCode `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` - Trace *ErrTrace `protobuf:"bytes,2,opt,name=trace,proto3" json:"trace,omitempty"` - Msg *ErrMsg `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - mi := &file_errorpb_errors_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{4} -} - -func (x *Error) GetCode() *ErrCode { - if x != nil { - return x.Code - } - return nil -} - -func (x *Error) GetTrace() *ErrTrace { - if x != nil { - return x.Trace - } - return nil -} - -func (x *Error) GetMsg() *ErrMsg { - if x != nil { - return x.Msg - } - return nil -} - type ErrWrap struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -385,7 +325,7 @@ type ErrWrap struct { func (x *ErrWrap) Reset() { *x = ErrWrap{} - mi := &file_errorpb_errors_proto_msgTypes[5] + mi := &file_errorpb_errors_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -397,7 +337,7 @@ func (x *ErrWrap) String() string { func (*ErrWrap) ProtoMessage() {} func (x *ErrWrap) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[5] + mi := &file_errorpb_errors_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -410,7 +350,7 @@ func (x *ErrWrap) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrWrap.ProtoReflect.Descriptor instead. func (*ErrWrap) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{5} + return file_errorpb_errors_proto_rawDescGZIP(), []int{4} } func (x *ErrWrap) GetTags() map[string]string { @@ -484,30 +424,23 @@ var file_errorpb_errors_proto_rawDesc = []byte{ 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x76, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x2e, 0x45, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x26, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x54, 0x72, 0x61, 0x63, 0x65, - 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, - 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, - 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, - 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, - 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -522,33 +455,29 @@ func file_errorpb_errors_proto_rawDescGZIP() []byte { return file_errorpb_errors_proto_rawDescData } -var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_errorpb_errors_proto_goTypes = []any{ (*Tag)(nil), // 0: errors.Tag (*ErrMsg)(nil), // 1: errors.ErrMsg (*ErrCode)(nil), // 2: errors.ErrCode (*ErrTrace)(nil), // 3: errors.ErrTrace - (*Error)(nil), // 4: errors.Error - (*ErrWrap)(nil), // 5: errors.ErrWrap - nil, // 6: errors.ErrMsg.TagsEntry - nil, // 7: errors.ErrWrap.TagsEntry - (Code)(0), // 8: errors.Code - (*anypb.Any)(nil), // 9: google.protobuf.Any + (*ErrWrap)(nil), // 4: errors.ErrWrap + nil, // 5: errors.ErrMsg.TagsEntry + nil, // 6: errors.ErrWrap.TagsEntry + (Code)(0), // 7: errors.Code + (*anypb.Any)(nil), // 8: google.protobuf.Any } var file_errorpb_errors_proto_depIdxs = []int32{ - 6, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry - 8, // 1: errors.ErrCode.status_code:type_name -> errors.Code - 9, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any - 2, // 3: errors.Error.code:type_name -> errors.ErrCode - 3, // 4: errors.Error.trace:type_name -> errors.ErrTrace - 1, // 5: errors.Error.msg:type_name -> errors.ErrMsg - 7, // 6: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry - 9, // 7: errors.ErrWrap.error:type_name -> google.protobuf.Any - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 5, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry + 7, // 1: errors.ErrCode.status_code:type_name -> errors.Code + 8, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any + 6, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry + 8, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_errorpb_errors_proto_init() } @@ -565,7 +494,7 @@ func file_errorpb_errors_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_errorpb_errors_proto_rawDesc, NumEnums: 0, - NumMessages: 8, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/errorpb/errors.proto b/proto/errorpb/errors.proto index 0ae55a6..df6d1f6 100644 --- a/proto/errorpb/errors.proto +++ b/proto/errorpb/errors.proto @@ -5,7 +5,7 @@ package errors; import "errorpb/code.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Tag { string key = 1; @@ -36,6 +36,8 @@ message ErrCode { // Error detail include request or other user defined information repeated google.protobuf.Any details = 5; + + // Error id, which can be used to trace error optional string id = 6; } @@ -46,12 +48,6 @@ message ErrTrace { string version = 5; } -message Error { - ErrCode code = 1; - ErrTrace trace = 2; - ErrMsg msg = 3; -} - message ErrWrap { map tags = 1; string caller = 2; diff --git a/proto/errorpb/options.pb.go b/proto/errorpb/options.pb.go index 2908d6f..f24e357 100644 --- a/proto/errorpb/options.pb.go +++ b/proto/errorpb/options.pb.go @@ -179,9 +179,9 @@ var File_errorpb_options_proto protoreflect.FileDescriptor var file_errorpb_options_proto_rawDesc = []byte{ 0x0a, 0x15, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x12, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, + 0x12, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, @@ -202,10 +202,11 @@ var file_errorpb_options_proto_rawDesc = []byte{ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa1, 0x8d, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70, 0x74, 0x73, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70, 0x74, 0x73, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, - 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, - 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/proto/errorpb/options.proto b/proto/errorpb/options.proto index 6d89d6c..595f5a4 100644 --- a/proto/errorpb/options.proto +++ b/proto/errorpb/options.proto @@ -2,9 +2,10 @@ syntax = "proto3"; package errors; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; -import "google/protobuf/descriptor.proto"; import "errorpb/code.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Options { bool gen = 1; diff --git a/proto/testcodepb/test.pb.enum.go b/proto/testcodepb/test.pb.enum.go index c3072f6..939ad40 100644 --- a/proto/testcodepb/test.pb.enum.go +++ b/proto/testcodepb/test.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/testcodepb/test.pb.go b/proto/testcodepb/test.pb.go index 55d684f..8d7c8c1 100644 --- a/proto/testcodepb/test.pb.go +++ b/proto/testcodepb/test.pb.go @@ -846,11 +846,11 @@ var file_testcodepb_test_proto_rawDesc = []byte{ 0x31, 0x2e, 0x44, 0x6f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x1a, 0x11, 0xca, 0x41, 0x0e, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x42, 0x33, - 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, - 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x65, - 0x73, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x3b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x64, - 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x42, 0x36, + 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, + 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x3b, 0x74, 0x65, 0x73, 0x74, + 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/testcodepb/test.proto b/proto/testcodepb/test.proto index 5d8ae26..ef89128 100644 --- a/proto/testcodepb/test.proto +++ b/proto/testcodepb/test.proto @@ -9,7 +9,7 @@ import "google/api/client.proto"; import "google/api/httpbody.proto"; import "google/protobuf/empty.proto"; -option go_package = "github.com/pubgo/funk/proto/testcodepb;testcodepb"; +option go_package = "github.com/pubgo/funk/v2/proto/testcodepb;testcodepb"; enum Code { option (errors.opts).gen = true; diff --git a/result/future.go b/result/future.go index 4af99cd..fc3efd7 100644 --- a/result/future.go +++ b/result/future.go @@ -7,9 +7,9 @@ import ( "github.com/samber/lo" ) -func AsyncErr(fn func() Error) ErrFuture { +func AsyncErr(fn func() Error) *ErrFuture { if fn == nil { - return ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} + return &ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} } var future = newErrFuture() @@ -17,18 +17,21 @@ func AsyncErr(fn func() Error) ErrFuture { return future } -func Async[T any](fn func() Result[T]) Future[T] { +func Async[T any](fn func() Result[T]) *Future[T] { if fn == nil { - return Future[T]{v: Fail[T](errors.WrapCaller(errFnIsNil, 1))} + return &Future[T]{v: Fail[T](errors.WrapCaller(errFnIsNil, 1))} } var future = newFuture[T]() - go func() { defer future.close(); future.setVal(tryResult(fn)) }() + go func() { + defer future.close() + future.setVal(tryResult(fn)) + }() return future } -func newFuture[T any]() Future[T] { - return Future[T]{done: make(chan struct{})} +func newFuture[T any]() *Future[T] { + return &Future[T]{done: make(chan struct{})} } type Future[T any] struct { @@ -49,8 +52,8 @@ func (f *Future[T]) Await(ctxL ...context.Context) Result[T] { } } -func newErrFuture() ErrFuture { - return ErrFuture{done: make(chan struct{})} +func newErrFuture() *ErrFuture { + return &ErrFuture{done: make(chan struct{})} } type ErrFuture struct { diff --git a/result/future_test.go b/result/future_test.go new file mode 100644 index 0000000..3666fe9 --- /dev/null +++ b/result/future_test.go @@ -0,0 +1,65 @@ +package result_test + +import ( + "sync" + "testing" + "time" + + "github.com/pubgo/funk/v2/result" + "github.com/stretchr/testify/assert" +) + +func TestFuture_ConcurrentAwait(t *testing.T) { + future := result.Async(func() result.Result[int] { + time.Sleep(10 * time.Millisecond) + return result.OK(42) + }) + + var wg sync.WaitGroup + results := make([]result.Result[int], 10) + + // Start multiple goroutines waiting for the same future + for i := 0; i < 10; i++ { + wg.Add(1) + idx := i + go func() { + defer wg.Done() + results[idx] = future.Await() + }() + } + + wg.Wait() + + // All results should be the same + for _, r := range results { + assert.True(t, r.IsOK()) + assert.Equal(t, 42, r.GetValue()) + } +} + +func TestErrFuture_ConcurrentAwait(t *testing.T) { + future := result.AsyncErr(func() (r result.Error) { + time.Sleep(10 * time.Millisecond) + return r.WithErr(nil) + }) + + var wg sync.WaitGroup + results := make([]result.Error, 10) + + // Start multiple goroutines waiting for the same future + for i := 0; i < 10; i++ { + wg.Add(1) + idx := i + go func() { + defer wg.Done() + results[idx] = future.Await() + }() + } + + wg.Wait() + + // All results should be the same + for _, r := range results { + assert.True(t, r.IsOK()) + } +} diff --git a/result/interface.go b/result/interface.go index fd8e959..da96e39 100644 --- a/result/interface.go +++ b/result/interface.go @@ -1,6 +1,10 @@ package result -import "context" +import ( + "context" + + "github.com/pubgo/funk/v2" +) // Checkable defines types that can be checked for Ok/Error state type Checkable interface { @@ -24,3 +28,5 @@ type UnWrapper[T any] interface { UnwrapErr(setter *error, contexts ...context.Context) T Unwrap(setter ErrSetter, contexts ...context.Context) T } + +type Void = funk.Void diff --git a/result/result_test.go b/result/result_test.go index 5a3d0c8..62c625c 100644 --- a/result/result_test.go +++ b/result/result_test.go @@ -4,19 +4,19 @@ import ( "context" "encoding/json" "fmt" - result2 "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/v2/result/resultchecker" "testing" "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/result/resultchecker" ) func TestMust(t *testing.T) { defer recovery.Testing(t) - result2.Must(fmt.Errorf("test must")) + result.Must(fmt.Errorf("test must")) } type hello struct { @@ -26,7 +26,7 @@ type hello struct { func TestName(t *testing.T) { defer recovery.DebugPrint() ok := &hello{Name: "abc"} - okBytes := result2.Wrap(json.Marshal(&ok)) + okBytes := result.Wrap(json.Marshal(&ok)) data := string(okBytes.Expect("failed to encode json data")) t.Log(data) if data != `{"name":"abc"}` { @@ -36,7 +36,7 @@ func TestName(t *testing.T) { } func TestResultDo(t *testing.T) { - ok := result2.OK(&hello{Name: "abc"}) + ok := result.OK(&hello{Name: "abc"}) ok.Inspect(func(v *hello) { assert.If(v.Name != "abc", "not match") }).Inspect(func(v *hello) { @@ -51,13 +51,13 @@ func TestErrOf(t *testing.T) { var ctx = log.UpdateEventCtx(context.Background(), log.Map{"test": "ok"}) resultchecker.RegisterErrCheck(log.RecordErr()) - var err result2.Error + var err result.Error if fn1().Catch(&err, ctx) { errors.Debug(err.GetErr()) } } -func fn1() (r result2.Result[string]) { +func fn1() (r result.Result[string]) { if fn3().Catch(&r) { return } @@ -70,7 +70,7 @@ func fn1() (r result2.Result[string]) { return r.WithValue(val) } -func fn2() (r result2.Result[string]) { +func fn2() (r result.Result[string]) { fn3(). InspectErr(func(err error) { log.Err(err).Msg("test error") @@ -83,8 +83,8 @@ func fn2() (r result2.Result[string]) { return r.WithValue("ok") } -func fn3() result2.Error { - return result2.ErrOf(fmt.Errorf("error test, this is error")). +func fn3() result.Error { + return result.ErrOf(fmt.Errorf("error test, this is error")). InspectErr(func(err error) { log.Err(err).Msg("ddd") }). diff --git a/result/resultchecker/checker.go b/result/resultchecker/checker.go index b9dec84..4c6bbb9 100644 --- a/result/resultchecker/checker.go +++ b/result/resultchecker/checker.go @@ -2,8 +2,6 @@ package resultchecker import ( "context" - "reflect" - "github.com/pubgo/funk/v2/stack" ) @@ -14,9 +12,9 @@ func RegisterErrCheck(f ErrChecker) bool { return false } - var checkFrame = stack.CallerWithFunc(f) + var checkFrame = stack.CallerWithFunc(f).String() for _, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { + if checkFrame == stack.CallerWithFunc(errFunc).String() { return false } } @@ -36,10 +34,10 @@ func GetErrCheckStacks() []*stack.Frame { } func RemoveErrCheck(f func(context.Context, error) error) { - var checkFrame = stack.CallerWithFunc(f) + var checkFrame = stack.CallerWithFunc(f).String() var index = -1 for idx, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { + if checkFrame == stack.CallerWithFunc(errFunc).String() { index = idx break } diff --git a/running/runtime.go b/running/runtime.go index 717af69..fd46e97 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -8,19 +8,19 @@ import ( "github.com/rs/xid" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/env" "github.com/pubgo/funk/v2/monster" "github.com/pubgo/funk/v2/netutil" "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/funk/v2/strutil" - "github.com/pubgo/funk/v2/version" ) // default global variables var ( HttpPort = 8080 GrpcPort = 50051 - Project = version.Project() + Project = buildinfo.Project() Env = "debug" @@ -29,9 +29,9 @@ var ( DeviceID = InstanceID - Version = version.Version() + Version = buildinfo.Version() - CommitID = version.CommitID() + CommitID = buildinfo.CommitID() Pwd = assert.Exit1(os.Getwd()) @@ -57,19 +57,22 @@ var ( }, ) - Domain string + Domain = buildinfo.Domain() enableDebug = monster.Bool("debug", false, "enable debug") ) func Debug() bool { return enableDebug.Get() } +func EnableDebug() { + assert.Exit(enableDebug.Set(true)) +} func init() { if env.GetBool("enable_debug", "debug", "dev_mode") { assert.Exit(enableDebug.Set(true)) } - if e := env.Get("env", "run_mode", "run_env"); e != "" { + if e := env.Get("env", "run_env"); e != "" { Env = e } diff --git a/running/util.go b/running/util.go index 41ff5ee..2c16d85 100644 --- a/running/util.go +++ b/running/util.go @@ -7,17 +7,13 @@ import ( semver "github.com/hashicorp/go-version" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/recovery" - "github.com/pubgo/funk/v2/version" ) -func SetVersion(v string) { Version = v } -func SetProject(p string) { Project = p } -func SetDomain(d string) { Domain = d } - func GetSysInfo() map[string]string { return map[string]string{ - "main_path": version.MainPath(), + "main_path": buildinfo.MainPath(), "grpc_port": fmt.Sprintf("%v", GrpcPort), "http_post": fmt.Sprintf("%v", HttpPort), "debug": fmt.Sprintf("%v", Debug()), @@ -28,7 +24,7 @@ func GetSysInfo() map[string]string { "device_id": DeviceID, "project": Project, "hostname": Hostname, - "build_time": version.BuildTime(), + "build_time": buildinfo.BuildTime(), "version": Version, "domain": Domain, "commit_id": CommitID, @@ -43,15 +39,15 @@ func GetSysInfo() map[string]string { func CheckVersion() { defer recovery.Exit() + assert.If(buildinfo.Project() == "", "project is null") + assert.If(buildinfo.Version() == "", "version is null") + assert.If(buildinfo.CommitID() == "", "commitID is null") + assert.If(buildinfo.BuildTime() == "", "buildTime is null") assert.MustFn(func() error { - _, err := semver.NewVersion(version.Version()) + _, err := semver.NewVersion(buildinfo.Version()) if err != nil { - return fmt.Errorf("version(%s) error: %w", version.Version(), err) + return fmt.Errorf("version(%s) error: %w", buildinfo.Version(), err) } return nil }) - assert.If(version.Project() == "", "project is null") - assert.If(version.Version() == "", "version is null") - assert.If(version.CommitID() == "", "commitID is null") - assert.If(version.BuildTime() == "", "buildTime is null") } diff --git a/shutil/shell.go b/shutil/shell.go index f950ea2..291bd6d 100644 --- a/shutil/shell.go +++ b/shutil/shell.go @@ -3,35 +3,36 @@ package shutil import ( "bytes" "fmt" - result2 "github.com/pubgo/funk/v2/result" "os" "os/exec" "strings" - "github.com/pubgo/funk/v2/log/logfields" "github.com/rs/zerolog" + + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/result" ) -func Run(args ...string) (r result2.Result[string]) { - defer result2.Recovery(&r) +func Run(args ...string) (r result.Result[string]) { + defer result.Recovery(&r) b := bytes.NewBufferString("") cmd := Shell(args...) cmd.Stdout = b - result2.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { + result.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to execute: "+strings.Join(args, " "))) }) return r.WithValue(strings.TrimSpace(b.String())) } -func GoModGraph() result2.Result[string] { +func GoModGraph() result.Result[string] { return Run("go", "mod", "graph") } -func GoList() result2.Result[string] { +func GoList() result.Result[string] { return Run("go", "list", "./...") } diff --git a/version/export.go b/version/export.go deleted file mode 100644 index ec2aef4..0000000 --- a/version/export.go +++ /dev/null @@ -1,21 +0,0 @@ -package version - -func CommitID() string { - return commitID -} - -func MainPath() string { - return mainPath -} - -func Version() string { - return version -} - -func BuildTime() string { - return buildTime -} - -func Project() string { - return project -} From d138a1d85fec4aa00dabba72c01e34ce2ee03aeb Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 8 Oct 2025 22:31:50 +0800 Subject: [PATCH 34/43] chore: quick update fix/version at 2025-10-09 17:55:38 --- .gitconfig | 2 + .version | 1 - buildinfo/version.go | 61 ++++++ cmds/go.mod | 40 ++++ cmds/go.sum | 36 ++++ cmds/testmain/main.go | 7 +- cmds/versioncmd/cmd.go | 4 +- component/cloudevent/client.go | 6 +- component/go.mod | 47 ++++ component/go.sum | 44 ++++ config/config.go | 10 + config/configs/assets/assets.yaml | 1 + config/util.go | 11 - env/env.go | 20 +- errors/errutil/util.go | 80 ++----- funk.go | 31 ++- generic/util.go | 5 +- go.mod | 26 +-- go.sum | 90 -------- go.work | 7 + go.work.sum | 336 +++++++++++++++++++++++++++++ log/global.go | 11 +- migrates/entmigrates/migrate.go | 15 +- proto/commonpb/page.pb.go | 9 +- proto/commonpb/page.proto | 2 +- proto/commonpb/request-info.pb.go | 8 +- proto/commonpb/request-info.proto | 2 +- proto/commonpb/resource.pb.enum.go | 2 +- proto/commonpb/resource.pb.go | 8 +- proto/commonpb/resource.proto | 2 +- proto/commonpb/response.pb.go | 8 +- proto/commonpb/response.proto | 2 +- proto/errorpb/code.pb.enum.go | 2 +- proto/errorpb/code.pb.go | 8 +- proto/errorpb/code.proto | 4 +- proto/errorpb/errors.pb.go | 149 ++++--------- proto/errorpb/errors.proto | 10 +- proto/errorpb/options.pb.go | 13 +- proto/errorpb/options.proto | 5 +- proto/testcodepb/test.pb.enum.go | 2 +- proto/testcodepb/test.pb.go | 10 +- proto/testcodepb/test.proto | 2 +- result/future.go | 21 +- result/future_test.go | 65 ++++++ result/interface.go | 8 +- result/result_test.go | 20 +- result/resultchecker/checker.go | 10 +- running/runtime.go | 15 +- running/util.go | 22 +- shutil/shell.go | 15 +- version/export.go | 21 -- 51 files changed, 870 insertions(+), 466 deletions(-) create mode 100644 .gitconfig delete mode 100644 .version create mode 100644 buildinfo/version.go create mode 100644 cmds/go.mod create mode 100644 cmds/go.sum create mode 100644 component/go.mod create mode 100644 component/go.sum create mode 100644 go.work create mode 100644 go.work.sum create mode 100644 result/future_test.go delete mode 100644 version/export.go diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..2af6ad6 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,2 @@ +[url "git@github.com:"] + insteadOf = https://github.com/ diff --git a/.version b/.version deleted file mode 100644 index a1b3dc7..0000000 --- a/.version +++ /dev/null @@ -1 +0,0 @@ -v0.5.69 \ No newline at end of file diff --git a/buildinfo/version.go b/buildinfo/version.go new file mode 100644 index 0000000..2898052 --- /dev/null +++ b/buildinfo/version.go @@ -0,0 +1,61 @@ +package buildinfo + +import ( + "github.com/samber/lo" + "runtime/debug" + "strings" +) + +func CommitID() string { return commitID } +func MainPath() string { return mainPath } +func Version() string { return version } +func BuildTime() string { return buildTime } +func Project() string { return project } +func Domain() string { return domain } + +var domain string +var mainPath string + +// git rev-parse HEAD +// git describe --always --abbrev=7 --dirty +var ( + commitID string + buildTime string +) + +// git describe --tags --abbrev=0 +// git tag --sort=committerdate | tail -n 1 +var ( + version string + project string +) + +func init() { + bi, ok := debug.ReadBuildInfo() + if !ok { + return + } + + mainPath = bi.Main.Path + if project == "" { + project = lo.LastOrEmpty(strings.Split(mainPath, "/")) + } + + if version == "" { + version = bi.Main.Version + } + + if version == "" { + version = "v0.0.1-dev-99" + } + + for i := range bi.Settings { + setting := bi.Settings[i] + switch setting.Key { + case "vcs.revision": + commitID = setting.Value + case "vcs.time": + buildTime = setting.Value + } + } +} diff --git a/cmds/go.mod b/cmds/go.mod new file mode 100644 index 0000000..2bae87e --- /dev/null +++ b/cmds/go.mod @@ -0,0 +1,40 @@ +module github.com/pubgo/funk/v2/cmds + +go 1.23.0 + +replace github.com/pubgo/funk/v2 => ../ + +replace github.com/pubgo/funk/v2/component => ../component + +require ( + entgo.io/ent v0.13.1 + github.com/dave/jennifer v1.7.0 + github.com/iancoleman/strcase v0.2.0 + github.com/moby/term v0.5.0 + github.com/samber/lo v1.51.0 + github.com/urfave/cli/v3 v3.4.1 + google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + ariga.io/atlas v0.21.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect + github.com/agext/levenshtein v1.2.1 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/hcl/v2 v2.13.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/zclconf/go-cty v1.8.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.33.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect +) diff --git a/cmds/go.sum b/cmds/go.sum new file mode 100644 index 0000000..2c8193e --- /dev/null +++ b/cmds/go.sum @@ -0,0 +1,36 @@ +ariga.io/atlas v0.21.1 h1:Eg9XYhKTH3UHoqP7tKMWFV+Z5JnpVOJCgO3MHrUtKmk= +entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= +github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= +github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/cmds/testmain/main.go b/cmds/testmain/main.go index ed7054d..ad8ff8e 100644 --- a/cmds/testmain/main.go +++ b/cmds/testmain/main.go @@ -7,12 +7,13 @@ import ( "sort" "github.com/moby/term" + "github.com/urfave/cli/v3" + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/cliutils" "github.com/pubgo/funk/v2/cmds/versioncmd" "github.com/pubgo/funk/v2/ctxutil" - "github.com/pubgo/funk/v2/version" - "github.com/urfave/cli/v3" ) func main() { @@ -21,7 +22,7 @@ func main() { Suggest: true, UseShortOptionHandling: true, ShellComplete: cli.DefaultAppComplete, - Version: version.Version(), + Version: buildinfo.Version(), Commands: []*cli.Command{ versioncmd.New(), }, diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index f14713b..e855c03 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -6,16 +6,16 @@ import ( "github.com/urfave/cli/v3" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/running" - "github.com/pubgo/funk/v2/version" ) func New() *cli.Command { return &cli.Command{ Name: "version", - Usage: fmt.Sprintf("%s version info", version.Project()), + Usage: fmt.Sprintf("%s version info", buildinfo.Project()), Commands: []*cli.Command{ { Name: "validate", diff --git a/component/cloudevent/client.go b/component/cloudevent/client.go index 1b5e93c..6d9e2f4 100644 --- a/component/cloudevent/client.go +++ b/component/cloudevent/client.go @@ -12,6 +12,7 @@ import ( "github.com/nats-io/nats.go/jetstream" ants "github.com/panjf2000/ants/v2" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/component/lifecycle" "github.com/pubgo/funk/v2/component/natsclient" "github.com/pubgo/funk/v2/errors" @@ -23,7 +24,6 @@ import ( "github.com/pubgo/funk/v2/stack" "github.com/pubgo/funk/v2/try" "github.com/pubgo/funk/v2/typex" - "github.com/pubgo/funk/v2/version" "github.com/rs/zerolog" "github.com/samber/lo" "google.golang.org/protobuf/proto" @@ -85,7 +85,7 @@ func (c *Client) initStream() (r error) { // add subject prefix streamSubjects := lo.Map(cfg.Subjects, func(item string, index int) string { return c.subjectName(item) }) - metadata := map[string]string{"creator": fmt.Sprintf("%s/%s/%s", version.Project(), version.Version(), running.InstanceID)} + metadata := map[string]string{"creator": fmt.Sprintf("%s/%s/%s", buildinfo.Project(), buildinfo.Version(), running.InstanceID)} storageType := getStorageType(cfg.Storage) streamCfg := jetstream.StreamConfig{ Name: streamName, @@ -137,7 +137,7 @@ func (c *Client) initConsumer() (r error) { // A streaming consumer can only have one corresponding job handler assert.If(c.consumers[streamName][consumerName] != nil, "consumer %s already exists", consumerName) - metadata := map[string]string{"version": fmt.Sprintf("%s/%s", version.Project(), version.Version())} + metadata := map[string]string{"version": fmt.Sprintf("%s/%s", buildinfo.Project(), buildinfo.Version())} consumerCfg := jetstream.ConsumerConfig{ Name: consumerName, Durable: consumerName, diff --git a/component/go.mod b/component/go.mod new file mode 100644 index 0000000..eec2cbf --- /dev/null +++ b/component/go.mod @@ -0,0 +1,47 @@ +module github.com/pubgo/funk/v2/component + +go 1.23.0 + +replace github.com/pubgo/funk/v2 => ../ + +require ( + github.com/DATA-DOG/go-sqlmock v1.5.2 + github.com/deckarep/golang-set/v2 v2.6.0 + github.com/rs/xid v1.5.0 + github.com/rs/zerolog v1.33.0 + github.com/samber/lo v1.51.0 + github.com/stretchr/testify v1.10.0 + github.com/tidwall/match v1.1.1 + go.etcd.io/bbolt v1.3.7 + google.golang.org/grpc v1.66.1 + google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + gopkg.in/yaml.v3 v3.0.1 + gorm.io/driver/postgres v1.4.1 + gorm.io/gorm v1.24.5 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect +) diff --git a/component/go.sum b/component/go.sum new file mode 100644 index 0000000..c3c20fd --- /dev/null +++ b/component/go.sum @@ -0,0 +1,44 @@ +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= +google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= +google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= +gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= diff --git a/config/config.go b/config/config.go index f6fc165..abfc29e 100644 --- a/config/config.go +++ b/config/config.go @@ -47,6 +47,12 @@ func init() { }) } +func GetConfigDir() string { + return configDir +} +func GetConfigPath() string { + return configPath +} func SetConfigPath(confPath string) { assert.If(confPath == "", "config path is null") configPath = confPath @@ -88,6 +94,10 @@ func loadEnvConfigMap(cfgPath string) EnvSpecMap { pathList := listAllPath(envPath).Expect("failed to list env config path: %s", envPath) for _, p := range pathList { + if !strings.HasSuffix(p, "."+defaultConfigType) { + continue + } + envConfigBytes := result.Wrap(os.ReadFile(p)). Map(bytes.TrimSpace). Must(func(e *zerolog.Event) { diff --git a/config/configs/assets/assets.yaml b/config/configs/assets/assets.yaml index 83c7727..bdff3f0 100644 --- a/config/configs/assets/assets.yaml +++ b/config/configs/assets/assets.yaml @@ -3,3 +3,4 @@ assets: test_abc: secret: ${{embed("test.md")}} path_dir: ${{config_dir()}} + env_var: ${{env.TEST_ABC}} diff --git a/config/util.go b/config/util.go index 2c19e6a..83ee467 100644 --- a/config/util.go +++ b/config/util.go @@ -25,14 +25,6 @@ import ( "github.com/pubgo/funk/v2/result" ) -func GetConfigDir() string { - return configDir -} - -func GetConfigPath() string { - return configPath -} - func getConfigPath(name, typ string, configDir ...string) (string, string) { if len(configDir) == 0 { configDir = append(configDir, "./", defaultConfigPath) @@ -221,9 +213,6 @@ func RegisterExpr(name string, expr any) { func getEnvData(cfg *config) map[string]any { exprEnv := map[string]any{ "env": env.Map(), - "get_path_dir": func() string { - return cfg.workDir - }, "config_dir": func() string { return cfg.workDir }, diff --git a/env/env.go b/env/env.go index a1481a5..8775b6d 100644 --- a/env/env.go +++ b/env/env.go @@ -2,7 +2,6 @@ package env import ( "fmt" - result2 "github.com/pubgo/funk/v2/result" "log/slog" "os" "strconv" @@ -16,10 +15,11 @@ import ( "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/pathutil" + "github.com/pubgo/funk/v2/result" ) -func Set(key, value string) result2.Error { - return result2.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { +func Set(key, value string) result.Error { + return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str("value", value) e.Str(logfields.Msg, "env_set_error") @@ -108,8 +108,8 @@ func GetFloat(names ...string) float64 { func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } -func Delete(key string) result2.Error { - return result2.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { +func Delete(key string) result.Error { + return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { e.Str("key", key) e.Str(logfields.Msg, "env_delete_error") }) @@ -117,8 +117,8 @@ func Delete(key string) result2.Error { func MustDelete(key string) { Delete(key).Must() } -func Expand(value string) result2.Result[string] { - return result2.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { +func Expand(value string) result.Result[string] { + return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { e.Str("value", value) e.Str(logfields.Msg, "env_expand_error") }) @@ -141,19 +141,19 @@ func Key(key string) string { return keyHandler(key) } -func LoadFiles(files ...string) (r result2.Error) { +func LoadFiles(files ...string) (r result.Error) { files = lo.Filter(files, func(item string, index int) bool { return pathutil.IsExist(item) }) if len(files) == 0 { return } for _, file := range files { - data := result2.Wrap(os.ReadFile(file)).Unwrap(&r) + data := result.Wrap(os.ReadFile(file)).Unwrap(&r) if r.IsErr() { return } - dataMap := result2.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) if r.IsErr() { return } diff --git a/errors/errutil/util.go b/errors/errutil/util.go index 0aa61be..dd66465 100644 --- a/errors/errutil/util.go +++ b/errors/errutil/util.go @@ -13,12 +13,12 @@ import ( "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/anypb" + "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/version" ) func Json(err error) []byte { @@ -173,22 +173,18 @@ func GrpcCodeToHTTP(code codes.Code) int { } // ConvertErr2Status 内部转换,为了让err=nil的时候,监控数据里有OK信息 -func ConvertErr2Status(err *errorpb.Error) *status.Status { - if generic.IsNil(err) { +func ConvertErr2Status(errCode *errorpb.ErrCode) *status.Status { + if funk.IsNil(errCode) { return status.New(codes.OK, "OK") } - if err.Code == nil { - return status.New(codes.OK, "OK") + if (errCode.Name != "" || errCode.Code != 0) && errCode.StatusCode == 0 { + errCode.StatusCode = errorpb.Code_Internal } - if (err.Code.Name != "" || err.Code.Code != 0) && err.Code.StatusCode == 0 { - err.Code.StatusCode = errorpb.Code_Internal - } - - st := status.New(codes.Code(err.Code.StatusCode), err.Msg.Msg) - if st1, err1 := st.WithDetails(err); err1 != nil { - log.Err(err1).Any("lava-error", err).Msg("failed to convert error to grpc status") + st := status.New(codes.Code(errCode.StatusCode), errCode.Message) + if st1, err1 := st.WithDetails(errCode); err1 != nil { + log.Err(err1).Any("lava-error", errCode).Msg("failed to convert error to grpc status") return st } else { return st1 @@ -197,7 +193,7 @@ func ConvertErr2Status(err *errorpb.Error) *status.Status { // ParseError try to convert an error to *Error. // It supports wrapped errors. -func ParseError(err error) *errorpb.Error { +func ParseError(err error) *errorpb.ErrCode { if err == nil { return nil } @@ -211,27 +207,17 @@ func ParseError(err error) *errorpb.Error { details := gs.GRPCStatus().Details() if len(details) > 0 && details[0] != nil { - if e, ok := details[0].(*errorpb.Error); ok && e != nil { + if e, ok := details[0].(*errorpb.ErrCode); ok && e != nil { return e } } - return &errorpb.Error{ - Code: &errorpb.ErrCode{ - Message: gs.GRPCStatus().Message(), - StatusCode: errorpb.Code(gs.GRPCStatus().Code()), - Code: int32(GrpcCodeToHTTP(gs.GRPCStatus().Code())), - Name: "lava.grpc.status", - Details: gs.GRPCStatus().Proto().Details, - }, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", gs.GRPCStatus().Details()), - }, + return &errorpb.ErrCode{ + Message: gs.GRPCStatus().Message(), + StatusCode: errorpb.Code(gs.GRPCStatus().Code()), + Code: int32(GrpcCodeToHTTP(gs.GRPCStatus().Code())), + Name: "lava.grpc.status", + Details: gs.GRPCStatus().Proto().Details, } } @@ -242,34 +228,14 @@ func ParseError(err error) *errorpb.Error { pb.Message = err.Error() } - return &errorpb.Error{ - Code: pb, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", err), - }, - } + return pb } - return &errorpb.Error{ - Code: &errorpb.ErrCode{ - Message: err.Error(), - StatusCode: errorpb.Code_Unknown, - Code: 500, - Name: "lava.error.unknown", - Details: []*anypb.Any{errors.MustProtoToAny(errors.ParseErrToPb(err))}, - }, - Trace: &errorpb.ErrTrace{ - Service: version.Project(), - Version: version.Version(), - }, - Msg: &errorpb.ErrMsg{ - Msg: err.Error(), - Detail: fmt.Sprintf("%v", err), - }, + return &errorpb.ErrCode{ + Message: err.Error(), + StatusCode: errorpb.Code_Unknown, + Code: 500, + Name: "lava.error.unknown", + Details: []*anypb.Any{errors.MustProtoToAny(errors.ParseErrToPb(err))}, } } diff --git a/funk.go b/funk.go index dee96da..0350093 100644 --- a/funk.go +++ b/funk.go @@ -1,21 +1,11 @@ package funk import ( - _ "embed" - + "cmp" "reflect" "unsafe" - - "golang.org/x/exp/constraints" ) -//go:embed .version -var version string - -func GetReleaseVersion() string { - return version -} - func AppendOf[T any](v T, vv ...T) []T { return append(append(make([]T, 0, len(vv)+1), v), vv...) } @@ -81,8 +71,8 @@ func Map[T, V any](data []T, handle func(i int, d T) V) []V { return vv } -// Contains returns whether `vs` contains the element `e` by comparing vs[i] == e. -func Contains[T comparable](vs []T, e T) bool { +// Contain returns whether `vs` contains the element `e` by comparing vs[i] == e. +func Contain[T comparable](vs []T, e T) bool { for _, v := range vs { if v == e { return true @@ -129,7 +119,7 @@ func DeleteAll[T comparable](set []T, value T) []T { } // Max returns the max of the 2 passed values. -func Max[T constraints.Ordered](a, b T) (r T) { +func Max[T cmp.Ordered](a, b T) (r T) { if a < b { r = b } else { @@ -140,7 +130,7 @@ func Max[T constraints.Ordered](a, b T) (r T) { } // Min returns the min of the 2 passed values. -func Min[T constraints.Ordered](a, b T) (r T) { +func Min[T cmp.Ordered](a, b T) (r T) { if a < b { r = a } else { @@ -173,11 +163,18 @@ func IsNil(err interface{}) bool { } } -func Init(fn func()) error { +func Init(fn func()) Void { fn() - return nil + return Void{} } func DoFunc[T any](fn func() T) T { return fn() } + +func DoSelf[T any](t T, fn func(t T)) T { + fn(t) + return t +} + +type Void struct{} diff --git a/generic/util.go b/generic/util.go index c044898..6b66630 100644 --- a/generic/util.go +++ b/generic/util.go @@ -157,7 +157,4 @@ func IsNil(err interface{}) bool { return funk.IsNil(err) } -func Init(fn func()) any { - fn() - return nil -} +func Init(fn func()) funk.Void { return funk.Init(fn) } diff --git a/go.mod b/go.mod index 796d7bf..29367ac 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.23.0 require ( dario.cat/mergo v1.0.0 entgo.io/ent v0.13.1 - github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/a8m/envsubst v1.4.2 github.com/bradleyjkemp/memviz v0.2.3 github.com/dave/jennifer v1.7.0 @@ -25,10 +24,7 @@ require ( github.com/mattn/go-isatty v0.0.20 github.com/mattn/go-sqlite3 v1.14.16 github.com/mitchellh/mapstructure v1.5.0 - github.com/moby/term v0.5.0 - github.com/nats-io/nats.go v1.37.0 github.com/open2b/scriggo v0.56.1 - github.com/panjf2000/ants/v2 v2.10.0 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/phuslu/goid v1.0.0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 @@ -40,12 +36,9 @@ require ( github.com/testcontainers/testcontainers-go v0.30.0 github.com/testcontainers/testcontainers-go/modules/postgres v0.30.0 github.com/tidwall/gjson v1.17.1 - github.com/tidwall/match v1.1.1 github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fastrand v1.1.0 github.com/valyala/fasttemplate v1.2.2 - go.etcd.io/bbolt v1.3.7 - go.etcd.io/etcd/client/v3 v3.5.9 go.uber.org/atomic v1.10.0 golang.org/x/crypto v0.38.0 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb @@ -56,10 +49,7 @@ require ( google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/mysql v1.4.5 gorm.io/driver/postgres v1.4.1 - gorm.io/driver/sqlite v1.4.4 - gorm.io/gen v0.3.21 gorm.io/gorm v1.24.5 modernc.org/sqlite v1.18.0 ) @@ -67,6 +57,7 @@ require ( require ( ariga.io/atlas v0.21.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/agext/levenshtein v1.2.1 // indirect @@ -74,8 +65,6 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/containerd/containerd v1.7.12 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -87,9 +76,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/inflect v0.19.0 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.13.0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect @@ -113,9 +100,8 @@ require ( github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -126,14 +112,13 @@ require ( github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/zclconf/go-cty v1.8.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.26.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect @@ -141,16 +126,11 @@ require ( go.opentelemetry.io/otel/sdk v1.26.0 // indirect go.opentelemetry.io/otel/trace v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.17.0 // indirect golang.org/x/mod v0.25.0 // indirect golang.org/x/net v0.40.0 // indirect golang.org/x/sync v0.15.0 // indirect golang.org/x/tools v0.33.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect - gorm.io/datatypes v1.0.7 // indirect - gorm.io/hints v1.1.0 // indirect - gorm.io/plugin/dbresolver v1.3.0 // indirect lukechampine.com/uint128 v1.1.1 // indirect modernc.org/cc/v3 v3.36.0 // indirect modernc.org/ccgo/v3 v3.16.6 // indirect diff --git a/go.sum b/go.sum index b74c6a4..f728678 100644 --- a/go.sum +++ b/go.sum @@ -6,9 +6,6 @@ entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= entgo.io/ent v0.13.1/go.mod h1:qCEmo+biw3ccBn9OyL4ZK5dfpwg++l1Gxwac5B1206A= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -38,11 +35,8 @@ github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMP github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= @@ -57,12 +51,8 @@ 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= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/denisenkom/go-mssqldb v0.12.2 h1:1OcPn5GBIobjWNd+8yjfHNIaFX14B1pWI3F9HZy5KXw= -github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -88,9 +78,6 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -99,16 +86,8 @@ github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPh github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -121,7 +100,6 @@ 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/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -148,7 +126,6 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= @@ -167,7 +144,6 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= @@ -178,7 +154,6 @@ github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01C github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= @@ -186,7 +161,6 @@ github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= @@ -195,13 +169,11 @@ github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiw github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -250,10 +222,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ 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-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= @@ -268,28 +236,18 @@ github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/open2b/scriggo v0.56.1 h1:h3IVNM0OEvszbtdmukaJj9lPo/xSvHPclYm/RqQqUxY= github.com/open2b/scriggo v0.56.1/go.mod h1:FJS0k7CaKq2sNlrqAGMwU4dCltYqC1c+Eak3dj5w26Q= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -346,7 +304,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -381,14 +338,6 @@ github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= @@ -409,32 +358,24 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= @@ -456,14 +397,12 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -543,43 +482,14 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY= -gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/mysql v1.4.5 h1:u1lytId4+o9dDaNcPCFzNv7h6wvmc92UjNk3z8enSBU= -gorm.io/driver/mysql v1.4.5/go.mod h1:SxzItlnT1cb6e1e4ZRpgJN2VYtcqJgqnHxWr4wsP8oc= -gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw= gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= gorm.io/driver/postgres v1.4.1/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= -gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= -gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= -gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= -gorm.io/driver/sqlserver v1.4.0 h1:3fjbsNkr/YqocSBW5CP16Lq6+APjRrWMzu7NbkXr9QU= -gorm.io/driver/sqlserver v1.4.0/go.mod h1:P8BSbBwkdzXURYx3pWUSEAABRQU0vxbd6xk5+53pg7g= -gorm.io/gen v0.3.21 h1:t8329wT4tW1ZZWOm7vn4LV6OIrz8a5zCg+p78ezt+rA= -gorm.io/gen v0.3.21/go.mod h1:aWgvoKdG9f8Des4TegSa0N5a+gwhGsFo0JJMaLwokvk= -gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= -gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= -gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M= -gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/go.work b/go.work new file mode 100644 index 0000000..033a449 --- /dev/null +++ b/go.work @@ -0,0 +1,7 @@ +go 1.23.0 + +use ( + . + ./cmds + ./component +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..6f9bae5 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,336 @@ +cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0 h1:lhSJz9RMbJcTgxifR1hUNJnn6CNYtbgEDtQV22/9RBA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0 h1:OYa9vmRX2XC5GXRAzeggG12sF/z5D9Ahtdm9EJ00WN4= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0 h1:v9p9TfTbf7AwNb5NYQt7hI41IfPoLFiFkLtb+bmGjT0= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/container-orchestrated-devices/container-device-interface v0.6.1 h1:mz77uJoP8im/4Zins+mPqt677ZMaflhoGaYrRAl5jvA= +github.com/container-orchestrated-devices/container-device-interface v0.6.1/go.mod h1:40T6oW59rFrL/ksiSs7q45GzjGlbvxnA4xaK6cyq+kA= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.1.7 h1:WSf9o9EQ0KGHiUx2ESFZ+PKf4nxK9BcvV/nJDX8RkB4= +github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= +github.com/containerd/nri v0.4.0 h1:PjgIBm0RtUiFyEO6JqPBQZRQicbsIz41Fz/5VSC0zgw= +github.com/containerd/nri v0.4.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP7mkPDoSfP9VU= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.6 h1:uoG52u2e91RE4UqmBICZY8dNshgfvkdl3BW6jnxiFaI= +github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1:1iy2qD6JEhHKKhUOA9IWs7mjco7lnw2qx8FsRI2wirE= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/docker/cli v23.0.3+incompatible h1:Zcse1DuDqBdgI7OQDV8Go7b83xLgfhW1eza4HfEdxpY= +github.com/docker/cli v23.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1:IgJPqnrlY2Mr4pYB6oaMKvFvwJ9H+X6CCY5x1vCTcpc= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= +github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/intel/goresctrl v0.3.0 h1:K2D3GOzihV7xSBedGxONSlaw/un1LZgWsc9IfqipN4c= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= +github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86 h1:D6paGObi5Wud7xg83MaEFyjxQB1W5bz5d0IFppr+ymk= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c h1:bY6ktFuJkt+ZXkX0RChQch2FtHpWQLVS8Qo1YasiIVk= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= +github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 h1:aSISeOcal5irEhJd1M+IrApc0PdcN7e7Aj4yuEnOrfQ= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vektah/gqlparser/v2 v2.4.5 h1:C02NsyEsL4TXJB7ndonqTfuQOL4XPIu0aAWugdmTgmc= +github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= +github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= +github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= +github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= +github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= +github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 h1:RsQi0qJ2imFfCvZabqzM9cNXBG8k6gXMv1A0cXRmH6A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= +k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.26.2 h1:Pk8lmX4G14hYqJd1poHGC08G03nIHVqdJMR0SD3IH3o= +k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/log/global.go b/log/global.go index 24817e7..b0ef54b 100644 --- a/log/global.go +++ b/log/global.go @@ -7,12 +7,13 @@ import ( "os" "time" + "github.com/rs/zerolog" + zlog "github.com/rs/zerolog/log" + + "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/generic" - - "github.com/rs/zerolog" - zlog "github.com/rs/zerolog/log" ) var ( @@ -36,7 +37,7 @@ var ( e.Discard() }) - _ = generic.Init(func() { + _ = funk.Init(func() { zerolog.SetGlobalLevel(zerolog.DebugLevel) zerolog.ErrorMarshalFunc = func(err error) any { if err == nil { @@ -65,7 +66,7 @@ var ( })).Hook(logGlobalHook), ) - _ = generic.Init(func() { + _ = funk.Init(func() { zlog.Logger = generic.FromPtr(stdZeroLog) }) diff --git a/migrates/entmigrates/migrate.go b/migrates/entmigrates/migrate.go index c04483c..b11f0a8 100644 --- a/migrates/entmigrates/migrate.go +++ b/migrates/entmigrates/migrate.go @@ -13,12 +13,6 @@ import ( "entgo.io/ent/dialect/sql/schema" "github.com/dave/jennifer/jen" mapset "github.com/deckarep/golang-set/v2" - "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/config" - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/generic" - "github.com/pubgo/funk/v2/log" - "github.com/pubgo/funk/v2/version" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/postgres" "github.com/testcontainers/testcontainers-go/wait" @@ -26,6 +20,13 @@ import ( dp "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" + "github.com/pubgo/funk/v2/config" + "github.com/pubgo/funk/v2/errors" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/log" ) type MigrationWrap struct { @@ -148,7 +149,7 @@ func %s() *entmigrates.Migration { DataMigrate: nil, } } -`, name, name, fmt.Sprint(now.String(), " ", version.Version()), name)) +`, name, name, fmt.Sprint(now.String(), " ", buildinfo.Version()), name)) filename = filepath.Join(g.config.MigrationPath, fmt.Sprintf("%s.go", name)) err = os.WriteFile(filename, []byte(genFile.GoString()), 0o644) diff --git a/proto/commonpb/page.pb.go b/proto/commonpb/page.pb.go index f5e0355..749a2e2 100644 --- a/proto/commonpb/page.pb.go +++ b/proto/commonpb/page.pb.go @@ -92,10 +92,11 @@ var file_commonpb_page_proto_rawDesc = []byte{ 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, + 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/proto/commonpb/page.proto b/proto/commonpb/page.proto index 6eaf062..8dd9791 100644 --- a/proto/commonpb/page.proto +++ b/proto/commonpb/page.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; message PageRequest { uint64 page_size = 1; diff --git a/proto/commonpb/request-info.pb.go b/proto/commonpb/request-info.pb.go index 5172e5f..6fdaa0f 100644 --- a/proto/commonpb/request-info.pb.go +++ b/proto/commonpb/request-info.pb.go @@ -24,11 +24,11 @@ var File_commonpb_request_info_proto protoreflect.FileDescriptor var file_commonpb_request_info_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, - 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var file_commonpb_request_info_proto_goTypes = []any{} diff --git a/proto/commonpb/request-info.proto b/proto/commonpb/request-info.proto index 72476c8..5bbac90 100644 --- a/proto/commonpb/request-info.proto +++ b/proto/commonpb/request-info.proto @@ -1,4 +1,4 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; \ No newline at end of file +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; \ No newline at end of file diff --git a/proto/commonpb/resource.pb.enum.go b/proto/commonpb/resource.pb.enum.go index f0d288e..5951478 100644 --- a/proto/commonpb/resource.pb.enum.go +++ b/proto/commonpb/resource.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/commonpb/resource.pb.go b/proto/commonpb/resource.pb.go index 8708d3f..659a1f1 100644 --- a/proto/commonpb/resource.pb.go +++ b/proto/commonpb/resource.pb.go @@ -158,11 +158,11 @@ var file_commonpb_resource_proto_rawDesc = []byte{ 0x65, 0x49, 0x64, 0x2a, 0x36, 0x0a, 0x0d, 0x56, 0x49, 0x53, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x42, 0x2f, 0x5a, 0x2d, 0x67, + 0x0a, 0x0a, 0x06, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x02, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, - 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/commonpb/resource.proto b/proto/commonpb/resource.proto index 974b933..f94759d 100644 --- a/proto/commonpb/resource.proto +++ b/proto/commonpb/resource.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; enum VISIABLE_MODE { // 默认Namespace可见 diff --git a/proto/commonpb/response.pb.go b/proto/commonpb/response.pb.go index 2b7c217..5f378b7 100644 --- a/proto/commonpb/response.pb.go +++ b/proto/commonpb/response.pb.go @@ -146,11 +146,11 @@ var file_commonpb_response_proto_rawDesc = []byte{ 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, - 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/commonpb/response.proto b/proto/commonpb/response.proto index a1f4a19..cf6eb26 100644 --- a/proto/commonpb/response.proto +++ b/proto/commonpb/response.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package common.v1; -option go_package = "github.com/pubgo/funk/proto/commonpb;commonpb"; +option go_package = "github.com/pubgo/funk/v2/proto/commonpb;commonpb"; import "google/protobuf/any.proto"; diff --git a/proto/errorpb/code.pb.enum.go b/proto/errorpb/code.pb.enum.go index fa03993..4c8a797 100644 --- a/proto/errorpb/code.pb.enum.go +++ b/proto/errorpb/code.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/errorpb/code.pb.go b/proto/errorpb/code.pb.go index 3113c86..f46a89a 100644 --- a/proto/errorpb/code.pb.go +++ b/proto/errorpb/code.pb.go @@ -139,10 +139,10 @@ var file_errorpb_code_proto_rawDesc = []byte{ 0x4c, 0x6f, 0x73, 0x73, 0x10, 0x0f, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x10, 0x11, - 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/errorpb/code.proto b/proto/errorpb/code.proto index 1b5f1f6..113ae23 100644 --- a/proto/errorpb/code.proto +++ b/proto/errorpb/code.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package errors; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; enum Code { OK = 0; @@ -23,4 +23,4 @@ enum Code { DataLoss = 15; Unauthenticated = 16; TooManyRequests = 17; -} \ No newline at end of file +} diff --git a/proto/errorpb/errors.pb.go b/proto/errorpb/errors.pb.go index ac6b552..e1450f6 100644 --- a/proto/errorpb/errors.pb.go +++ b/proto/errorpb/errors.pb.go @@ -167,7 +167,8 @@ type ErrCode struct { Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Error detail include request or other user defined information Details []*anypb.Any `protobuf:"bytes,5,rep,name=details,proto3" json:"details,omitempty"` - Id *string `protobuf:"bytes,6,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Error id, which can be used to trace error + Id *string `protobuf:"bytes,6,opt,name=id,proto3,oneof" json:"id,omitempty"` } func (x *ErrCode) Reset() { @@ -311,67 +312,6 @@ func (x *ErrTrace) GetVersion() string { return "" } -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code *ErrCode `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` - Trace *ErrTrace `protobuf:"bytes,2,opt,name=trace,proto3" json:"trace,omitempty"` - Msg *ErrMsg `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` -} - -func (x *Error) Reset() { - *x = Error{} - mi := &file_errorpb_errors_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{4} -} - -func (x *Error) GetCode() *ErrCode { - if x != nil { - return x.Code - } - return nil -} - -func (x *Error) GetTrace() *ErrTrace { - if x != nil { - return x.Trace - } - return nil -} - -func (x *Error) GetMsg() *ErrMsg { - if x != nil { - return x.Msg - } - return nil -} - type ErrWrap struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -385,7 +325,7 @@ type ErrWrap struct { func (x *ErrWrap) Reset() { *x = ErrWrap{} - mi := &file_errorpb_errors_proto_msgTypes[5] + mi := &file_errorpb_errors_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -397,7 +337,7 @@ func (x *ErrWrap) String() string { func (*ErrWrap) ProtoMessage() {} func (x *ErrWrap) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[5] + mi := &file_errorpb_errors_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -410,7 +350,7 @@ func (x *ErrWrap) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrWrap.ProtoReflect.Descriptor instead. func (*ErrWrap) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{5} + return file_errorpb_errors_proto_rawDescGZIP(), []int{4} } func (x *ErrWrap) GetTags() map[string]string { @@ -484,30 +424,23 @@ var file_errorpb_errors_proto_rawDesc = []byte{ 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x76, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x2e, 0x45, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x26, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x54, 0x72, 0x61, 0x63, 0x65, - 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, - 0x72, 0x4d, 0x73, 0x67, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, - 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, - 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, - 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, - 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -522,33 +455,29 @@ func file_errorpb_errors_proto_rawDescGZIP() []byte { return file_errorpb_errors_proto_rawDescData } -var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_errorpb_errors_proto_goTypes = []any{ (*Tag)(nil), // 0: errors.Tag (*ErrMsg)(nil), // 1: errors.ErrMsg (*ErrCode)(nil), // 2: errors.ErrCode (*ErrTrace)(nil), // 3: errors.ErrTrace - (*Error)(nil), // 4: errors.Error - (*ErrWrap)(nil), // 5: errors.ErrWrap - nil, // 6: errors.ErrMsg.TagsEntry - nil, // 7: errors.ErrWrap.TagsEntry - (Code)(0), // 8: errors.Code - (*anypb.Any)(nil), // 9: google.protobuf.Any + (*ErrWrap)(nil), // 4: errors.ErrWrap + nil, // 5: errors.ErrMsg.TagsEntry + nil, // 6: errors.ErrWrap.TagsEntry + (Code)(0), // 7: errors.Code + (*anypb.Any)(nil), // 8: google.protobuf.Any } var file_errorpb_errors_proto_depIdxs = []int32{ - 6, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry - 8, // 1: errors.ErrCode.status_code:type_name -> errors.Code - 9, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any - 2, // 3: errors.Error.code:type_name -> errors.ErrCode - 3, // 4: errors.Error.trace:type_name -> errors.ErrTrace - 1, // 5: errors.Error.msg:type_name -> errors.ErrMsg - 7, // 6: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry - 9, // 7: errors.ErrWrap.error:type_name -> google.protobuf.Any - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 5, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry + 7, // 1: errors.ErrCode.status_code:type_name -> errors.Code + 8, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any + 6, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry + 8, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_errorpb_errors_proto_init() } @@ -565,7 +494,7 @@ func file_errorpb_errors_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_errorpb_errors_proto_rawDesc, NumEnums: 0, - NumMessages: 8, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/errorpb/errors.proto b/proto/errorpb/errors.proto index 0ae55a6..df6d1f6 100644 --- a/proto/errorpb/errors.proto +++ b/proto/errorpb/errors.proto @@ -5,7 +5,7 @@ package errors; import "errorpb/code.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Tag { string key = 1; @@ -36,6 +36,8 @@ message ErrCode { // Error detail include request or other user defined information repeated google.protobuf.Any details = 5; + + // Error id, which can be used to trace error optional string id = 6; } @@ -46,12 +48,6 @@ message ErrTrace { string version = 5; } -message Error { - ErrCode code = 1; - ErrTrace trace = 2; - ErrMsg msg = 3; -} - message ErrWrap { map tags = 1; string caller = 2; diff --git a/proto/errorpb/options.pb.go b/proto/errorpb/options.pb.go index 2908d6f..f24e357 100644 --- a/proto/errorpb/options.pb.go +++ b/proto/errorpb/options.pb.go @@ -179,9 +179,9 @@ var File_errorpb_options_proto protoreflect.FileDescriptor var file_errorpb_options_proto_rawDesc = []byte{ 0x0a, 0x15, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, - 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x12, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, + 0x12, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, @@ -202,10 +202,11 @@ var file_errorpb_options_proto_rawDesc = []byte{ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa1, 0x8d, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70, 0x74, 0x73, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x6f, 0x70, 0x74, 0x73, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, - 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, - 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/proto/errorpb/options.proto b/proto/errorpb/options.proto index 6d89d6c..595f5a4 100644 --- a/proto/errorpb/options.proto +++ b/proto/errorpb/options.proto @@ -2,9 +2,10 @@ syntax = "proto3"; package errors; -option go_package = "github.com/pubgo/funk/proto/errorpb;errorpb"; -import "google/protobuf/descriptor.proto"; import "errorpb/code.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Options { bool gen = 1; diff --git a/proto/testcodepb/test.pb.enum.go b/proto/testcodepb/test.pb.enum.go index c3072f6..939ad40 100644 --- a/proto/testcodepb/test.pb.enum.go +++ b/proto/testcodepb/test.pb.enum.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go-sql. DO NOT EDIT. +// Code generated by protoc-gen-go-enum. DO NOT EDIT. // versions: // - protoc-gen-go-enum v0.0.2 // - protoc v5.29.3 diff --git a/proto/testcodepb/test.pb.go b/proto/testcodepb/test.pb.go index 55d684f..8d7c8c1 100644 --- a/proto/testcodepb/test.pb.go +++ b/proto/testcodepb/test.pb.go @@ -846,11 +846,11 @@ var file_testcodepb_test_proto_rawDesc = []byte{ 0x31, 0x2e, 0x44, 0x6f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x1a, 0x11, 0xca, 0x41, 0x0e, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x42, 0x33, - 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, - 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x65, - 0x73, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x3b, 0x74, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x64, - 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x42, 0x36, + 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, + 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x74, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x3b, 0x74, 0x65, 0x73, 0x74, + 0x63, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/testcodepb/test.proto b/proto/testcodepb/test.proto index 5d8ae26..ef89128 100644 --- a/proto/testcodepb/test.proto +++ b/proto/testcodepb/test.proto @@ -9,7 +9,7 @@ import "google/api/client.proto"; import "google/api/httpbody.proto"; import "google/protobuf/empty.proto"; -option go_package = "github.com/pubgo/funk/proto/testcodepb;testcodepb"; +option go_package = "github.com/pubgo/funk/v2/proto/testcodepb;testcodepb"; enum Code { option (errors.opts).gen = true; diff --git a/result/future.go b/result/future.go index 4af99cd..fc3efd7 100644 --- a/result/future.go +++ b/result/future.go @@ -7,9 +7,9 @@ import ( "github.com/samber/lo" ) -func AsyncErr(fn func() Error) ErrFuture { +func AsyncErr(fn func() Error) *ErrFuture { if fn == nil { - return ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} + return &ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} } var future = newErrFuture() @@ -17,18 +17,21 @@ func AsyncErr(fn func() Error) ErrFuture { return future } -func Async[T any](fn func() Result[T]) Future[T] { +func Async[T any](fn func() Result[T]) *Future[T] { if fn == nil { - return Future[T]{v: Fail[T](errors.WrapCaller(errFnIsNil, 1))} + return &Future[T]{v: Fail[T](errors.WrapCaller(errFnIsNil, 1))} } var future = newFuture[T]() - go func() { defer future.close(); future.setVal(tryResult(fn)) }() + go func() { + defer future.close() + future.setVal(tryResult(fn)) + }() return future } -func newFuture[T any]() Future[T] { - return Future[T]{done: make(chan struct{})} +func newFuture[T any]() *Future[T] { + return &Future[T]{done: make(chan struct{})} } type Future[T any] struct { @@ -49,8 +52,8 @@ func (f *Future[T]) Await(ctxL ...context.Context) Result[T] { } } -func newErrFuture() ErrFuture { - return ErrFuture{done: make(chan struct{})} +func newErrFuture() *ErrFuture { + return &ErrFuture{done: make(chan struct{})} } type ErrFuture struct { diff --git a/result/future_test.go b/result/future_test.go new file mode 100644 index 0000000..3666fe9 --- /dev/null +++ b/result/future_test.go @@ -0,0 +1,65 @@ +package result_test + +import ( + "sync" + "testing" + "time" + + "github.com/pubgo/funk/v2/result" + "github.com/stretchr/testify/assert" +) + +func TestFuture_ConcurrentAwait(t *testing.T) { + future := result.Async(func() result.Result[int] { + time.Sleep(10 * time.Millisecond) + return result.OK(42) + }) + + var wg sync.WaitGroup + results := make([]result.Result[int], 10) + + // Start multiple goroutines waiting for the same future + for i := 0; i < 10; i++ { + wg.Add(1) + idx := i + go func() { + defer wg.Done() + results[idx] = future.Await() + }() + } + + wg.Wait() + + // All results should be the same + for _, r := range results { + assert.True(t, r.IsOK()) + assert.Equal(t, 42, r.GetValue()) + } +} + +func TestErrFuture_ConcurrentAwait(t *testing.T) { + future := result.AsyncErr(func() (r result.Error) { + time.Sleep(10 * time.Millisecond) + return r.WithErr(nil) + }) + + var wg sync.WaitGroup + results := make([]result.Error, 10) + + // Start multiple goroutines waiting for the same future + for i := 0; i < 10; i++ { + wg.Add(1) + idx := i + go func() { + defer wg.Done() + results[idx] = future.Await() + }() + } + + wg.Wait() + + // All results should be the same + for _, r := range results { + assert.True(t, r.IsOK()) + } +} diff --git a/result/interface.go b/result/interface.go index fd8e959..da96e39 100644 --- a/result/interface.go +++ b/result/interface.go @@ -1,6 +1,10 @@ package result -import "context" +import ( + "context" + + "github.com/pubgo/funk/v2" +) // Checkable defines types that can be checked for Ok/Error state type Checkable interface { @@ -24,3 +28,5 @@ type UnWrapper[T any] interface { UnwrapErr(setter *error, contexts ...context.Context) T Unwrap(setter ErrSetter, contexts ...context.Context) T } + +type Void = funk.Void diff --git a/result/result_test.go b/result/result_test.go index 5a3d0c8..62c625c 100644 --- a/result/result_test.go +++ b/result/result_test.go @@ -4,19 +4,19 @@ import ( "context" "encoding/json" "fmt" - result2 "github.com/pubgo/funk/v2/result" - "github.com/pubgo/funk/v2/result/resultchecker" "testing" "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/recovery" + "github.com/pubgo/funk/v2/result" + "github.com/pubgo/funk/v2/result/resultchecker" ) func TestMust(t *testing.T) { defer recovery.Testing(t) - result2.Must(fmt.Errorf("test must")) + result.Must(fmt.Errorf("test must")) } type hello struct { @@ -26,7 +26,7 @@ type hello struct { func TestName(t *testing.T) { defer recovery.DebugPrint() ok := &hello{Name: "abc"} - okBytes := result2.Wrap(json.Marshal(&ok)) + okBytes := result.Wrap(json.Marshal(&ok)) data := string(okBytes.Expect("failed to encode json data")) t.Log(data) if data != `{"name":"abc"}` { @@ -36,7 +36,7 @@ func TestName(t *testing.T) { } func TestResultDo(t *testing.T) { - ok := result2.OK(&hello{Name: "abc"}) + ok := result.OK(&hello{Name: "abc"}) ok.Inspect(func(v *hello) { assert.If(v.Name != "abc", "not match") }).Inspect(func(v *hello) { @@ -51,13 +51,13 @@ func TestErrOf(t *testing.T) { var ctx = log.UpdateEventCtx(context.Background(), log.Map{"test": "ok"}) resultchecker.RegisterErrCheck(log.RecordErr()) - var err result2.Error + var err result.Error if fn1().Catch(&err, ctx) { errors.Debug(err.GetErr()) } } -func fn1() (r result2.Result[string]) { +func fn1() (r result.Result[string]) { if fn3().Catch(&r) { return } @@ -70,7 +70,7 @@ func fn1() (r result2.Result[string]) { return r.WithValue(val) } -func fn2() (r result2.Result[string]) { +func fn2() (r result.Result[string]) { fn3(). InspectErr(func(err error) { log.Err(err).Msg("test error") @@ -83,8 +83,8 @@ func fn2() (r result2.Result[string]) { return r.WithValue("ok") } -func fn3() result2.Error { - return result2.ErrOf(fmt.Errorf("error test, this is error")). +func fn3() result.Error { + return result.ErrOf(fmt.Errorf("error test, this is error")). InspectErr(func(err error) { log.Err(err).Msg("ddd") }). diff --git a/result/resultchecker/checker.go b/result/resultchecker/checker.go index b9dec84..4c6bbb9 100644 --- a/result/resultchecker/checker.go +++ b/result/resultchecker/checker.go @@ -2,8 +2,6 @@ package resultchecker import ( "context" - "reflect" - "github.com/pubgo/funk/v2/stack" ) @@ -14,9 +12,9 @@ func RegisterErrCheck(f ErrChecker) bool { return false } - var checkFrame = stack.CallerWithFunc(f) + var checkFrame = stack.CallerWithFunc(f).String() for _, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { + if checkFrame == stack.CallerWithFunc(errFunc).String() { return false } } @@ -36,10 +34,10 @@ func GetErrCheckStacks() []*stack.Frame { } func RemoveErrCheck(f func(context.Context, error) error) { - var checkFrame = stack.CallerWithFunc(f) + var checkFrame = stack.CallerWithFunc(f).String() var index = -1 for idx, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { + if checkFrame == stack.CallerWithFunc(errFunc).String() { index = idx break } diff --git a/running/runtime.go b/running/runtime.go index 717af69..fd46e97 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -8,19 +8,19 @@ import ( "github.com/rs/xid" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/env" "github.com/pubgo/funk/v2/monster" "github.com/pubgo/funk/v2/netutil" "github.com/pubgo/funk/v2/pathutil" "github.com/pubgo/funk/v2/strutil" - "github.com/pubgo/funk/v2/version" ) // default global variables var ( HttpPort = 8080 GrpcPort = 50051 - Project = version.Project() + Project = buildinfo.Project() Env = "debug" @@ -29,9 +29,9 @@ var ( DeviceID = InstanceID - Version = version.Version() + Version = buildinfo.Version() - CommitID = version.CommitID() + CommitID = buildinfo.CommitID() Pwd = assert.Exit1(os.Getwd()) @@ -57,19 +57,22 @@ var ( }, ) - Domain string + Domain = buildinfo.Domain() enableDebug = monster.Bool("debug", false, "enable debug") ) func Debug() bool { return enableDebug.Get() } +func EnableDebug() { + assert.Exit(enableDebug.Set(true)) +} func init() { if env.GetBool("enable_debug", "debug", "dev_mode") { assert.Exit(enableDebug.Set(true)) } - if e := env.Get("env", "run_mode", "run_env"); e != "" { + if e := env.Get("env", "run_env"); e != "" { Env = e } diff --git a/running/util.go b/running/util.go index 41ff5ee..2c16d85 100644 --- a/running/util.go +++ b/running/util.go @@ -7,17 +7,13 @@ import ( semver "github.com/hashicorp/go-version" "github.com/pubgo/funk/v2/assert" + "github.com/pubgo/funk/v2/buildinfo" "github.com/pubgo/funk/v2/recovery" - "github.com/pubgo/funk/v2/version" ) -func SetVersion(v string) { Version = v } -func SetProject(p string) { Project = p } -func SetDomain(d string) { Domain = d } - func GetSysInfo() map[string]string { return map[string]string{ - "main_path": version.MainPath(), + "main_path": buildinfo.MainPath(), "grpc_port": fmt.Sprintf("%v", GrpcPort), "http_post": fmt.Sprintf("%v", HttpPort), "debug": fmt.Sprintf("%v", Debug()), @@ -28,7 +24,7 @@ func GetSysInfo() map[string]string { "device_id": DeviceID, "project": Project, "hostname": Hostname, - "build_time": version.BuildTime(), + "build_time": buildinfo.BuildTime(), "version": Version, "domain": Domain, "commit_id": CommitID, @@ -43,15 +39,15 @@ func GetSysInfo() map[string]string { func CheckVersion() { defer recovery.Exit() + assert.If(buildinfo.Project() == "", "project is null") + assert.If(buildinfo.Version() == "", "version is null") + assert.If(buildinfo.CommitID() == "", "commitID is null") + assert.If(buildinfo.BuildTime() == "", "buildTime is null") assert.MustFn(func() error { - _, err := semver.NewVersion(version.Version()) + _, err := semver.NewVersion(buildinfo.Version()) if err != nil { - return fmt.Errorf("version(%s) error: %w", version.Version(), err) + return fmt.Errorf("version(%s) error: %w", buildinfo.Version(), err) } return nil }) - assert.If(version.Project() == "", "project is null") - assert.If(version.Version() == "", "version is null") - assert.If(version.CommitID() == "", "commitID is null") - assert.If(version.BuildTime() == "", "buildTime is null") } diff --git a/shutil/shell.go b/shutil/shell.go index f950ea2..291bd6d 100644 --- a/shutil/shell.go +++ b/shutil/shell.go @@ -3,35 +3,36 @@ package shutil import ( "bytes" "fmt" - result2 "github.com/pubgo/funk/v2/result" "os" "os/exec" "strings" - "github.com/pubgo/funk/v2/log/logfields" "github.com/rs/zerolog" + + "github.com/pubgo/funk/v2/log/logfields" + "github.com/pubgo/funk/v2/result" ) -func Run(args ...string) (r result2.Result[string]) { - defer result2.Recovery(&r) +func Run(args ...string) (r result.Result[string]) { + defer result.Recovery(&r) b := bytes.NewBufferString("") cmd := Shell(args...) cmd.Stdout = b - result2.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { + result.ErrOf(cmd.Run()).Must(func(e *zerolog.Event) { e.Str(logfields.Msg, fmt.Sprintf("failed to execute: "+strings.Join(args, " "))) }) return r.WithValue(strings.TrimSpace(b.String())) } -func GoModGraph() result2.Result[string] { +func GoModGraph() result.Result[string] { return Run("go", "mod", "graph") } -func GoList() result2.Result[string] { +func GoList() result.Result[string] { return Run("go", "list", "./...") } diff --git a/version/export.go b/version/export.go deleted file mode 100644 index ec2aef4..0000000 --- a/version/export.go +++ /dev/null @@ -1,21 +0,0 @@ -package version - -func CommitID() string { - return commitID -} - -func MainPath() string { - return mainPath -} - -func Version() string { - return version -} - -func BuildTime() string { - return buildTime -} - -func Project() string { - return project -} From ad63fdd3fa81f3deecc0a3fa57cfad5dd80252a2 Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 9 Oct 2025 20:49:08 +0800 Subject: [PATCH 35/43] chore: quick update fix/version at 2025-10-10 20:01:46 --- buildinfo/version.go | 20 ++++++++++++++++++- buildinfo/version_test.go | 26 ++++++++++++++++++++++++ env/env.go | 11 +++++----- env/reload.go | 6 ------ langx/parse.go | 16 +++++++++++++++ langx/parse_test.go | 42 +++++++++++++++++++++++++++++++++++++++ version/version.go | 4 +++- 7 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 buildinfo/version_test.go create mode 100644 langx/parse.go create mode 100644 langx/parse_test.go diff --git a/buildinfo/version.go b/buildinfo/version.go index 2898052..ed67393 100644 --- a/buildinfo/version.go +++ b/buildinfo/version.go @@ -1,9 +1,12 @@ package buildinfo import ( - "github.com/samber/lo" "runtime/debug" "strings" + "time" + + "github.com/samber/lo" + "golang.org/x/mod/module" ) func CommitID() string { return commitID } @@ -45,6 +48,21 @@ func init() { version = bi.Main.Version } + if module.IsPseudoVersion(bi.Main.Version) { + ver := bi.Main.Version + if a, err := module.PseudoVersionTime(ver); err == nil { + buildTime = a.Format(time.RFC3339) + } + + if b, err := module.PseudoVersionRev(ver); err == nil { + commitID = b + } + + if c, err := module.PseudoVersionBase(ver); err == nil { + version = c + } + } + if version == "" { version = "v0.0.1-dev-99" } diff --git a/buildinfo/version_test.go b/buildinfo/version_test.go new file mode 100644 index 0000000..c5ca7be --- /dev/null +++ b/buildinfo/version_test.go @@ -0,0 +1,26 @@ +package buildinfo_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "golang.org/x/mod/module" +) + +func TestVersion(t *testing.T) { + ver := "v0.0.8-0.20251008154318-d8a2f764dac7+dirty" + assert.True(t, module.IsPseudoVersion(ver)) + + a, err := module.PseudoVersionTime(ver) + assert.NoError(t, err) + assert.Equal(t, "2025-10-08 15:43:18", a.Format(time.DateTime)) + + b, err := module.PseudoVersionRev(ver) + assert.NoError(t, err) + assert.Equal(t, "d8a2f764dac7", b) + + c, err := module.PseudoVersionBase(ver) + assert.NoError(t, err) + assert.Equal(t, "v0.0.7+dirty", c) +} diff --git a/env/env.go b/env/env.go index 8775b6d..e755d58 100644 --- a/env/env.go +++ b/env/env.go @@ -49,12 +49,13 @@ func GetWith(val *string, names ...string) { getVal(val, names...) } func getVal(val *string, names ...string) { for _, name := range names { - env, ok := Lookup(name) - env = trim(env) - if ok && env != "" { - *val = env - break + env := trim(os.Getenv(keyHandler(name))) + if env == "" { + continue } + + *val = env + break } } diff --git a/env/reload.go b/env/reload.go index 9844c69..2ce4be2 100644 --- a/env/reload.go +++ b/env/reload.go @@ -14,12 +14,6 @@ func Reload() { loadEnv() } -// Init reload env -// Deprecated: use Reload instead. -func Init() { - loadEnv() -} - // 环境变量处理, key转大写, 同时把`-./`转换为`_` // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { diff --git a/langx/parse.go b/langx/parse.go new file mode 100644 index 0000000..4d1a1a0 --- /dev/null +++ b/langx/parse.go @@ -0,0 +1,16 @@ +package langx + +import ( + "github.com/pubgo/funk/v2/log" + "golang.org/x/text/language" +) + +func ParseTags(lang string) []language.Tag { + tags, _, err := language.ParseAcceptLanguage(lang) + if err != nil { + log.Err(err).Str("lang", lang).Msg("parse accept-language failed") + return []language.Tag{language.Chinese} + } + + return tags +} diff --git a/langx/parse_test.go b/langx/parse_test.go new file mode 100644 index 0000000..94ccc9b --- /dev/null +++ b/langx/parse_test.go @@ -0,0 +1,42 @@ +package langx + +import ( + "reflect" + "testing" + + "golang.org/x/text/language" +) + +func TestParseTags(t *testing.T) { + type args struct { + lang string + } + tests := []struct { + name string + args args + want []language.Tag + }{ + { + name: "testChinese", + args: args{lang: "zh"}, + want: []language.Tag{language.Chinese}, + }, + { + name: "testEn", + args: args{lang: "en"}, + want: []language.Tag{language.English}, + }, + { + name: "testWrong", + args: args{lang: "one two"}, + want: []language.Tag{language.Chinese}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := ParseTags(tt.args.lang); !reflect.DeepEqual(got, tt.want) { + t.Errorf("ParseTags() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/version/version.go b/version/version.go index e37ce17..aa4b1d0 100644 --- a/version/version.go +++ b/version/version.go @@ -7,6 +7,8 @@ import ( //go:embed .version var version string +// ReleaseVersion v2.0.0 func ReleaseVersion() string { return version } -func ReleaseDate() string { return "2025-10-08" } +// ReleaseDate 2025-10-10T12:01:46Z +func ReleaseDate() int64 { return 1760097706 } From f278a42535e4ff675f314678efd0f579a692fdeb Mon Sep 17 00:00:00 2001 From: barry Date: Thu, 9 Oct 2025 20:49:08 +0800 Subject: [PATCH 36/43] chore: quick update fix/version at 2025-10-11 15:42:00 --- version/.version => .version | 0 buildinfo/version.go | 56 ++++++++++++++++++++++++----- buildinfo/version/version.go | 70 ++++++++++++++++++++++++++++++++++++ buildinfo/version_test.go | 26 ++++++++++++++ funk.go | 7 ++++ langx/parse.go | 16 +++++++++ langx/parse_test.go | 42 ++++++++++++++++++++++ version/version.go | 12 ------- 8 files changed, 209 insertions(+), 20 deletions(-) rename version/.version => .version (100%) create mode 100644 buildinfo/version/version.go create mode 100644 buildinfo/version_test.go create mode 100644 langx/parse.go create mode 100644 langx/parse_test.go delete mode 100644 version/version.go diff --git a/version/.version b/.version similarity index 100% rename from version/.version rename to .version diff --git a/buildinfo/version.go b/buildinfo/version.go index 2898052..3de8a3b 100644 --- a/buildinfo/version.go +++ b/buildinfo/version.go @@ -1,17 +1,23 @@ package buildinfo import ( - "github.com/samber/lo" "runtime/debug" "strings" + "time" + + "github.com/samber/lo" + "golang.org/x/mod/module" + + v "github.com/pubgo/funk/v2/buildinfo/version" ) -func CommitID() string { return commitID } -func MainPath() string { return mainPath } -func Version() string { return version } -func BuildTime() string { return buildTime } -func Project() string { return project } -func Domain() string { return domain } +func CommitID() string { return commitID } +func MainPath() string { return mainPath } +func Version() string { return version } +func ReleaseVersion() string { return release } +func BuildTime() string { return buildTime } +func Project() string { return project } +func Domain() string { return domain } var domain string var mainPath string @@ -19,17 +25,28 @@ var mainPath string // git rev-parse HEAD // git describe --always --abbrev=7 --dirty var ( - commitID string + // commitID, git commit id + commitID string + + // buildTime, build time, rfc3339 buildTime string ) // git describe --tags --abbrev=0 // git tag --sort=committerdate | tail -n 1 var ( + // version, git tag version string + + // project, project name project string ) +var ( + // release tag + release string +) + func init() { bi, ok := debug.ReadBuildInfo() if !ok { @@ -45,6 +62,21 @@ func init() { version = bi.Main.Version } + if module.IsPseudoVersion(bi.Main.Version) { + ver := bi.Main.Version + if a, err := module.PseudoVersionTime(ver); err == nil { + buildTime = a.Format(time.RFC3339) + } + + if b, err := module.PseudoVersionRev(ver); err == nil { + commitID = b + } + + if c, err := module.PseudoVersionBase(ver); err == nil { + version = c + } + } + if version == "" { version = "v0.0.1-dev-99" } @@ -58,4 +90,12 @@ func init() { buildTime = setting.Value } } + + _ = v.SetBuildTime(buildTime) + _ = v.SetCommitID(commitID) + _ = v.SetProject(project) + _ = v.SetReleaseVersion(release) + _ = v.SetMainPath(mainPath) + _ = v.SetVersion(version) + _ = v.SetDomain(domain) } diff --git a/buildinfo/version/version.go b/buildinfo/version/version.go new file mode 100644 index 0000000..7366a4d --- /dev/null +++ b/buildinfo/version/version.go @@ -0,0 +1,70 @@ +package version + +import "github.com/pubgo/funk/v2" + +var ( + mainPath string + domain string + commitID string + buildTime string + version string + project string + release string +) + +func CommitID() string { return commitID } +func MainPath() string { return mainPath } +func Version() string { return version } +func ReleaseVersion() string { return release } +func BuildTime() string { return buildTime } +func Project() string { return project } +func Domain() string { return domain } + +func SetCommitID(id string) funk.Void { + if id != "" { + commitID = id + } + return funk.Void{} +} + +func SetMainPath(path string) funk.Void { + if path != "" { + mainPath = path + } + return funk.Void{} +} + +func SetVersion(v string) funk.Void { + if v != "" { + version = v + } + return funk.Void{} +} + +func SetReleaseVersion(r string) funk.Void { + if r != "" { + release = r + } + return funk.Void{} +} + +func SetBuildTime(t string) funk.Void { + if t != "" { + buildTime = t + } + return funk.Void{} +} + +func SetProject(p string) funk.Void { + if p != "" { + project = p + } + return funk.Void{} +} + +func SetDomain(d string) funk.Void { + if d != "" { + domain = d + } + return funk.Void{} +} diff --git a/buildinfo/version_test.go b/buildinfo/version_test.go new file mode 100644 index 0000000..c5ca7be --- /dev/null +++ b/buildinfo/version_test.go @@ -0,0 +1,26 @@ +package buildinfo_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "golang.org/x/mod/module" +) + +func TestVersion(t *testing.T) { + ver := "v0.0.8-0.20251008154318-d8a2f764dac7+dirty" + assert.True(t, module.IsPseudoVersion(ver)) + + a, err := module.PseudoVersionTime(ver) + assert.NoError(t, err) + assert.Equal(t, "2025-10-08 15:43:18", a.Format(time.DateTime)) + + b, err := module.PseudoVersionRev(ver) + assert.NoError(t, err) + assert.Equal(t, "d8a2f764dac7", b) + + c, err := module.PseudoVersionBase(ver) + assert.NoError(t, err) + assert.Equal(t, "v0.0.7+dirty", c) +} diff --git a/funk.go b/funk.go index 0350093..4d9b2cc 100644 --- a/funk.go +++ b/funk.go @@ -1,11 +1,18 @@ package funk import ( + _ "embed" + "cmp" "reflect" "unsafe" ) +//go:embed .version +var releaseVersion string + +func ReleaseVersion() string { return releaseVersion } + func AppendOf[T any](v T, vv ...T) []T { return append(append(make([]T, 0, len(vv)+1), v), vv...) } diff --git a/langx/parse.go b/langx/parse.go new file mode 100644 index 0000000..4d1a1a0 --- /dev/null +++ b/langx/parse.go @@ -0,0 +1,16 @@ +package langx + +import ( + "github.com/pubgo/funk/v2/log" + "golang.org/x/text/language" +) + +func ParseTags(lang string) []language.Tag { + tags, _, err := language.ParseAcceptLanguage(lang) + if err != nil { + log.Err(err).Str("lang", lang).Msg("parse accept-language failed") + return []language.Tag{language.Chinese} + } + + return tags +} diff --git a/langx/parse_test.go b/langx/parse_test.go new file mode 100644 index 0000000..94ccc9b --- /dev/null +++ b/langx/parse_test.go @@ -0,0 +1,42 @@ +package langx + +import ( + "reflect" + "testing" + + "golang.org/x/text/language" +) + +func TestParseTags(t *testing.T) { + type args struct { + lang string + } + tests := []struct { + name string + args args + want []language.Tag + }{ + { + name: "testChinese", + args: args{lang: "zh"}, + want: []language.Tag{language.Chinese}, + }, + { + name: "testEn", + args: args{lang: "en"}, + want: []language.Tag{language.English}, + }, + { + name: "testWrong", + args: args{lang: "one two"}, + want: []language.Tag{language.Chinese}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := ParseTags(tt.args.lang); !reflect.DeepEqual(got, tt.want) { + t.Errorf("ParseTags() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/version/version.go b/version/version.go deleted file mode 100644 index e37ce17..0000000 --- a/version/version.go +++ /dev/null @@ -1,12 +0,0 @@ -package version - -import ( - _ "embed" -) - -//go:embed .version -var version string - -func ReleaseVersion() string { return version } - -func ReleaseDate() string { return "2025-10-08" } From 9c12448d358fd04b45a1d8de5a32f5f0b5489ef7 Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 13 Oct 2025 11:06:25 +0800 Subject: [PATCH 37/43] chore: quick update fix/version at 2025-10-15 20:48:23 --- buildinfo/build.go | 29 +++++ buildinfo/version.go | 36 ------ cmds/testmain/main.go | 4 +- cmds/versioncmd/cmd.go | 7 +- component/cloudevent/client.go | 2 +- features/_.go | 6 + features/featureflags/flags.go | 29 +++-- features/features.go | 48 ++++++-- features/types.go | 211 +++++++++++++++++++------------- migrates/entmigrates/migrate.go | 4 +- result/util.go | 16 ++- 11 files changed, 235 insertions(+), 157 deletions(-) create mode 100644 buildinfo/build.go create mode 100644 features/_.go diff --git a/buildinfo/build.go b/buildinfo/build.go new file mode 100644 index 0000000..9e17e02 --- /dev/null +++ b/buildinfo/build.go @@ -0,0 +1,29 @@ +package buildinfo + +var domain string +var mainPath string + +// git rev-parse HEAD +// git describe --always --abbrev=7 --dirty +var ( + // commitID, git commit id + commitID string + + // buildTime, build time, rfc3339 + buildTime string +) + +// git describe --tags --abbrev=0 +// git tag --sort=committerdate | tail -n 1 +var ( + // version, git tag + version string + + // project, project name + project string +) + +var ( + // release tag + release string +) diff --git a/buildinfo/version.go b/buildinfo/version.go index 3de8a3b..30fd2e2 100644 --- a/buildinfo/version.go +++ b/buildinfo/version.go @@ -11,42 +11,6 @@ import ( v "github.com/pubgo/funk/v2/buildinfo/version" ) -func CommitID() string { return commitID } -func MainPath() string { return mainPath } -func Version() string { return version } -func ReleaseVersion() string { return release } -func BuildTime() string { return buildTime } -func Project() string { return project } -func Domain() string { return domain } - -var domain string -var mainPath string - -// git rev-parse HEAD -// git describe --always --abbrev=7 --dirty -var ( - // commitID, git commit id - commitID string - - // buildTime, build time, rfc3339 - buildTime string -) - -// git describe --tags --abbrev=0 -// git tag --sort=committerdate | tail -n 1 -var ( - // version, git tag - version string - - // project, project name - project string -) - -var ( - // release tag - release string -) - func init() { bi, ok := debug.ReadBuildInfo() if !ok { diff --git a/cmds/testmain/main.go b/cmds/testmain/main.go index ad8ff8e..a1e8321 100644 --- a/cmds/testmain/main.go +++ b/cmds/testmain/main.go @@ -10,7 +10,7 @@ import ( "github.com/urfave/cli/v3" "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/buildinfo" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/pubgo/funk/v2/cliutils" "github.com/pubgo/funk/v2/cmds/versioncmd" "github.com/pubgo/funk/v2/ctxutil" @@ -22,7 +22,7 @@ func main() { Suggest: true, UseShortOptionHandling: true, ShellComplete: cli.DefaultAppComplete, - Version: buildinfo.Version(), + Version: version.Version(), Commands: []*cli.Command{ versioncmd.New(), }, diff --git a/cmds/versioncmd/cmd.go b/cmds/versioncmd/cmd.go index e855c03..5992be4 100644 --- a/cmds/versioncmd/cmd.go +++ b/cmds/versioncmd/cmd.go @@ -4,18 +4,17 @@ import ( "context" "fmt" - "github.com/urfave/cli/v3" - - "github.com/pubgo/funk/v2/buildinfo" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/pubgo/funk/v2/pretty" "github.com/pubgo/funk/v2/recovery" "github.com/pubgo/funk/v2/running" + "github.com/urfave/cli/v3" ) func New() *cli.Command { return &cli.Command{ Name: "version", - Usage: fmt.Sprintf("%s version info", buildinfo.Project()), + Usage: fmt.Sprintf("%s version info", version.Project()), Commands: []*cli.Command{ { Name: "validate", diff --git a/component/cloudevent/client.go b/component/cloudevent/client.go index 21e4ae4..e323fca 100644 --- a/component/cloudevent/client.go +++ b/component/cloudevent/client.go @@ -138,7 +138,7 @@ func (c *Client) initConsumer() (r error) { // A streaming consumer can only have one corresponding job handler assert.If(c.consumers[streamName][consumerName] != nil, "consumer %s already exists", consumerName) - metadata := map[string]string{"version": fmt.Sprintf("%s/%s", buildinfo.Project(), buildinfo.Version())} + metadata := map[string]string{"version": fmt.Sprintf("%s/%s", version.Project(), version.Version())} consumerCfg := jetstream.ConsumerConfig{ Name: consumerName, Durable: consumerName, diff --git a/features/_.go b/features/_.go new file mode 100644 index 0000000..1a1fa68 --- /dev/null +++ b/features/_.go @@ -0,0 +1,6 @@ +package features + +// 用于程序启动之后对程序内部进行控制的参数, 一般是全局性质的控制 +// 比如 stack 控制, 控制 panic 的时候或者遇到 error 的时候是否打印堆栈 +// 比如 某个新功能是否开启 +// 比如 临时调整阈值等 diff --git a/features/featureflags/flags.go b/features/featureflags/flags.go index 388123d..a4f319f 100644 --- a/features/featureflags/flags.go +++ b/features/featureflags/flags.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/pubgo/funk/v2/env" "github.com/pubgo/funk/v2/features" "github.com/urfave/cli/v3" ) @@ -11,55 +12,63 @@ import ( func GetFlags() []cli.Flag { var flags []cli.Flag features.VisitAll(func(flag *features.Flag) { + envVar := cli.EnvVars(env.Key("feature." + flag.Name)) + const category = "feature" switch flag.Value.Type() { - case "bool": + case features.BoolType: flags = append(flags, &cli.BoolFlag{ Name: flag.Name, Usage: flag.Usage, Value: flag.Value.Get().(bool), - Category: "feature", + Category: category, + Sources: envVar, Local: true, Action: func(ctx context.Context, command *cli.Command, b bool) error { return flag.Value.Set(fmt.Sprintf("%v", b)) }, }) - case "string": + case features.StringType: flags = append(flags, &cli.StringFlag{ Name: flag.Name, Usage: flag.Usage, Value: flag.Value.Get().(string), - Category: "feature", + Category: category, + Sources: envVar, Local: true, Action: func(ctx context.Context, command *cli.Command, s string) error { return flag.Value.Set(s) }, }) - case "json": + + case features.JsonType: flags = append(flags, &cli.StringFlag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.String(), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, s string) error { return flag.Value.Set(s) }, }) - case "int": + case features.IntType: flags = append(flags, &cli.IntFlag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.Get().(int), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, i int) error { return flag.Value.Set(fmt.Sprintf("%d", i)) }, }) - case "float": + case features.FloatType: flags = append(flags, &cli.Float64Flag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.Get().(float64), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, f float64) error { return flag.Value.Set(fmt.Sprintf("%f", f)) }, diff --git a/features/features.go b/features/features.go index 120fd41..7edd43d 100644 --- a/features/features.go +++ b/features/features.go @@ -1,12 +1,40 @@ package features import ( + "fmt" "sync" ) +type ValueType string + +func (typ ValueType) String() string { + switch typ { + case StringType: + return "string" + case IntType: + return "int" + case FloatType: + return "float" + case BoolType: + return "bool" + case JsonType: + return "json" + default: + return "unknown" + } +} + +const ( + StringType ValueType = "string" + IntType ValueType = "int" + FloatType ValueType = "float" + BoolType ValueType = "bool" + JsonType ValueType = "json" +) + type Value interface { String() string - Type() string + Type() ValueType Set(string) error Get() any } @@ -21,15 +49,13 @@ type Flag struct { type Feature struct { mutex sync.RWMutex - m map[string]*Flag + flags map[string]*Flag } -var defaultFeature = NewFeature() - // NewFeature creates a new Feature instance func NewFeature() *Feature { return &Feature{ - m: make(map[string]*Flag), + flags: make(map[string]*Flag), } } @@ -38,8 +64,12 @@ func (m *Feature) AddFunc(name string, usage string, value Value, tags ...map[st m.mutex.Lock() defer m.mutex.Unlock() + if m.flags[name] != nil { + panic(fmt.Sprintf("flag already exists, name:%s", name)) + } + ff := &Flag{Name: name, Usage: usage, Value: value, Tags: mergeTags(tags...)} - m.m[name] = ff + m.flags[name] = ff return ff } @@ -47,18 +77,20 @@ func (m *Feature) AddFunc(name string, usage string, value Value, tags ...map[st func (m *Feature) Lookup(name string) *Flag { m.mutex.RLock() defer m.mutex.RUnlock() - return m.m[name] + return m.flags[name] } // VisitAll calls fn for each entry func (m *Feature) VisitAll(fn func(*Flag)) { m.mutex.RLock() defer m.mutex.RUnlock() - for _, e := range m.m { + for _, e := range m.flags { fn(e) } } +var defaultFeature = NewFeature() + func Register(name string, usage string, value Value, tags ...map[string]any) { defaultFeature.AddFunc(name, usage, value, tags...) } diff --git a/features/types.go b/features/types.go index 6d64a34..85a85e7 100644 --- a/features/types.go +++ b/features/types.go @@ -4,116 +4,157 @@ import ( "encoding/json" "fmt" "strings" + + "github.com/k0kubun/pp/v3" ) -type StringValue struct { - val string - ff *Flag -} +var _ Value = (*baseValue[any])(nil) -func (s *StringValue) Type() string { return "string" } -func (s *StringValue) Name() string { return s.ff.Name } -func (s *StringValue) Get() any { return s.val } -func (s *StringValue) GetValue() string { return s.val } -func (s *StringValue) Set(val string) error { s.val = val; return nil } -func (s *StringValue) String() string { return s.val } - -func String(name, value, usage string, tags ...map[string]any) *StringValue { - s := &StringValue{val: value} - s.ff = defaultFeature.AddFunc(name, usage, s, tags...) - return s +func newBase[T any](f *Feature, name string, value T, usage string, typ ValueType, tags []map[string]any, set func(s string) (T, error), getString func(val T) string) *baseValue[T] { + base := &baseValue[T]{val: value, set: set, getString: getString, typ: typ} + base.ff = f.AddFunc(name, usage, base, tags...) + return base } -type IntValue struct { - val int64 - ff *Flag +type baseValue[T any] struct { + ff *Flag + typ ValueType + val T + set func(s string) (T, error) + getString func(val T) string } -func (i *IntValue) Type() string { return "int" } -func (i *IntValue) Name() string { return i.ff.Name } -func (i *IntValue) Get() any { return i.val } -func (i *IntValue) GetValue() int64 { return i.val } -func (i *IntValue) String() string { return fmt.Sprintf("%d", i.val) } -func (i *IntValue) Set(val string) error { - _, err := fmt.Sscanf(val, "%d", &i.val) - return err +func (b *baseValue[T]) Name() string { return b.ff.Name } +func (b *baseValue[T]) Type() ValueType { return b.typ } +func (b *baseValue[T]) Get() any { return b.val } +func (b *baseValue[T]) GetValue() T { return b.val } +func (b *baseValue[T]) Set(s string) error { + val, err := b.set(s) + if err != nil { + return fmt.Errorf("faield to set value, value=%s err=%w", s, err) + } + + b.val = val + return nil } +func (b *baseValue[T]) String() string { + if b.getString == nil { + return fmt.Sprintf("%v", b.val) + } -func Int(name string, value int64, usage string, tags ...map[string]any) *IntValue { - i := &IntValue{val: value} - i.ff = defaultFeature.AddFunc(name, usage, i, tags...) - return i + return b.getString(b.val) } -type FloatValue struct { - val float64 - ff *Flag +type StringValue struct { + *baseValue[string] } -func (f *FloatValue) Type() string { return "float" } -func (f *FloatValue) Name() string { return f.ff.Name } -func (f *FloatValue) Get() any { return f.val } -func (f *FloatValue) String() string { return fmt.Sprintf("%f", f.val) } -func (f *FloatValue) Set(val string) error { - _, err := fmt.Sscanf(val, "%f", &f.val) - return err +func String(name, value, usage string, tags ...map[string]any) StringValue { + base := newBase( + defaultFeature, + name, + value, + usage, + StringType, + tags, + func(s string) (string, error) { return s, nil }, + func(val string) string { return val }, + ) + return StringValue{baseValue: base} } -func Float(name string, value float64, usage string, tags ...map[string]any) *FloatValue { - f := &FloatValue{val: value} - f.ff = defaultFeature.AddFunc(name, usage, f, tags...) - return f +type IntValue struct { + *baseValue[int64] } -type BoolValue struct { - val bool - ff *Flag +func Int(name string, value int64, usage string, tags ...map[string]any) IntValue { + base := newBase( + defaultFeature, + name, + value, + usage, + IntType, + tags, + func(s string) (val int64, err error) { + _, err = fmt.Sscanf(s, "%d", &val) + return + }, + nil, + ) + return IntValue{baseValue: base} } -func (b *BoolValue) Type() string { return "bool" } -func (b *BoolValue) Name() string { return b.ff.Name } -func (b *BoolValue) Get() any { return b.val } -func (b *BoolValue) GetValue() bool { return b.val } -func (b *BoolValue) String() string { return fmt.Sprintf("%v", b.val) } -func (b *BoolValue) Set(val string) error { - switch strings.ToLower(val) { - case "true", "1", "on", "yes": - b.val = true - case "false", "0", "off", "no": - b.val = false - default: - b.val = len(val) > 0 - } - return nil +type FloatValue struct { + *baseValue[float64] } -func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolValue { - b := &BoolValue{val: value} - b.ff = defaultFeature.AddFunc(name, usage, b, tags...) - return b +func Float(name string, value float64, usage string, tags ...map[string]any) FloatValue { + base := newBase( + defaultFeature, + name, + value, + usage, + FloatType, + tags, + func(s string) (val float64, err error) { + _, err = fmt.Sscanf(s, "%f", &val) + return + }, + func(val float64) string { return fmt.Sprintf("%f", val) }, + ) + return FloatValue{baseValue: base} } -type JsonValue[T any] struct { - val T - ff *Flag +type BoolValue struct { + *baseValue[bool] } -func (t *JsonValue[T]) Type() string { return "json" } -func (t *JsonValue[T]) Name() string { return t.ff.Name } -func (t *JsonValue[T]) GetValue() T { return t.val } -func (t *JsonValue[T]) Get() any { return t.val } -func (t *JsonValue[T]) String() string { - data, err := json.Marshal(t.val) - if err != nil { - return err.Error() - } - return string(data) +func Bool(name string, value bool, usage string, tags ...map[string]any) BoolValue { + base := newBase( + defaultFeature, + name, + value, + usage, + BoolType, + tags, + func(s string) (val bool, err error) { + switch strings.ToLower(s) { + case "true", "1", "on", "yes": + return true, nil + case "false", "0", "off", "no": + return false, nil + default: + return len(s) > 0, nil + } + }, + func(val bool) string { return fmt.Sprintf("%v", val) }, + ) + return BoolValue{baseValue: base} } -func (t *JsonValue[T]) Set(val string) error { - return json.Unmarshal([]byte(val), &t.val) + +type JsonValue[T any] struct { + *baseValue[T] } -func Json[T any](name string, value T, usage string, tags ...map[string]any) *JsonValue[T] { - t := &JsonValue[T]{val: value} - t.ff = defaultFeature.AddFunc(name, usage, t, tags...) - return t + +func Json[T any](name string, value T, usage string, tags ...map[string]any) JsonValue[T] { + base := newBase[T]( + defaultFeature, + name, + value, + usage, + JsonType, + tags, + func(s string) (val T, err error) { + return val, json.Unmarshal([]byte(s), &val) + }, + func(val T) string { + data, err := json.Marshal(val) + if err != nil { + _, _ = pp.Println(val) + return err.Error() + } + return string(data) + }, + ) + return JsonValue[T]{baseValue: base} } diff --git a/migrates/entmigrates/migrate.go b/migrates/entmigrates/migrate.go index b11f0a8..ddd0f26 100644 --- a/migrates/entmigrates/migrate.go +++ b/migrates/entmigrates/migrate.go @@ -22,7 +22,7 @@ import ( "gorm.io/gorm/logger" "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/buildinfo" + "github.com/pubgo/funk/v2/buildinfo/version" "github.com/pubgo/funk/v2/config" "github.com/pubgo/funk/v2/errors" "github.com/pubgo/funk/v2/generic" @@ -149,7 +149,7 @@ func %s() *entmigrates.Migration { DataMigrate: nil, } } -`, name, name, fmt.Sprint(now.String(), " ", buildinfo.Version()), name)) +`, name, name, fmt.Sprint(now.String(), " ", version.Version()), name)) filename = filepath.Join(g.config.MigrationPath, fmt.Sprintf("%s.go", name)) err = os.WriteFile(filename, []byte(genFile.GoString()), 0o644) diff --git a/result/util.go b/result/util.go index ea3a418..a9d5288 100644 --- a/result/util.go +++ b/result/util.go @@ -12,9 +12,7 @@ import ( "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" - "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result/resultchecker" @@ -30,12 +28,13 @@ func try(fn func() error) (gErr error) { } defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) - errors.Debug(gErr) } - gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn).String()) + if gErr != nil { + gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn).String()) + } }() gErr = fn() @@ -49,7 +48,7 @@ func tryResult[T any](fn func() Result[T]) (r Result[T]) { defer func() { var gErr error - if err := errors.Parse(recover()); !funk.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) } @@ -69,9 +68,8 @@ func try1[T any](fn func() (T, error)) (t T, gErr error) { } defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) - errors.Debug(gErr) } if gErr != nil { @@ -181,7 +179,7 @@ func errRecovery(getErr func() error, callbacks ...func(err error) error) error } } - debug.PrintStack() + stack.PrintStack() return err } From ea17e198394c099f26dfa30b20fd3885783de5bc Mon Sep 17 00:00:00 2001 From: barry Date: Mon, 13 Oct 2025 11:06:25 +0800 Subject: [PATCH 38/43] chore: quick update fix/version at 2025-10-17 10:27:45 --- cmds/go.mod | 67 ------ cmds/go.sum | 174 -------------- component/go.mod | 90 -------- component/go.sum | 406 --------------------------------- features/_.go | 6 + features/featureflags/flags.go | 29 ++- features/features.go | 44 +++- features/types.go | 209 ++++++++++------- go.mod | 72 +++--- go.sum | 297 ++++++++++-------------- result/util.go | 16 +- 11 files changed, 364 insertions(+), 1046 deletions(-) delete mode 100644 cmds/go.mod delete mode 100644 cmds/go.sum delete mode 100644 component/go.mod delete mode 100644 component/go.sum create mode 100644 features/_.go diff --git a/cmds/go.mod b/cmds/go.mod deleted file mode 100644 index 48a3bc0..0000000 --- a/cmds/go.mod +++ /dev/null @@ -1,67 +0,0 @@ -module github.com/pubgo/funk/v2/cmds - -go 1.23.0 - -replace github.com/pubgo/funk/v2 => ../ - -replace github.com/pubgo/funk/v2/component => ../component - -require ( - entgo.io/ent v0.13.1 - github.com/dave/jennifer v1.7.0 - github.com/iancoleman/strcase v0.2.0 - github.com/moby/term v0.5.0 - github.com/pubgo/funk/v2 v2.0.0-00010101000000-000000000000 - github.com/pubgo/funk/v2/component v0.0.0-00010101000000-000000000000 - github.com/samber/lo v1.51.0 - github.com/urfave/cli/v3 v3.4.1 - google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - ariga.io/atlas v0.21.1 // indirect - dario.cat/mergo v1.0.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/a8m/envsubst v1.4.2 // indirect - github.com/agext/levenshtein v1.2.1 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/ettle/strcase v0.2.0 // indirect - github.com/expr-lang/expr v1.17.5 // indirect - github.com/go-openapi/inflect v0.19.0 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl/v2 v2.13.0 // indirect - github.com/joho/godotenv v1.5.1 // indirect - github.com/k0kubun/pp/v3 v3.5.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect - github.com/nats-io/nats.go v1.37.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/panjf2000/ants/v2 v2.10.0 // indirect - github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect - github.com/rs/xid v1.5.0 // indirect - github.com/rs/zerolog v1.33.0 // indirect - github.com/samber/slog-common v0.19.0 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/zclconf/go-cty v1.8.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.33.0 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect - google.golang.org/grpc v1.66.1 // indirect -) diff --git a/cmds/go.sum b/cmds/go.sum deleted file mode 100644 index 6686326..0000000 --- a/cmds/go.sum +++ /dev/null @@ -1,174 +0,0 @@ -ariga.io/atlas v0.21.1 h1:Eg9XYhKTH3UHoqP7tKMWFV+Z5JnpVOJCgO3MHrUtKmk= -ariga.io/atlas v0.21.1/go.mod h1:VPlcXdd4w2KqKnH54yEZcry79UAhpaWaxEsmn5JRNoE= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= -entgo.io/ent v0.13.1/go.mod h1:qCEmo+biw3ccBn9OyL4ZK5dfpwg++l1Gxwac5B1206A= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= -github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= -github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= -github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= -github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= -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= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= -github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= -github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k= -github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= -github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= -github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc= -github.com/hashicorp/hcl/v2 v2.13.0/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/k0kubun/pp/v3 v3.5.0 h1:iYNlYA5HJAJvkD4ibuf9c8y6SHM0QFhaBuCqm1zHp0w= -github.com/k0kubun/pp/v3 v3.5.0/go.mod h1:5lzno5ZZeEeTV/Ky6vs3g6d1U3WarDrH8k240vMtGro= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -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-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= -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/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q= -github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= -github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/samber/slog-common v0.19.0 h1:fNcZb8B2uOLooeYwFpAlKjkQTUafdjfqKcwcC89G9YI= -github.com/samber/slog-common v0.19.0/go.mod h1:dTz+YOU76aH007YUU0DffsXNsGFQRQllPQh9XyNoA3M= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -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= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/urfave/cli/v3 v3.4.1 h1:1M9UOCy5bLmGnuu1yn3t3CB4rG79Rtoxuv1sPhnm6qM= -github.com/urfave/cli/v3 v3.4.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= -github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= -golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/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.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 h1:+rdxYoE3E5htTEWIe15GlN6IfvbURM//Jt0mmkmm6ZU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= -google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -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= diff --git a/component/go.mod b/component/go.mod deleted file mode 100644 index 97ab5eb..0000000 --- a/component/go.mod +++ /dev/null @@ -1,90 +0,0 @@ -module github.com/pubgo/funk/v2/component - -go 1.23.0 - -replace github.com/pubgo/funk/v2 => ../ - -require ( - github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/deckarep/golang-set/v2 v2.6.0 - github.com/nats-io/nats.go v1.37.0 - github.com/panjf2000/ants/v2 v2.10.0 - github.com/pubgo/funk/v2 v2.0.0-00010101000000-000000000000 - github.com/rs/xid v1.5.0 - github.com/rs/zerolog v1.33.0 - github.com/samber/lo v1.51.0 - github.com/stretchr/testify v1.10.0 - github.com/tidwall/match v1.1.1 - go.etcd.io/bbolt v1.3.7 - go.etcd.io/etcd/client/v3 v3.5.9 - google.golang.org/grpc v1.66.1 - google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 - gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/mysql v1.4.5 - gorm.io/driver/postgres v1.4.1 - gorm.io/driver/sqlite v1.4.4 - gorm.io/gen v0.3.21 - gorm.io/gorm v1.24.5 -) - -require ( - dario.cat/mergo v1.0.0 // indirect - github.com/a8m/envsubst v1.4.2 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ettle/strcase v0.2.0 // indirect - github.com/expr-lang/expr v1.17.5 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.14.3 // indirect - github.com/jackc/pgio v1.0.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.3 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgtype v1.14.0 // indirect - github.com/jackc/pgx/v4 v4.18.3 // indirect - github.com/jinzhu/copier v0.4.0 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/joho/godotenv v1.5.1 // indirect - github.com/k0kubun/pp/v3 v3.5.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.9 // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/nats-io/nkeys v0.4.7 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect - github.com/samber/slog-common v0.19.0 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.17.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.33.0 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gorm.io/datatypes v1.0.7 // indirect - gorm.io/hints v1.1.0 // indirect - gorm.io/plugin/dbresolver v1.3.0 // indirect -) diff --git a/component/go.sum b/component/go.sum deleted file mode 100644 index 39095c7..0000000 --- a/component/go.sum +++ /dev/null @@ -1,406 +0,0 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= -github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -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= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/denisenkom/go-mssqldb v0.12.2 h1:1OcPn5GBIobjWNd+8yjfHNIaFX14B1pWI3F9HZy5KXw= -github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= -github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= -github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k= -github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= -github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= -github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= -github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= -github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= -github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= -github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/k0kubun/pp/v3 v3.5.0 h1:iYNlYA5HJAJvkD4ibuf9c8y6SHM0QFhaBuCqm1zHp0w= -github.com/k0kubun/pp/v3 v3.5.0/go.mod h1:5lzno5ZZeEeTV/Ky6vs3g6d1U3WarDrH8k240vMtGro= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -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.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -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.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -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-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= -github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= -github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -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/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q= -github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= -github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/samber/slog-common v0.19.0 h1:fNcZb8B2uOLooeYwFpAlKjkQTUafdjfqKcwcC89G9YI= -github.com/samber/slog-common v0.19.0/go.mod h1:dTz+YOU76aH007YUU0DffsXNsGFQRQllPQh9XyNoA3M= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= -golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 h1:+rdxYoE3E5htTEWIe15GlN6IfvbURM//Jt0mmkmm6ZU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= -google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gorm.io/datatypes v1.0.7 h1:8NhJN4+annFjwV1WufDhFiPjdUvV1lSGUdg1UCjQIWY= -gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/mysql v1.4.5 h1:u1lytId4+o9dDaNcPCFzNv7h6wvmc92UjNk3z8enSBU= -gorm.io/driver/mysql v1.4.5/go.mod h1:SxzItlnT1cb6e1e4ZRpgJN2VYtcqJgqnHxWr4wsP8oc= -gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw= -gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= -gorm.io/driver/postgres v1.4.1/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= -gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= -gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= -gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= -gorm.io/driver/sqlserver v1.4.0 h1:3fjbsNkr/YqocSBW5CP16Lq6+APjRrWMzu7NbkXr9QU= -gorm.io/driver/sqlserver v1.4.0/go.mod h1:P8BSbBwkdzXURYx3pWUSEAABRQU0vxbd6xk5+53pg7g= -gorm.io/gen v0.3.21 h1:t8329wT4tW1ZZWOm7vn4LV6OIrz8a5zCg+p78ezt+rA= -gorm.io/gen v0.3.21/go.mod h1:aWgvoKdG9f8Des4TegSa0N5a+gwhGsFo0JJMaLwokvk= -gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= -gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= -gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= -gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M= -gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/features/_.go b/features/_.go new file mode 100644 index 0000000..1a1fa68 --- /dev/null +++ b/features/_.go @@ -0,0 +1,6 @@ +package features + +// 用于程序启动之后对程序内部进行控制的参数, 一般是全局性质的控制 +// 比如 stack 控制, 控制 panic 的时候或者遇到 error 的时候是否打印堆栈 +// 比如 某个新功能是否开启 +// 比如 临时调整阈值等 diff --git a/features/featureflags/flags.go b/features/featureflags/flags.go index 388123d..a4f319f 100644 --- a/features/featureflags/flags.go +++ b/features/featureflags/flags.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/pubgo/funk/v2/env" "github.com/pubgo/funk/v2/features" "github.com/urfave/cli/v3" ) @@ -11,55 +12,63 @@ import ( func GetFlags() []cli.Flag { var flags []cli.Flag features.VisitAll(func(flag *features.Flag) { + envVar := cli.EnvVars(env.Key("feature." + flag.Name)) + const category = "feature" switch flag.Value.Type() { - case "bool": + case features.BoolType: flags = append(flags, &cli.BoolFlag{ Name: flag.Name, Usage: flag.Usage, Value: flag.Value.Get().(bool), - Category: "feature", + Category: category, + Sources: envVar, Local: true, Action: func(ctx context.Context, command *cli.Command, b bool) error { return flag.Value.Set(fmt.Sprintf("%v", b)) }, }) - case "string": + case features.StringType: flags = append(flags, &cli.StringFlag{ Name: flag.Name, Usage: flag.Usage, Value: flag.Value.Get().(string), - Category: "feature", + Category: category, + Sources: envVar, Local: true, Action: func(ctx context.Context, command *cli.Command, s string) error { return flag.Value.Set(s) }, }) - case "json": + + case features.JsonType: flags = append(flags, &cli.StringFlag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.String(), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, s string) error { return flag.Value.Set(s) }, }) - case "int": + case features.IntType: flags = append(flags, &cli.IntFlag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.Get().(int), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, i int) error { return flag.Value.Set(fmt.Sprintf("%d", i)) }, }) - case "float": + case features.FloatType: flags = append(flags, &cli.Float64Flag{ - Category: "feature", + Category: category, Usage: flag.Usage, Value: flag.Value.Get().(float64), Local: true, + Sources: envVar, Action: func(ctx context.Context, command *cli.Command, f float64) error { return flag.Value.Set(fmt.Sprintf("%f", f)) }, diff --git a/features/features.go b/features/features.go index 120fd41..6b3e265 100644 --- a/features/features.go +++ b/features/features.go @@ -1,12 +1,40 @@ package features import ( + "fmt" "sync" ) +type ValueType string + +func (typ ValueType) String() string { + switch typ { + case StringType: + return "string" + case IntType: + return "int" + case FloatType: + return "float" + case BoolType: + return "bool" + case JsonType: + return "json" + default: + return "unknown" + } +} + +const ( + StringType ValueType = "string" + IntType ValueType = "int" + FloatType ValueType = "float" + BoolType ValueType = "bool" + JsonType ValueType = "json" +) + type Value interface { String() string - Type() string + Type() ValueType Set(string) error Get() any } @@ -21,7 +49,7 @@ type Flag struct { type Feature struct { mutex sync.RWMutex - m map[string]*Flag + flags map[string]*Flag } var defaultFeature = NewFeature() @@ -29,7 +57,7 @@ var defaultFeature = NewFeature() // NewFeature creates a new Feature instance func NewFeature() *Feature { return &Feature{ - m: make(map[string]*Flag), + flags: make(map[string]*Flag), } } @@ -38,8 +66,12 @@ func (m *Feature) AddFunc(name string, usage string, value Value, tags ...map[st m.mutex.Lock() defer m.mutex.Unlock() + if m.flags[name] != nil { + panic(fmt.Sprintf("flag already exists, name:%s", name)) + } + ff := &Flag{Name: name, Usage: usage, Value: value, Tags: mergeTags(tags...)} - m.m[name] = ff + m.flags[name] = ff return ff } @@ -47,14 +79,14 @@ func (m *Feature) AddFunc(name string, usage string, value Value, tags ...map[st func (m *Feature) Lookup(name string) *Flag { m.mutex.RLock() defer m.mutex.RUnlock() - return m.m[name] + return m.flags[name] } // VisitAll calls fn for each entry func (m *Feature) VisitAll(fn func(*Flag)) { m.mutex.RLock() defer m.mutex.RUnlock() - for _, e := range m.m { + for _, e := range m.flags { fn(e) } } diff --git a/features/types.go b/features/types.go index 6d64a34..e54c6d9 100644 --- a/features/types.go +++ b/features/types.go @@ -6,114 +6,153 @@ import ( "strings" ) -type StringValue struct { - val string - ff *Flag -} +var _ Value = (*baseValue[any])(nil) -func (s *StringValue) Type() string { return "string" } -func (s *StringValue) Name() string { return s.ff.Name } -func (s *StringValue) Get() any { return s.val } -func (s *StringValue) GetValue() string { return s.val } -func (s *StringValue) Set(val string) error { s.val = val; return nil } -func (s *StringValue) String() string { return s.val } - -func String(name, value, usage string, tags ...map[string]any) *StringValue { - s := &StringValue{val: value} - s.ff = defaultFeature.AddFunc(name, usage, s, tags...) - return s +func newBase[T any](f *Feature, name string, value T, usage string, typ ValueType, tags []map[string]any, set func(s string) (T, error), getString func(val T) string) *baseValue[T] { + base := &baseValue[T]{val: value, set: set, getString: getString, typ: typ} + base.ff = f.AddFunc(name, usage, base, tags...) + return base } -type IntValue struct { - val int64 - ff *Flag +type baseValue[T any] struct { + ff *Flag + typ ValueType + val T + set func(s string) (T, error) + getString func(val T) string } -func (i *IntValue) Type() string { return "int" } -func (i *IntValue) Name() string { return i.ff.Name } -func (i *IntValue) Get() any { return i.val } -func (i *IntValue) GetValue() int64 { return i.val } -func (i *IntValue) String() string { return fmt.Sprintf("%d", i.val) } -func (i *IntValue) Set(val string) error { - _, err := fmt.Sscanf(val, "%d", &i.val) - return err +func (b *baseValue[T]) Name() string { return b.ff.Name } +func (b *baseValue[T]) Type() ValueType { return b.typ } +func (b *baseValue[T]) Set(s string) error { + val, err := b.set(s) + if err != nil { + return err + } + + b.val = val + return nil } -func Int(name string, value int64, usage string, tags ...map[string]any) *IntValue { - i := &IntValue{val: value} - i.ff = defaultFeature.AddFunc(name, usage, i, tags...) - return i +func (b *baseValue[T]) Get() any { return b.val } +func (b *baseValue[T]) GetValue() T { return b.val } +func (b *baseValue[T]) String() string { + if b.getString == nil { + return fmt.Sprintf("%v", b.val) + } + + return b.getString(b.val) } -type FloatValue struct { - val float64 - ff *Flag +type StringValue struct { + *baseValue[string] } -func (f *FloatValue) Type() string { return "float" } -func (f *FloatValue) Name() string { return f.ff.Name } -func (f *FloatValue) Get() any { return f.val } -func (f *FloatValue) String() string { return fmt.Sprintf("%f", f.val) } -func (f *FloatValue) Set(val string) error { - _, err := fmt.Sscanf(val, "%f", &f.val) - return err +func String(name, value, usage string, tags ...map[string]any) StringValue { + base := newBase( + defaultFeature, + name, + value, + usage, + StringType, + tags, + func(s string) (string, error) { return s, nil }, + func(val string) string { return val }, + ) + return StringValue{baseValue: base} } -func Float(name string, value float64, usage string, tags ...map[string]any) *FloatValue { - f := &FloatValue{val: value} - f.ff = defaultFeature.AddFunc(name, usage, f, tags...) - return f +type IntValue struct { + *baseValue[int64] } -type BoolValue struct { - val bool - ff *Flag +func Int(name string, value int64, usage string, tags ...map[string]any) IntValue { + base := newBase( + defaultFeature, + name, + value, + usage, + IntType, + tags, + func(s string) (val int64, err error) { + _, err = fmt.Sscanf(s, "%d", &val) + return + }, + nil, + ) + return IntValue{baseValue: base} } -func (b *BoolValue) Type() string { return "bool" } -func (b *BoolValue) Name() string { return b.ff.Name } -func (b *BoolValue) Get() any { return b.val } -func (b *BoolValue) GetValue() bool { return b.val } -func (b *BoolValue) String() string { return fmt.Sprintf("%v", b.val) } -func (b *BoolValue) Set(val string) error { - switch strings.ToLower(val) { - case "true", "1", "on", "yes": - b.val = true - case "false", "0", "off", "no": - b.val = false - default: - b.val = len(val) > 0 - } - return nil +type FloatValue struct { + *baseValue[float64] } -func Bool(name string, value bool, usage string, tags ...map[string]any) *BoolValue { - b := &BoolValue{val: value} - b.ff = defaultFeature.AddFunc(name, usage, b, tags...) - return b +func Float(name string, value float64, usage string, tags ...map[string]any) FloatValue { + base := newBase( + defaultFeature, + name, + value, + usage, + FloatType, + tags, + func(s string) (val float64, err error) { + _, err = fmt.Sscanf(s, "%f", &val) + return + }, + func(val float64) string { return fmt.Sprintf("%f", val) }, + ) + return FloatValue{baseValue: base} } -type JsonValue[T any] struct { - val T - ff *Flag +type BoolValue struct { + *baseValue[bool] } -func (t *JsonValue[T]) Type() string { return "json" } -func (t *JsonValue[T]) Name() string { return t.ff.Name } -func (t *JsonValue[T]) GetValue() T { return t.val } -func (t *JsonValue[T]) Get() any { return t.val } -func (t *JsonValue[T]) String() string { - data, err := json.Marshal(t.val) - if err != nil { - return err.Error() - } - return string(data) +func Bool(name string, value bool, usage string, tags ...map[string]any) BoolValue { + base := newBase( + defaultFeature, + name, + value, + usage, + BoolType, + tags, + func(s string) (val bool, err error) { + switch strings.ToLower(s) { + case "true", "1", "on", "yes": + return true, nil + case "false", "0", "off", "no": + return false, nil + default: + return len(s) > 0, nil + } + }, + func(val bool) string { return fmt.Sprintf("%v", val) }, + ) + return BoolValue{baseValue: base} } -func (t *JsonValue[T]) Set(val string) error { - return json.Unmarshal([]byte(val), &t.val) + +type JsonValue[T any] struct { + *baseValue[T] } -func Json[T any](name string, value T, usage string, tags ...map[string]any) *JsonValue[T] { - t := &JsonValue[T]{val: value} - t.ff = defaultFeature.AddFunc(name, usage, t, tags...) - return t + +func Json[T any](name string, value T, usage string, tags ...map[string]any) JsonValue[T] { + base := newBase[T]( + defaultFeature, + name, + value, + usage, + JsonType, + tags, + func(s string) (val T, err error) { + return val, json.Unmarshal([]byte(s), &val) + }, + func(val T) string { + data, err := json.Marshal(val) + if err != nil { + return err.Error() + } + return string(data) + }, + ) + return JsonValue[T]{baseValue: base} } diff --git a/go.mod b/go.mod index b3c3011..04520a5 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,19 @@ module github.com/pubgo/funk/v2 -go 1.23.0 +go 1.24 require ( dario.cat/mergo v1.0.0 entgo.io/ent v0.13.1 + github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/a8m/envsubst v1.4.2 github.com/bradleyjkemp/memviz v0.2.3 github.com/dave/jennifer v1.7.0 github.com/deckarep/golang-set/v2 v2.6.0 - github.com/dustin/go-humanize v1.0.0 + github.com/dustin/go-humanize v1.0.1 github.com/ettle/strcase v0.2.0 github.com/expr-lang/expr v1.17.5 - github.com/google/go-cmp v0.6.0 + github.com/google/go-cmp v0.7.0 github.com/gopherjs/gopherjs v1.17.2 github.com/hashicorp/go-version v1.6.0 github.com/huandu/go-clone v1.5.1 @@ -22,9 +23,12 @@ require ( github.com/joho/godotenv v1.5.1 github.com/k0kubun/pp/v3 v3.5.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.16 + github.com/mattn/go-sqlite3 v1.14.22 github.com/mitchellh/mapstructure v1.5.0 + github.com/moby/term v0.5.0 + github.com/nats-io/nats.go v1.47.0 github.com/open2b/scriggo v0.56.1 + github.com/panjf2000/ants/v2 v2.11.3 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/phuslu/goid v1.0.0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 @@ -36,9 +40,12 @@ require ( github.com/testcontainers/testcontainers-go v0.30.0 github.com/testcontainers/testcontainers-go/modules/postgres v0.30.0 github.com/tidwall/gjson v1.17.1 + github.com/tidwall/match v1.1.1 github.com/urfave/cli/v3 v3.4.1 github.com/valyala/fastrand v1.1.0 github.com/valyala/fasttemplate v1.2.2 + go.etcd.io/bbolt v1.3.7 + go.etcd.io/etcd/client/v3 v3.6.5 go.uber.org/atomic v1.10.0 golang.org/x/crypto v0.38.0 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb @@ -46,19 +53,22 @@ require ( golang.org/x/sys v0.33.0 golang.org/x/text v0.26.0 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 - google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 - google.golang.org/grpc v1.66.1 - google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 + google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb + google.golang.org/grpc v1.71.1 + google.golang.org/protobuf v1.36.5 gopkg.in/yaml.v3 v3.0.1 - gorm.io/driver/postgres v1.4.1 - gorm.io/gorm v1.24.5 + gorm.io/driver/mysql v1.6.0 + gorm.io/driver/postgres v1.5.0 + gorm.io/driver/sqlite v1.6.0 + gorm.io/gen v0.3.27 + gorm.io/gorm v1.30.0 modernc.org/sqlite v1.18.0 ) require ( ariga.io/atlas v0.21.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/agext/levenshtein v1.2.1 // indirect @@ -66,6 +76,8 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/containerd/containerd v1.7.12 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/coreos/go-semver v0.3.1 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -73,27 +85,25 @@ require ( github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/hashicorp/hcl/v2 v2.13.0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.14.3 // indirect - github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.3 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgtype v1.14.0 // indirect - github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect + github.com/jackc/pgx/v5 v5.5.5 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.17.7 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.14 // indirect @@ -101,36 +111,42 @@ require ( github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect - github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/zclconf/go-cty v1.8.0 // indirect + go.etcd.io/etcd/api/v3 v3.6.5 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.5 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.26.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect - go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/sdk v1.26.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/net v0.40.0 // indirect golang.org/x/sync v0.15.0 // indirect golang.org/x/tools v0.33.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect + gorm.io/datatypes v1.2.4 // indirect + gorm.io/hints v1.1.0 // indirect + gorm.io/plugin/dbresolver v1.5.0 // indirect lukechampine.com/uint128 v1.1.1 // indirect modernc.org/cc/v3 v3.36.0 // indirect modernc.org/ccgo/v3 v3.16.6 // indirect diff --git a/go.sum b/go.sum index f728678..d1d1d78 100644 --- a/go.sum +++ b/go.sum @@ -4,15 +4,14 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= entgo.io/ent v0.13.1 h1:uD8QwN1h6SNphdCCzmkMN3feSUzNnVvV/WIkHKMbzOE= entgo.io/ent v0.13.1/go.mod h1:qCEmo+biw3ccBn9OyL4ZK5dfpwg++l1Gxwac5B1206A= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= @@ -29,18 +28,16 @@ github.com/bradleyjkemp/memviz v0.2.3 h1:8fqKnV1xQz4NQkDy5Gklhm9fGtUK+R3oW0z1unB github.com/bradleyjkemp/memviz v0.2.3/go.mod h1:meU694rvawW7NqtNLtlg+TEU+UqAjrbJayEPZQUSOBs= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -59,49 +56,54 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/expr-lang/expr v1.17.5 h1:i1WrMvcdLF249nSNlpQZN1S6NXuW9WaOfF5tPi3aw3k= github.com/expr-lang/expr v1.17.5/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc= @@ -116,64 +118,22 @@ github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHL github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= -github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= -github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= -github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= -github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= -github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= -github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= -github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -186,44 +146,38 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:C github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 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.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -238,18 +192,24 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= +github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/open2b/scriggo v0.56.1 h1:h3IVNM0OEvszbtdmukaJj9lPo/xSvHPclYm/RqQqUxY= github.com/open2b/scriggo v0.56.1/go.mod h1:FJS0k7CaKq2sNlrqAGMwU4dCltYqC1c+Eak3dj5w26Q= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= +github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/phuslu/goid v1.0.0 h1:Cgcvd/R54UO1fCtyt+iKXAi+yZQ/KWlAm6MmZNizCLM= github.com/phuslu/goid v1.0.0/go.mod h1:txc2fUIdrdnn+v9Vq+QpiPQ3dnrXEchjoVDgic+r+L0= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -260,22 +220,17 @@ github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0 github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582/go.mod h1:3G3BRKui7nMuDFAZKR/M2hiOLtaOmyukT20g88qRQjI= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/samber/slog-common v0.19.0 h1:fNcZb8B2uOLooeYwFpAlKjkQTUafdjfqKcwcC89G9YI= github.com/samber/slog-common v0.19.0/go.mod h1:dTz+YOU76aH007YUU0DffsXNsGFQRQllPQh9XyNoA3M= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= @@ -284,26 +239,20 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -333,98 +282,94 @@ github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.6.5 h1:pMMc42276sgR1j1raO/Qv3QI9Af/AuyQUW6CBAWuntA= +go.etcd.io/etcd/api/v3 v3.6.5/go.mod h1:ob0/oWA/UQQlT1BmaEkWQzI0sJ1M0Et0mMpaABxguOQ= +go.etcd.io/etcd/client/pkg/v3 v3.6.5 h1:Duz9fAzIZFhYWgRjp/FgNq2gO1jId9Yae/rLn3RrBP8= +go.etcd.io/etcd/client/pkg/v3 v3.6.5/go.mod h1:8Wx3eGRPiy0qOFMZT/hfvdos+DjEaPxdIDiCDUv/FQk= +go.etcd.io/etcd/client/v3 v3.6.5 h1:yRwZNFBx/35VKHTcLDeO7XVLbCBFbPi+XV4OC3QJf2U= +go.etcd.io/etcd/client/v3 v3.6.5/go.mod h1:ZqwG/7TAFZ0BJ0jXRPoJjKQJtbFo/9NIY8uoFFKcCyo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= -go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20220715151400-c0bba94af5f8/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -432,67 +377,77 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 h1:+rdxYoE3E5htTEWIe15GlN6IfvbURM//Jt0mmkmm6ZU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= -google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689 h1:hNwajDgT0MlsxZzlUajZVmUYFpts8/CYe4BSNx503ZE= -google.golang.org/protobuf v1.34.3-0.20240816073751-94ecbc261689/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= +google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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= -gorm.io/driver/postgres v1.4.1 h1:DutsKq2LK2Ag65q/+VygWth0/L4GAVOp+sCtg6WzZjs= -gorm.io/driver/postgres v1.4.1/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= -gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/datatypes v1.2.4 h1:uZmGAcK/QZ0uyfCuVg0VQY1ZmV9h1fuG0tMwKByO1z4= +gorm.io/datatypes v1.2.4/go.mod h1:f4BsLcFAX67szSv8svwLRjklArSHAvHLeE3pXAS5DZI= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= +gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= +gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= +gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= +gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= +gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= +gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= +gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= +gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as= +gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= +gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= +gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY= +gorm.io/plugin/dbresolver v1.5.0/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0 h1:0kmRkTmqNidmu3c7BNDSdVHCxXCkWLmWmCIVX4LUboo= diff --git a/result/util.go b/result/util.go index ea3a418..a9d5288 100644 --- a/result/util.go +++ b/result/util.go @@ -12,9 +12,7 @@ import ( "github.com/samber/lo" "google.golang.org/protobuf/encoding/prototext" - "github.com/pubgo/funk/v2" "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/log/logfields" "github.com/pubgo/funk/v2/result/resultchecker" @@ -30,12 +28,13 @@ func try(fn func() error) (gErr error) { } defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) - errors.Debug(gErr) } - gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn).String()) + if gErr != nil { + gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn).String()) + } }() gErr = fn() @@ -49,7 +48,7 @@ func tryResult[T any](fn func() Result[T]) (r Result[T]) { defer func() { var gErr error - if err := errors.Parse(recover()); !funk.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) } @@ -69,9 +68,8 @@ func try1[T any](fn func() (T, error)) (t T, gErr error) { } defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { + if err := errors.Parse(recover()); err != nil { gErr = errors.WrapStack(err) - errors.Debug(gErr) } if gErr != nil { @@ -181,7 +179,7 @@ func errRecovery(getErr func() error, callbacks ...func(err error) error) error } } - debug.PrintStack() + stack.PrintStack() return err } From 580ab5d33d862af0e318a75c3ed82d4a965f8582 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 17 Oct 2025 11:28:46 +0800 Subject: [PATCH 39/43] chore: quick update fix/version at 2025-10-18 20:49:51 --- assert/aaa.go | 4 + assert/must_test.go | 5 + assert/util.go | 6 + component/cloudevent/client.go | 22 +- internal/anyhow/aherrcheck/context.go | 29 -- internal/anyhow/aherrcheck/errcheck.go | 47 --- internal/anyhow/aherrcheck/errcheck_test.go | 26 -- internal/anyhow/anyhow.go | 154 --------- internal/anyhow/error.go | 128 ------- internal/anyhow/error_test.go | 11 - internal/anyhow/interface.go | 16 - internal/anyhow/result.go | 212 ------------ internal/anyhow/result_test.go | 89 ----- internal/anyhow/util.go | 207 ------------ internal/example/app/main.go | 31 -- internal/example/env/main.go | 13 - log/impl.log.go | 13 +- proto/cloudevent/options.pb.go | 124 +++++++ proto/cloudevent/types.pb.go | 351 ++++++++++++++++++++ running/runtime.go | 4 +- 20 files changed, 512 insertions(+), 980 deletions(-) delete mode 100644 internal/anyhow/aherrcheck/context.go delete mode 100644 internal/anyhow/aherrcheck/errcheck.go delete mode 100644 internal/anyhow/aherrcheck/errcheck_test.go delete mode 100644 internal/anyhow/anyhow.go delete mode 100644 internal/anyhow/error.go delete mode 100644 internal/anyhow/error_test.go delete mode 100644 internal/anyhow/interface.go delete mode 100644 internal/anyhow/result.go delete mode 100644 internal/anyhow/result_test.go delete mode 100644 internal/anyhow/util.go delete mode 100644 internal/example/app/main.go delete mode 100644 internal/example/env/main.go create mode 100644 proto/cloudevent/options.pb.go create mode 100644 proto/cloudevent/types.pb.go diff --git a/assert/aaa.go b/assert/aaa.go index 9e705d9..f0c1578 100644 --- a/assert/aaa.go +++ b/assert/aaa.go @@ -1,3 +1,7 @@ package assert +import "github.com/pubgo/funk/v2/features" + const Name = "assert" + +var FeatureDebugMode = features.Bool("assert.debug_mode", false, "debug mode, pretty stack and error") diff --git a/assert/must_test.go b/assert/must_test.go index af2834b..694080e 100644 --- a/assert/must_test.go +++ b/assert/must_test.go @@ -57,6 +57,11 @@ func init1Next() (err error) { return nil } +func TestDebugMode(t *testing.T) { + assert1.Exit(assert1.FeatureDebugMode.Set("true")) + assert1.Must(fmt.Errorf("test next")) +} + func BenchmarkNoPanic(b *testing.B) { for i := 0; i < b.N; i++ { _ = func() (err error) { diff --git a/assert/util.go b/assert/util.go index 0c673ab..9669b70 100644 --- a/assert/util.go +++ b/assert/util.go @@ -77,6 +77,12 @@ func must(err error, messageArgs ...any) { } logErr(err, message, attrs...) + + if FeatureDebugMode.GetValue() { + _, _ = pp.Println(err) + debug.PrintStack() + } + panic(err) } diff --git a/component/cloudevent/client.go b/component/cloudevent/client.go index 5772864..29ae962 100644 --- a/component/cloudevent/client.go +++ b/component/cloudevent/client.go @@ -10,12 +10,16 @@ import ( mapset "github.com/deckarep/golang-set/v2" "github.com/nats-io/nats.go/jetstream" ants "github.com/panjf2000/ants/v2" + "github.com/rs/zerolog" + "github.com/samber/lo" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" + "github.com/pubgo/funk/v2/assert" "github.com/pubgo/funk/v2/buildinfo/version" "github.com/pubgo/funk/v2/component/lifecycle" "github.com/pubgo/funk/v2/component/natsclient" "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/internal/anyhow" "github.com/pubgo/funk/v2/log" "github.com/pubgo/funk/v2/log/logfields" cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent" @@ -24,10 +28,6 @@ import ( "github.com/pubgo/funk/v2/stack" "github.com/pubgo/funk/v2/try" "github.com/pubgo/funk/v2/typex" - "github.com/rs/zerolog" - "github.com/samber/lo" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" ) type Params struct { @@ -346,7 +346,7 @@ func (c *Client) doErrHandler(streamName, consumerName string) jetstream.PullCon }) } -func (c *Client) doHandler(meta *jetstream.MsgMetadata, msg jetstream.Msg, job *jobEventHandler, cfg *JobEventConfig) (gErr anyhow.Error) { +func (c *Client) doHandler(meta *jetstream.MsgMetadata, msg jetstream.Msg, job *jobEventHandler, cfg *JobEventConfig) (gErr result.Error) { var timeout = lo.FromPtr(cfg.Timeout) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -388,31 +388,31 @@ func (c *Client) doHandler(meta *jetstream.MsgMetadata, msg jetstream.Msg, job * }() var pb anypb.Any - err := anyhow.ErrOf(proto.Unmarshal(msg.Data(), &pb)). + err := result.ErrOf(proto.Unmarshal(msg.Data(), &pb)). Map(func(err error) error { return errors.WrapTag(err, errors.T("msg", "failed to unmarshal stream msg data to any proto"), errors.T("args", string(msg.Data())), ) }) - if err.CatchErr(&gErr) { + if err.Catch(&gErr) { return } args = &pb - dst := anyhow.Wrap(anypb.UnmarshalNew(args.(*anypb.Any), proto.UnmarshalOptions{})). + dst := result.Wrap(anypb.UnmarshalNew(args.(*anypb.Any), proto.UnmarshalOptions{})). MapErr(func(err error) error { return errors.WrapTag(err, errors.T("msg", "failed to unmarshal any proto to proto msg"), errors.T("args", args), ) }) - if dst.CatchErr(&gErr) { + if dst.Catch(&gErr) { return } ctx = createCtxWithContext(ctx, msgCtx) - err = anyhow.ErrOf(job.handler(ctx, dst.GetValue())). + err = result.ErrOf(job.handler(ctx, dst.GetValue())). Map(func(err error) error { return errors.WrapTag(err, errors.T("msg", "failed to do cloud job handler"), diff --git a/internal/anyhow/aherrcheck/context.go b/internal/anyhow/aherrcheck/context.go deleted file mode 100644 index 2e8db73..0000000 --- a/internal/anyhow/aherrcheck/context.go +++ /dev/null @@ -1,29 +0,0 @@ -package aherrcheck - -import ( - "context" -) - -type checkCtx struct{} - -type ErrChecker func(context.Context, error) error - -func CreateCtx(ctx context.Context, errChecks []ErrChecker) context.Context { - if ctx == nil { - ctx = context.Background() - } - return context.WithValue(ctx, checkCtx{}, errChecks) -} - -func GetCheckersFromCtx(ctx context.Context) []ErrChecker { - if ctx == nil { - return nil - } - - checkers, ok := ctx.Value(checkCtx{}).([]ErrChecker) - if !ok { - return nil - } - - return checkers -} diff --git a/internal/anyhow/aherrcheck/errcheck.go b/internal/anyhow/aherrcheck/errcheck.go deleted file mode 100644 index 058e99b..0000000 --- a/internal/anyhow/aherrcheck/errcheck.go +++ /dev/null @@ -1,47 +0,0 @@ -package aherrcheck - -import ( - "context" - "reflect" - - "github.com/pubgo/funk/v2/stack" -) - -var errChecks []ErrChecker - -func RegisterErrCheck(f ErrChecker) bool { - var checkFrame = stack.CallerWithFunc(f) - for _, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { - return false - } - } - - errChecks = append(errChecks, f) - return true -} - -func GetErrChecks() []ErrChecker { return errChecks } - -func GetErrCheckStacks() []*stack.Frame { - var frames []*stack.Frame - for _, err := range errChecks { - frames = append(frames, stack.CallerWithFunc(err)) - } - return frames -} - -func RemoveErrCheck(f func(context.Context, error) error) { - var checkFrame = stack.CallerWithFunc(f) - var index = -1 - for idx, errFunc := range errChecks { - if reflect.DeepEqual(checkFrame, stack.CallerWithFunc(errFunc)) { - index = idx - break - } - } - - if index != -1 { - errChecks = append(errChecks[:index], errChecks[index+1:]...) - } -} diff --git a/internal/anyhow/aherrcheck/errcheck_test.go b/internal/anyhow/aherrcheck/errcheck_test.go deleted file mode 100644 index 7702d95..0000000 --- a/internal/anyhow/aherrcheck/errcheck_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package aherrcheck - -import ( - "context" - "testing" - - "github.com/stretchr/testify/assert" -) - -func errCheck1(ctx context.Context, err error) error { - return err -} - -func TestErrCheck(t *testing.T) { - assert.Equal(t, len(GetErrCheckStacks()), 0) - - assert.Equal(t, RegisterErrCheck(errCheck1), true) - assert.Equal(t, len(GetErrCheckStacks()), 1) - - assert.Equal(t, RegisterErrCheck(errCheck1), false) - assert.Equal(t, len(GetErrCheckStacks()), 1) - assert.Equal(t, GetErrCheckStacks()[0].Short(), "aherrcheck/errcheck_test.go:10 errCheck1") - - RemoveErrCheck(errCheck1) - assert.Equal(t, len(GetErrCheckStacks()), 0) -} diff --git a/internal/anyhow/anyhow.go b/internal/anyhow/anyhow.go deleted file mode 100644 index ab5f131..0000000 --- a/internal/anyhow/anyhow.go +++ /dev/null @@ -1,154 +0,0 @@ -package anyhow - -import ( - "context" - "fmt" - "time" - - "github.com/pubgo/funk/v2/errors" -) - -func All[T any](results ...Result[T]) Result[[]T] { - values := make([]T, 0, len(results)) - for _, result := range results { - if result.IsErr() { - return Fail[[]T](result.GetErr()) - } - values = append(values, result.getValue()) - } - return OK(values) -} - -func Recovery(setter *error, callbacks ...func(err error) error) { - errRecovery( - setter, - func() bool { return *setter != nil }, - func() error { return *setter }, - func(err error) error { return err }, - callbacks..., - ) -} - -func RecoveryErr(setter *Error, callbacks ...func(err error) error) { - errRecovery( - setter, - func() bool { return setter.IsErr() }, - func() error { return setter.GetErr() }, - func(err error) Error { return newError(err) }, - callbacks..., - ) -} - -func ErrorOf(msg string, args ...any) Error { - return newError(errors.WrapCaller(fmt.Errorf(msg, args...), 1)) -} - -func ErrOf(err error) Error { - if err == nil { - return Error{} - } - - err = errors.WrapCaller(err, 1) - return newError(err) -} - -func ErrOfFn(fn func() error) Error { - var err = try(fn) - if err == nil { - return Error{} - } - - err = errors.WrapCaller(err, 1) - return newError(err) -} - -func OK[T any](v T) Result[T] { - return Result[T]{v: &v} -} - -func Fail[T any](err error) Result[T] { - if err == nil { - return Result[T]{} - } - - err = errors.WrapCaller(err, 1) - return Result[T]{Err: err} -} - -func Wrap[T any](v T, err error) Result[T] { - if err == nil { - return Result[T]{v: &v} - } - - err = errors.WrapCaller(err, 1) - return Result[T]{Err: err} -} - -func WrapFn[T any](fn func() (T, error)) Result[T] { - v, err := try1(fn) - if err == nil { - return Result[T]{v: &v} - } - - err = errors.WrapCaller(err, 1) - return Result[T]{Err: err} -} - -func CatchErr(setter *Error, err error, contexts ...context.Context) bool { - return catchErr(newError(err), setter, nil, contexts...) -} - -func Catch(rawSetter *error, err error, contexts ...context.Context) bool { - return catchErr(newError(err), nil, rawSetter, contexts...) -} - -func Try[T any](fn func() (T, error)) (r Result[T]) { - if fn == nil { - err := errors.WrapCaller(errors.New("function is nil"), 1) - return Fail[T](err) - } - - defer Recovery(&r.Err) - return Wrap(fn()) -} - -func MapTo[T, U any](r Result[T], fn func(T) U) Result[U] { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) - } - - return OK(fn(r.getValue())) -} - -func FlatMapTo[T, U any](r Result[T], fn func(T) Result[U]) Result[U] { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Fail[U](err) - } - - return fn(r.getValue()) -} - -// RetryWith retries a function with exponential backoff -func RetryWith[T any](fn func() (T, error), attempts int) Result[T] { - if attempts <= 0 { - return Fail[T](errors.New("retry attempts must be positive")) - } - - var lastErr error - for i := 0; i < attempts; i++ { - result := Try(fn) - if result.IsOK() { - return result - } - lastErr = result.GetErr() - - // Simple backoff - in production you might want exponential backoff - if i < attempts-1 { - time.Sleep(time.Duration(i+1) * 100 * time.Millisecond) - } - } - - return Fail[T](errors.Wrapf(lastErr, "failed after %d attempts", attempts)) -} diff --git a/internal/anyhow/error.go b/internal/anyhow/error.go deleted file mode 100644 index b0bda79..0000000 --- a/internal/anyhow/error.go +++ /dev/null @@ -1,128 +0,0 @@ -package anyhow - -import ( - "context" - "fmt" - - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/errors/errutil" - "github.com/pubgo/funk/v2/log" -) - -var _ Catchable = new(Error) -var _ Checkable = new(Error) - -func newError(err error) Error { - return Error{err: err} -} - -type Error struct { - _ [0]func() // disallow == - - err error -} - -func (e Error) Unwrap() error { return e.err } - -func (e Error) Map(fn func(error) error) Error { - if e.IsOK() { - return e - } - - err := e.getErr() - err = errors.WrapCaller(fn(err), 1) - return Error{err: err} -} - -func (e Error) RecordLog(contexts ...context.Context) Error { - if e.IsErr() { - log.Err(e.err, contexts...). - CallerSkipFrame(1). - Msg(e.err.Error()) - } - - return e -} - -func (e Error) InspectLog(fn func(logger *log.Event), contexts ...context.Context) Error { - if e.IsErr() { - fn(log.Err(e.err, contexts...)) - } - - return e -} - -func (e Error) Inspect(fn func(error)) Error { - if e.IsErr() { - err := e.getErr() - fn(err) - } - - return e -} - -func (e Error) Catch(setter *error, ctx ...context.Context) bool { - return catchErr(e, nil, setter, ctx...) -} - -func (e Error) CatchErr(setter *Error, ctx ...context.Context) bool { - return catchErr(e, setter, nil, ctx...) -} - -func (e Error) IsErr() bool { return e.getErr() != nil } - -func (e Error) IsOK() bool { return e.getErr() == nil } - -func (e Error) GetErr() error { - if e.IsOK() { - return nil - } - - return errors.WrapCaller(e.getErr(), 1) -} - -func (e Error) Must() { - if e.IsOK() { - return - } - - errMust(errors.WrapCaller(e.getErr(), 1)) -} - -func (e Error) Expect(format string, args ...any) { - if e.IsOK() { - return - } - - err := errors.WrapCaller(e.getErr(), 1) - err = errors.Wrapf(err, format, args...) - errMust(err) -} - -func (e Error) String() string { - if e.IsOK() { - return "Ok" - } - - return fmt.Sprintf("Error(%v)", e.err) -} - -func (e Error) MarshalJSON() ([]byte, error) { - if e.IsErr() { - return nil, errors.WrapCaller(e.err, 1) - } - - return errutil.Json(e.err), nil -} - -func (e Error) OrElse(fn func(error) Error) Error { - if e.IsOK() { - return e - } - - err := e.getErr() - err = errors.WrapCaller(err, 1) - return fn(err) -} - -func (e Error) getErr() error { return e.err } diff --git a/internal/anyhow/error_test.go b/internal/anyhow/error_test.go deleted file mode 100644 index 8ff59b4..0000000 --- a/internal/anyhow/error_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package anyhow - -import ( - "testing" - - "github.com/pubgo/funk/v2/errors" -) - -func TestErrorLog(t *testing.T) { - ErrOf(errors.New("test")).RecordLog() -} diff --git a/internal/anyhow/interface.go b/internal/anyhow/interface.go deleted file mode 100644 index 947b4d5..0000000 --- a/internal/anyhow/interface.go +++ /dev/null @@ -1,16 +0,0 @@ -package anyhow - -import "context" - -type Catchable interface { - Catch(err *error, contexts ...context.Context) bool - CatchErr(err *Error, contexts ...context.Context) bool -} - -// Checkable defines types that can be checked for Ok/Error state -type Checkable interface { - IsOK() bool - IsErr() bool - GetErr() error - String() string -} diff --git a/internal/anyhow/result.go b/internal/anyhow/result.go deleted file mode 100644 index ca2e7f1..0000000 --- a/internal/anyhow/result.go +++ /dev/null @@ -1,212 +0,0 @@ -package anyhow - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/pubgo/funk/v2" - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/log" - "github.com/samber/lo" -) - -var _ Catchable = new(Result[any]) -var _ Checkable = new(Result[any]) - -type Result[T any] struct { - _ [0]func() // disallow == - - v *T - Err error -} - -func (r Result[T]) GetValue() T { - if r.IsErr() { - errMust(errors.WrapCaller(r.getErr(), 1)) - } - - return r.getValue() -} - -func (r Result[T]) SetValue(v T) Result[T] { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - return Result[T]{Err: err} - } - - return OK(v) -} - -func (r Result[T]) ValueTo(v *T) Error { - if r.IsErr() { - return newError(errors.WrapCaller(r.getErr(), 1)) - } - - if v == nil { - return newError(errors.WrapStack(errors.New("v params is nil"))) - } - - *v = r.getValue() - return newError(nil) -} - -func (r Result[T]) Expect(format string, args ...any) T { - if r.IsErr() { - err := errors.WrapCaller(r.getErr(), 1) - errMust(errors.Wrapf(err, format, args...)) - } - - return r.getValue() -} - -func (r Result[T]) Must() T { - if r.IsErr() { - errMust(errors.WrapCaller(r.getErr(), 1)) - } - - return r.getValue() -} - -func (r Result[T]) Catch(setter *error, ctx ...context.Context) bool { - return catchErr(newError(r.Err), nil, setter, ctx...) -} - -func (r Result[T]) CatchErr(setter *Error, ctx ...context.Context) bool { - return catchErr(newError(r.Err), setter, nil, ctx...) -} - -func (r Result[T]) IsErr() bool { return r.getErr() != nil } - -func (r Result[T]) IsOK() bool { return r.getErr() == nil } - -func (r Result[T]) Filter(predicate func(T) bool, errorMsg string) Result[T] { - if r.IsErr() { - return r - } - - if predicate(r.getValue()) { - return r - } - - return Fail[T](errors.New(errorMsg)) -} - -func (r Result[T]) InspectErr(fn func(error)) Result[T] { - if r.IsErr() { - fn(r.getErr()) - } - return r -} - -func (r Result[T]) Inspect(fn func(T)) Result[T] { - if r.IsOK() { - fn(r.getValue()) - } - return r -} - -func (r Result[T]) RecordLog(contexts ...context.Context) Result[T] { - if r.IsErr() { - log.Err(r.Err, contexts...). - CallerSkipFrame(1). - Msg(r.Err.Error()) - } - - return r -} - -func (r Result[T]) InspectLog(fn func(logger *log.Event), contexts ...context.Context) Result[T] { - if r.IsErr() { - fn(log.Err(r.getErr(), contexts...)) - } - return r -} - -func (r Result[T]) Map(fn func(T) T) Result[T] { - if r.IsOK() { - return r - } - return OK(fn(r.getValue())) -} - -func (r Result[T]) FlatMap(fn func(T) Result[T]) Result[T] { - if r.IsOK() { - return r - } - return fn(r.getValue()) -} - -func (r Result[T]) MapErr(fn func(error) error) Result[T] { - if r.IsOK() { - return r - } - return Fail[T](fn(r.getErr())) -} - -func (r Result[T]) GetErr() error { - if r.IsOK() { - return nil - } - - err := r.getErr() - return errors.WrapCaller(err, 1) -} - -func (r Result[T]) String() string { - if r.IsOK() { - return fmt.Sprintf("Ok(%v)", r.getValue()) - } - return fmt.Sprintf("Error(%v)", r.getErr()) -} - -func (r Result[T]) SetErr(err error) Result[T] { - if err == nil { - return r - } - - err = errors.WrapCaller(err, 1) - return Result[T]{Err: err} -} - -func (r Result[T]) Unwrap(setter *error, contexts ...context.Context) T { - ret, err := unwrapErr(r, setter, nil, contexts...) - if err != nil { - *setter = errors.WrapCaller(err, 1) - } - return ret -} - -func (r Result[T]) UnwrapErr(setter *Error, contexts ...context.Context) T { - ret, err := unwrapErr(r, nil, setter, contexts...) - if err != nil { - *setter = newError(errors.WrapCaller(err, 1)) - } - return ret -} - -func (r Result[T]) OrElse(fn func(error) T) Result[T] { - if r.IsOK() { - return r - } - return OK(fn(r.getErr())) -} - -func (r Result[T]) UnwrapOr(defaultValue T) T { - if r.IsOK() { - return r.getValue() - } - return defaultValue -} - -func (r Result[T]) MarshalJSON() ([]byte, error) { - if r.IsErr() { - return nil, errors.WrapCaller(r.Err, 1) - } - - return json.Marshal(funk.FromPtr(r.v)) -} - -func (r Result[T]) getValue() T { return lo.FromPtr(r.v) } - -func (r Result[T]) getErr() error { return r.Err } diff --git a/internal/anyhow/result_test.go b/internal/anyhow/result_test.go deleted file mode 100644 index 57d42c0..0000000 --- a/internal/anyhow/result_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package anyhow_test - -import ( - "context" - "encoding/json" - "fmt" - "testing" - - "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/internal/anyhow" - "github.com/pubgo/funk/v2/internal/anyhow/aherrcheck" - "github.com/pubgo/funk/v2/log" - "github.com/pubgo/funk/v2/recovery" -) - -type hello struct { - Name string `json:"name"` -} - -func TestName(t *testing.T) { - defer recovery.DebugPrint() - ok := &hello{Name: "abc"} - okBytes := anyhow.Wrap(json.Marshal(&ok)) - data := string(okBytes.Expect("failed to encode json data")) - t.Log(data) - if data != `{"name":"abc"}` { - t.Log(data) - t.Fatal("not match") - } -} - -func TestResultDo(t *testing.T) { - ok := anyhow.OK(&hello{Name: "abc"}) - ok.Inspect(func(v *hello) { - assert.If(v.Name != "abc", "not match") - }).Inspect(func(v *hello) { - assert.If(v.Name != "abc", "not match") - }) - ok.InspectErr(func(err error) { - t.Log(err) - }) -} - -func TestErrOf(t *testing.T) { - var ctx = log.UpdateEventCtx(context.Background(), log.Map{"test": "ok"}) - aherrcheck.RegisterErrCheck(log.RecordErr()) - - var err anyhow.Error - if fn1().CatchErr(&err, ctx) { - errors.Debug(err.GetErr()) - } -} - -func fn1() (r anyhow.Result[string]) { - if fn3().Catch(&r.Err) { - return - } - - var vv = fn2() - if vv.Catch(&r.Err) { - return - } - - return vv -} - -func fn2() (r anyhow.Result[string]) { - ret := fn3().Map(func(err error) error { - return errors.Wrap(err, "test error") - }) - - if ret.Catch(&r.Err) { - return - } - - return r.SetValue("ok") -} - -func fn3() anyhow.Error { - return anyhow.ErrOf(fmt.Errorf("error test, this is error")). - Inspect(func(err error) { - log.Err(err).Msg("ddd") - }). - InspectLog(func(evt *log.Event) { - evt.Msg("test log") - }). - RecordLog() -} diff --git a/internal/anyhow/util.go b/internal/anyhow/util.go deleted file mode 100644 index 2f8463c..0000000 --- a/internal/anyhow/util.go +++ /dev/null @@ -1,207 +0,0 @@ -package anyhow - -import ( - "context" - "fmt" - "runtime/debug" - - "github.com/pubgo/funk/v2/errors" - "github.com/pubgo/funk/v2/generic" - "github.com/pubgo/funk/v2/internal/anyhow/aherrcheck" - "github.com/pubgo/funk/v2/log" - "github.com/pubgo/funk/v2/stack" - "github.com/samber/lo" -) - -var errFnIsNil = errors.New("[fn] is nil") - -func try(fn func() error) (gErr error) { - if fn == nil { - gErr = errors.WrapStack(errFnIsNil) - return - } - - defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { - gErr = errors.WrapStack(err) - debug.PrintStack() - errors.Debug(gErr) - } - - gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn).String()) - }() - - gErr = fn() - return -} - -func try1[T any](fn func() (T, error)) (t T, gErr error) { - if fn == nil { - return t, errors.WrapStack(errFnIsNil) - } - - defer func() { - if err := errors.Parse(recover()); !generic.IsNil(err) { - gErr = errors.WrapStack(err) - debug.PrintStack() - errors.Debug(gErr) - } - - if gErr != nil { - gErr = errors.WrapKV(gErr, "fn_stack", stack.CallerWithFunc(fn)) - } - }() - - t, gErr = fn() - return -} - -func errMust(err error, args ...any) { - if generic.IsNil(err) { - return - } - - if len(args) > 0 { - err = errors.Wrap(err, fmt.Sprint(args...)) - } - - err = errors.WrapStack(err) - errors.Debug(err) - panic(err) -} - -func catchErr(r Error, setter *Error, rawSetter *error, contexts ...context.Context) bool { - if setter == nil && rawSetter == nil { - errMust(errors.Errorf("error setter is nil")) - } - - if r.IsOK() { - return false - } - - var isErr = func() bool { - if setter != nil { - return (*setter).IsErr() - } - - if rawSetter != nil { - return (*rawSetter) != nil - } - - return false - } - - var getErr = func() error { - if setter != nil { - return (*setter).getErr() - } - - if rawSetter != nil { - return *rawSetter - } - - return nil - } - - var setErr = func(err error) { - if setter != nil { - *setter = newError(err) - } - - if rawSetter != nil { - *rawSetter = err - } - } - - // err No checking, repeat setting - if isErr() { - err := getErr() - log.Err(err).Msgf("error setter is has value, err=%s", err.Error()) - } - - var ctx = context.Background() - for i := range contexts { - if contexts[i] == nil { - continue - } - ctx = contexts[i] - break - } - - checkers := append(aherrcheck.GetErrChecks(), aherrcheck.GetCheckersFromCtx(ctx)...) - var err = r.getErr() - for _, fn := range checkers { - err = fn(ctx, err) - if err == nil { - return false - } - } - - setErr(errors.WrapCaller(err, 2)) - - return true -} - -func errRecovery[T any](setter *T, isErr func() bool, getErr func() error, newErr func(err error) T, callbacks ...func(err error) error) { - if setter == nil { - errMust(errors.Errorf("setter is nil")) - } - - err := errors.Parse(recover()) - if err == nil && !isErr() { - return - } - - if err == nil { - err = getErr() - } - - for _, fn := range callbacks { - err = fn(err) - if err == nil { - return - } - } - - err = errors.WrapCaller(err, 1) - *setter = newErr(err) -} - -func unwrapErr[T any](r Result[T], setter1 *error, setter2 *Error, contexts ...context.Context) (T, error) { - if setter1 == nil && setter2 == nil { - debug.PrintStack() - panic("Unwrap: error setter is nil") - } - - var ret = r.getValue() - if r.IsOK() { - return ret, nil - } - - var ctx = context.Background() - if len(contexts) > 0 { - ctx = contexts[0] - } - - getSetterErr := func() error { - err := lo.FromPtr(setter1) - if err == nil { - err = lo.FromPtr(setter2).getErr() - } - return err - } - setterErr := getSetterErr() - if setterErr != nil { - log.Error(ctx).Msgf("Unwrap: error setter has value, err=%v", setterErr) - } - - var err = r.getErr() - for _, fn := range aherrcheck.GetErrChecks() { - err = fn(ctx, err) - if err == nil { - return ret, nil - } - } - - return ret, err -} diff --git a/internal/example/app/main.go b/internal/example/app/main.go deleted file mode 100644 index 643ac20..0000000 --- a/internal/example/app/main.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/pubgo/funk/v2/recovery" -) - -// 应用的集成开发, 在最后扑捉panic - -func A() string { - panic("未知错误") -} - -func B() string { - return A() -} - -func C() string { - a := A() - if a == "" { - return B() - } - return "" -} - -func main() { - defer recovery.Exit() - - fmt.Println(C()) -} diff --git a/internal/example/env/main.go b/internal/example/env/main.go deleted file mode 100644 index eeeff9b..0000000 --- a/internal/example/env/main.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -import ( - "os" - - "github.com/pubgo/funk/v2/env" - "github.com/pubgo/funk/v2/pretty" -) - -func main() { - pretty.Println(os.Environ()) - pretty.Println(env.Map()) -} diff --git a/log/impl.log.go b/log/impl.log.go index 7d2d139..71b0bd1 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -213,19 +213,24 @@ func (l *loggerImpl) getLog() *zerolog.Logger { } func (l *loggerImpl) newEvent(ctx context.Context, e *zerolog.Event) *zerolog.Event { - if l.name != "" { - e = e.Str(logfields.Logger, l.name) + name := l.name + if m, ok := l.fields[logfields.Module].(string); ok { + name = m + } + + if name != "" { + e = e.Str(logfields.Logger, name) } if l.callerSkip != 0 { e = e.CallerSkipFrame(l.callerSkip) } - if l.fields != nil && len(l.fields) > 0 { + if len(l.fields) > 0 { e = e.Fields(l.fields) } - e = e.Ctx(createFieldCtx(ctx, &fieldMap{name: l.name, fields: l.fields})) + e = e.Ctx(createFieldCtx(ctx, &fieldMap{name: name, fields: l.fields})) return mergeEvent(e, getEventFromCtx(ctx), l.content) } diff --git a/proto/cloudevent/options.pb.go b/proto/cloudevent/options.pb.go new file mode 100644 index 0000000..1474c5f --- /dev/null +++ b/proto/cloudevent/options.pb.go @@ -0,0 +1,124 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.2 +// protoc v6.32.1 +// source: cloudevent/options.proto + +package cloudeventpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_cloudevent_options_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*CloudEventServiceOptions)(nil), + Field: 10010, + Name: "lava.cloudevent.job", + Tag: "bytes,10010,opt,name=job", + Filename: "cloudevent/options.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*CloudEventMethodOptions)(nil), + Field: 10011, + Name: "lava.cloudevent.subject", + Tag: "bytes,10011,opt,name=subject", + Filename: "cloudevent/options.proto", + }, +} + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // optional lava.cloudevent.CloudEventServiceOptions job = 10010; + E_Job = &file_cloudevent_options_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // optional lava.cloudevent.CloudEventMethodOptions subject = 10011; + E_Subject = &file_cloudevent_options_proto_extTypes[1] +) + +var File_cloudevent_options_proto protoreflect.FileDescriptor + +var file_cloudevent_options_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6c, 0x61, 0x76, 0x61, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x5d, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9a, 0x4e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x03, 0x6a, 0x6f, 0x62, 0x3a, 0x63, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x9b, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, + 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_cloudevent_options_proto_goTypes = []any{ + (*descriptorpb.ServiceOptions)(nil), // 0: google.protobuf.ServiceOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*CloudEventServiceOptions)(nil), // 2: lava.cloudevent.CloudEventServiceOptions + (*CloudEventMethodOptions)(nil), // 3: lava.cloudevent.CloudEventMethodOptions +} +var file_cloudevent_options_proto_depIdxs = []int32{ + 0, // 0: lava.cloudevent.job:extendee -> google.protobuf.ServiceOptions + 1, // 1: lava.cloudevent.subject:extendee -> google.protobuf.MethodOptions + 2, // 2: lava.cloudevent.job:type_name -> lava.cloudevent.CloudEventServiceOptions + 3, // 3: lava.cloudevent.subject:type_name -> lava.cloudevent.CloudEventMethodOptions + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 2, // [2:4] is the sub-list for extension type_name + 0, // [0:2] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cloudevent_options_proto_init() } +func file_cloudevent_options_proto_init() { + if File_cloudevent_options_proto != nil { + return + } + file_cloudevent_types_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cloudevent_options_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 2, + NumServices: 0, + }, + GoTypes: file_cloudevent_options_proto_goTypes, + DependencyIndexes: file_cloudevent_options_proto_depIdxs, + ExtensionInfos: file_cloudevent_options_proto_extTypes, + }.Build() + File_cloudevent_options_proto = out.File + file_cloudevent_options_proto_rawDesc = nil + file_cloudevent_options_proto_goTypes = nil + file_cloudevent_options_proto_depIdxs = nil +} diff --git a/proto/cloudevent/types.pb.go b/proto/cloudevent/types.pb.go new file mode 100644 index 0000000..70ae0c0 --- /dev/null +++ b/proto/cloudevent/types.pb.go @@ -0,0 +1,351 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.2 +// protoc v6.32.1 +// source: cloudevent/types.proto + +package cloudeventpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type RegisterJobOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobName *string `protobuf:"bytes,1,opt,name=job_name,json=jobName,proto3,oneof" json:"job_name,omitempty"` +} + +func (x *RegisterJobOptions) Reset() { + *x = RegisterJobOptions{} + mi := &file_cloudevent_types_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RegisterJobOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterJobOptions) ProtoMessage() {} + +func (x *RegisterJobOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterJobOptions.ProtoReflect.Descriptor instead. +func (*RegisterJobOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterJobOptions) GetJobName() string { + if x != nil && x.JobName != nil { + return *x.JobName + } + return "" +} + +type PushEventOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The content type for the data (optional). + ContentType *string `protobuf:"bytes,1,opt,name=content_type,json=contentType,proto3,oneof" json:"content_type,omitempty"` + // metadata property: + // - key : the key of the message. + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The delay duration of the message. + DelayDur *durationpb.Duration `protobuf:"bytes,3,opt,name=delay_dur,json=delayDur,proto3,oneof" json:"delay_dur,omitempty"` + // The message id + MsgId *string `protobuf:"bytes,4,opt,name=msg_id,json=msgId,proto3,oneof" json:"msg_id,omitempty"` +} + +func (x *PushEventOptions) Reset() { + *x = PushEventOptions{} + mi := &file_cloudevent_types_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PushEventOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushEventOptions) ProtoMessage() {} + +func (x *PushEventOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushEventOptions.ProtoReflect.Descriptor instead. +func (*PushEventOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{1} +} + +func (x *PushEventOptions) GetContentType() string { + if x != nil && x.ContentType != nil { + return *x.ContentType + } + return "" +} + +func (x *PushEventOptions) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *PushEventOptions) GetDelayDur() *durationpb.Duration { + if x != nil { + return x.DelayDur + } + return nil +} + +func (x *PushEventOptions) GetMsgId() string { + if x != nil && x.MsgId != nil { + return *x.MsgId + } + return "" +} + +type CloudEventServiceOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // job event name is same with config jobs consumers job name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CloudEventServiceOptions) Reset() { + *x = CloudEventServiceOptions{} + mi := &file_cloudevent_types_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CloudEventServiceOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudEventServiceOptions) ProtoMessage() {} + +func (x *CloudEventServiceOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudEventServiceOptions.ProtoReflect.Descriptor instead. +func (*CloudEventServiceOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{2} +} + +func (x *CloudEventServiceOptions) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// cloud event subject or topic +type CloudEventMethodOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // subject name is same with config jobs consumers + // subject name sametime is topic name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // event or api operation + Operation *string `protobuf:"bytes,4,opt,name=operation,proto3,oneof" json:"operation,omitempty"` +} + +func (x *CloudEventMethodOptions) Reset() { + *x = CloudEventMethodOptions{} + mi := &file_cloudevent_types_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CloudEventMethodOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudEventMethodOptions) ProtoMessage() {} + +func (x *CloudEventMethodOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudEventMethodOptions.ProtoReflect.Descriptor instead. +func (*CloudEventMethodOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{3} +} + +func (x *CloudEventMethodOptions) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CloudEventMethodOptions) GetOperation() string { + if x != nil && x.Operation != nil { + return *x.Operation + } + return "" +} + +var File_cloudevent_types_proto protoreflect.FileDescriptor + +var file_cloudevent_types_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x12, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x1e, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x02, 0x0a, + 0x10, 0x50, 0x75, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x61, + 0x76, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x75, + 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x64, 0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x75, 0x72, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x6d, 0x73, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5e, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, + 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_cloudevent_types_proto_rawDescOnce sync.Once + file_cloudevent_types_proto_rawDescData = file_cloudevent_types_proto_rawDesc +) + +func file_cloudevent_types_proto_rawDescGZIP() []byte { + file_cloudevent_types_proto_rawDescOnce.Do(func() { + file_cloudevent_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_cloudevent_types_proto_rawDescData) + }) + return file_cloudevent_types_proto_rawDescData +} + +var file_cloudevent_types_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_cloudevent_types_proto_goTypes = []any{ + (*RegisterJobOptions)(nil), // 0: lava.cloudevent.RegisterJobOptions + (*PushEventOptions)(nil), // 1: lava.cloudevent.PushEventOptions + (*CloudEventServiceOptions)(nil), // 2: lava.cloudevent.CloudEventServiceOptions + (*CloudEventMethodOptions)(nil), // 3: lava.cloudevent.CloudEventMethodOptions + nil, // 4: lava.cloudevent.PushEventOptions.MetadataEntry + (*durationpb.Duration)(nil), // 5: google.protobuf.Duration +} +var file_cloudevent_types_proto_depIdxs = []int32{ + 4, // 0: lava.cloudevent.PushEventOptions.metadata:type_name -> lava.cloudevent.PushEventOptions.MetadataEntry + 5, // 1: lava.cloudevent.PushEventOptions.delay_dur:type_name -> google.protobuf.Duration + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_cloudevent_types_proto_init() } +func file_cloudevent_types_proto_init() { + if File_cloudevent_types_proto != nil { + return + } + file_cloudevent_types_proto_msgTypes[0].OneofWrappers = []any{} + file_cloudevent_types_proto_msgTypes[1].OneofWrappers = []any{} + file_cloudevent_types_proto_msgTypes[3].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cloudevent_types_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cloudevent_types_proto_goTypes, + DependencyIndexes: file_cloudevent_types_proto_depIdxs, + MessageInfos: file_cloudevent_types_proto_msgTypes, + }.Build() + File_cloudevent_types_proto = out.File + file_cloudevent_types_proto_rawDesc = nil + file_cloudevent_types_proto_goTypes = nil + file_cloudevent_types_proto_depIdxs = nil +} diff --git a/running/runtime.go b/running/runtime.go index 4214b51..57376e9 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -24,8 +24,8 @@ import ( var ( Env = sync.OnceValue(func() string { return EnvFlag.Get().(string) }) Debug = sync.OnceValue(func() bool { return DebugFlag.Get().(bool) }) - HttpPort = sync.OnceValue(func() int { return GrpcPortFlag.Get().(int) }) - GrpcPort = sync.OnceValue(func() int { return HttpPortFlag.Get().(int) }) + HttpPort = sync.OnceValue(func() int { return HttpPortFlag.Get().(int) }) + GrpcPort = sync.OnceValue(func() int { return GrpcPortFlag.Get().(int) }) Project = version.Project // InstanceID service id From 7557d0dd6c73d231aa589d292f89a776dac34f69 Mon Sep 17 00:00:00 2001 From: barry Date: Fri, 17 Oct 2025 11:28:46 +0800 Subject: [PATCH 40/43] chore: quick update fix/version at 2025-10-22 09:56:19 --- assert/aaa.go | 4 + assert/must_test.go | 5 + assert/util.go | 6 + errors/aaa.go | 5 - errors/errors.go | 12 -- log/impl.log.go | 13 +- proto/cloudevent/options.pb.go | 124 ++++++++++++ proto/cloudevent/types.pb.go | 351 +++++++++++++++++++++++++++++++++ running/runtime.go | 4 +- 9 files changed, 501 insertions(+), 23 deletions(-) create mode 100644 proto/cloudevent/options.pb.go create mode 100644 proto/cloudevent/types.pb.go diff --git a/assert/aaa.go b/assert/aaa.go index 9e705d9..f0c1578 100644 --- a/assert/aaa.go +++ b/assert/aaa.go @@ -1,3 +1,7 @@ package assert +import "github.com/pubgo/funk/v2/features" + const Name = "assert" + +var FeatureDebugMode = features.Bool("assert.debug_mode", false, "debug mode, pretty stack and error") diff --git a/assert/must_test.go b/assert/must_test.go index af2834b..694080e 100644 --- a/assert/must_test.go +++ b/assert/must_test.go @@ -57,6 +57,11 @@ func init1Next() (err error) { return nil } +func TestDebugMode(t *testing.T) { + assert1.Exit(assert1.FeatureDebugMode.Set("true")) + assert1.Must(fmt.Errorf("test next")) +} + func BenchmarkNoPanic(b *testing.B) { for i := 0; i < b.N; i++ { _ = func() (err error) { diff --git a/assert/util.go b/assert/util.go index 0c673ab..9669b70 100644 --- a/assert/util.go +++ b/assert/util.go @@ -77,6 +77,12 @@ func must(err error, messageArgs ...any) { } logErr(err, message, attrs...) + + if FeatureDebugMode.GetValue() { + _, _ = pp.Println(err) + debug.PrintStack() + } + panic(err) } diff --git a/errors/aaa.go b/errors/aaa.go index 47556d7..aaddd2c 100644 --- a/errors/aaa.go +++ b/errors/aaa.go @@ -2,7 +2,6 @@ package errors import ( "github.com/pubgo/funk/v2/errors/errinter" - "golang.org/x/xerrors" ) type Maps = errinter.Maps @@ -14,7 +13,3 @@ type ErrUnwrap = errinter.ErrUnwrap type Error = errinter.Error type ErrorProto = errinter.ErrorProto type GRPCStatus = errinter.GRPCStatus - -var ( - Opaque = xerrors.Opaque -) diff --git a/errors/errors.go b/errors/errors.go index 02d1082..ca37d0f 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -7,7 +7,6 @@ import ( "github.com/rs/xid" "github.com/samber/lo" - "golang.org/x/xerrors" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" @@ -28,17 +27,6 @@ func New(msg string, tags ...Tag) error { return WrapCaller(&Err{Msg: msg, id: xid.New().String(), Tags: tags}, 1) } -func XErrorf(msg string, args ...interface{}) error { - err := xerrors.Errorf(msg, args) - return &ErrMsg{ - err: WrapCaller(err, 1), - pb: &errorpb.ErrMsg{ - Id: lo.ToPtr(getErrorId(err)), - Msg: fmt.Sprintf("%v", err), - }, - } -} - func Errorf(msg string, args ...interface{}) error { return WrapCaller(&Err{Msg: fmt.Sprintf(msg, args...), id: xid.New().String()}, 1) } diff --git a/log/impl.log.go b/log/impl.log.go index 7d2d139..71b0bd1 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -213,19 +213,24 @@ func (l *loggerImpl) getLog() *zerolog.Logger { } func (l *loggerImpl) newEvent(ctx context.Context, e *zerolog.Event) *zerolog.Event { - if l.name != "" { - e = e.Str(logfields.Logger, l.name) + name := l.name + if m, ok := l.fields[logfields.Module].(string); ok { + name = m + } + + if name != "" { + e = e.Str(logfields.Logger, name) } if l.callerSkip != 0 { e = e.CallerSkipFrame(l.callerSkip) } - if l.fields != nil && len(l.fields) > 0 { + if len(l.fields) > 0 { e = e.Fields(l.fields) } - e = e.Ctx(createFieldCtx(ctx, &fieldMap{name: l.name, fields: l.fields})) + e = e.Ctx(createFieldCtx(ctx, &fieldMap{name: name, fields: l.fields})) return mergeEvent(e, getEventFromCtx(ctx), l.content) } diff --git a/proto/cloudevent/options.pb.go b/proto/cloudevent/options.pb.go new file mode 100644 index 0000000..1474c5f --- /dev/null +++ b/proto/cloudevent/options.pb.go @@ -0,0 +1,124 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.2 +// protoc v6.32.1 +// source: cloudevent/options.proto + +package cloudeventpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_cloudevent_options_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*CloudEventServiceOptions)(nil), + Field: 10010, + Name: "lava.cloudevent.job", + Tag: "bytes,10010,opt,name=job", + Filename: "cloudevent/options.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*CloudEventMethodOptions)(nil), + Field: 10011, + Name: "lava.cloudevent.subject", + Tag: "bytes,10011,opt,name=subject", + Filename: "cloudevent/options.proto", + }, +} + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // optional lava.cloudevent.CloudEventServiceOptions job = 10010; + E_Job = &file_cloudevent_options_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // optional lava.cloudevent.CloudEventMethodOptions subject = 10011; + E_Subject = &file_cloudevent_options_proto_extTypes[1] +) + +var File_cloudevent_options_proto protoreflect.FileDescriptor + +var file_cloudevent_options_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6c, 0x61, 0x76, 0x61, + 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x5d, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9a, 0x4e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x03, 0x6a, 0x6f, 0x62, 0x3a, 0x63, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x9b, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, + 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_cloudevent_options_proto_goTypes = []any{ + (*descriptorpb.ServiceOptions)(nil), // 0: google.protobuf.ServiceOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*CloudEventServiceOptions)(nil), // 2: lava.cloudevent.CloudEventServiceOptions + (*CloudEventMethodOptions)(nil), // 3: lava.cloudevent.CloudEventMethodOptions +} +var file_cloudevent_options_proto_depIdxs = []int32{ + 0, // 0: lava.cloudevent.job:extendee -> google.protobuf.ServiceOptions + 1, // 1: lava.cloudevent.subject:extendee -> google.protobuf.MethodOptions + 2, // 2: lava.cloudevent.job:type_name -> lava.cloudevent.CloudEventServiceOptions + 3, // 3: lava.cloudevent.subject:type_name -> lava.cloudevent.CloudEventMethodOptions + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 2, // [2:4] is the sub-list for extension type_name + 0, // [0:2] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cloudevent_options_proto_init() } +func file_cloudevent_options_proto_init() { + if File_cloudevent_options_proto != nil { + return + } + file_cloudevent_types_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cloudevent_options_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 2, + NumServices: 0, + }, + GoTypes: file_cloudevent_options_proto_goTypes, + DependencyIndexes: file_cloudevent_options_proto_depIdxs, + ExtensionInfos: file_cloudevent_options_proto_extTypes, + }.Build() + File_cloudevent_options_proto = out.File + file_cloudevent_options_proto_rawDesc = nil + file_cloudevent_options_proto_goTypes = nil + file_cloudevent_options_proto_depIdxs = nil +} diff --git a/proto/cloudevent/types.pb.go b/proto/cloudevent/types.pb.go new file mode 100644 index 0000000..70ae0c0 --- /dev/null +++ b/proto/cloudevent/types.pb.go @@ -0,0 +1,351 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.2 +// protoc v6.32.1 +// source: cloudevent/types.proto + +package cloudeventpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type RegisterJobOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobName *string `protobuf:"bytes,1,opt,name=job_name,json=jobName,proto3,oneof" json:"job_name,omitempty"` +} + +func (x *RegisterJobOptions) Reset() { + *x = RegisterJobOptions{} + mi := &file_cloudevent_types_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RegisterJobOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterJobOptions) ProtoMessage() {} + +func (x *RegisterJobOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterJobOptions.ProtoReflect.Descriptor instead. +func (*RegisterJobOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterJobOptions) GetJobName() string { + if x != nil && x.JobName != nil { + return *x.JobName + } + return "" +} + +type PushEventOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The content type for the data (optional). + ContentType *string `protobuf:"bytes,1,opt,name=content_type,json=contentType,proto3,oneof" json:"content_type,omitempty"` + // metadata property: + // - key : the key of the message. + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The delay duration of the message. + DelayDur *durationpb.Duration `protobuf:"bytes,3,opt,name=delay_dur,json=delayDur,proto3,oneof" json:"delay_dur,omitempty"` + // The message id + MsgId *string `protobuf:"bytes,4,opt,name=msg_id,json=msgId,proto3,oneof" json:"msg_id,omitempty"` +} + +func (x *PushEventOptions) Reset() { + *x = PushEventOptions{} + mi := &file_cloudevent_types_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PushEventOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushEventOptions) ProtoMessage() {} + +func (x *PushEventOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushEventOptions.ProtoReflect.Descriptor instead. +func (*PushEventOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{1} +} + +func (x *PushEventOptions) GetContentType() string { + if x != nil && x.ContentType != nil { + return *x.ContentType + } + return "" +} + +func (x *PushEventOptions) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *PushEventOptions) GetDelayDur() *durationpb.Duration { + if x != nil { + return x.DelayDur + } + return nil +} + +func (x *PushEventOptions) GetMsgId() string { + if x != nil && x.MsgId != nil { + return *x.MsgId + } + return "" +} + +type CloudEventServiceOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // job event name is same with config jobs consumers job name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *CloudEventServiceOptions) Reset() { + *x = CloudEventServiceOptions{} + mi := &file_cloudevent_types_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CloudEventServiceOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudEventServiceOptions) ProtoMessage() {} + +func (x *CloudEventServiceOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudEventServiceOptions.ProtoReflect.Descriptor instead. +func (*CloudEventServiceOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{2} +} + +func (x *CloudEventServiceOptions) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// cloud event subject or topic +type CloudEventMethodOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // subject name is same with config jobs consumers + // subject name sametime is topic name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // event or api operation + Operation *string `protobuf:"bytes,4,opt,name=operation,proto3,oneof" json:"operation,omitempty"` +} + +func (x *CloudEventMethodOptions) Reset() { + *x = CloudEventMethodOptions{} + mi := &file_cloudevent_types_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CloudEventMethodOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudEventMethodOptions) ProtoMessage() {} + +func (x *CloudEventMethodOptions) ProtoReflect() protoreflect.Message { + mi := &file_cloudevent_types_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudEventMethodOptions.ProtoReflect.Descriptor instead. +func (*CloudEventMethodOptions) Descriptor() ([]byte, []int) { + return file_cloudevent_types_proto_rawDescGZIP(), []int{3} +} + +func (x *CloudEventMethodOptions) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CloudEventMethodOptions) GetOperation() string { + if x != nil && x.Operation != nil { + return *x.Operation + } + return "" +} + +var File_cloudevent_types_proto protoreflect.FileDescriptor + +var file_cloudevent_types_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6c, 0x61, 0x76, 0x61, 0x2e, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x12, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x1e, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x02, 0x0a, + 0x10, 0x50, 0x75, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x61, + 0x76, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x75, + 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x64, 0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x75, 0x72, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x6d, 0x73, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5e, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, + 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_cloudevent_types_proto_rawDescOnce sync.Once + file_cloudevent_types_proto_rawDescData = file_cloudevent_types_proto_rawDesc +) + +func file_cloudevent_types_proto_rawDescGZIP() []byte { + file_cloudevent_types_proto_rawDescOnce.Do(func() { + file_cloudevent_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_cloudevent_types_proto_rawDescData) + }) + return file_cloudevent_types_proto_rawDescData +} + +var file_cloudevent_types_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_cloudevent_types_proto_goTypes = []any{ + (*RegisterJobOptions)(nil), // 0: lava.cloudevent.RegisterJobOptions + (*PushEventOptions)(nil), // 1: lava.cloudevent.PushEventOptions + (*CloudEventServiceOptions)(nil), // 2: lava.cloudevent.CloudEventServiceOptions + (*CloudEventMethodOptions)(nil), // 3: lava.cloudevent.CloudEventMethodOptions + nil, // 4: lava.cloudevent.PushEventOptions.MetadataEntry + (*durationpb.Duration)(nil), // 5: google.protobuf.Duration +} +var file_cloudevent_types_proto_depIdxs = []int32{ + 4, // 0: lava.cloudevent.PushEventOptions.metadata:type_name -> lava.cloudevent.PushEventOptions.MetadataEntry + 5, // 1: lava.cloudevent.PushEventOptions.delay_dur:type_name -> google.protobuf.Duration + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_cloudevent_types_proto_init() } +func file_cloudevent_types_proto_init() { + if File_cloudevent_types_proto != nil { + return + } + file_cloudevent_types_proto_msgTypes[0].OneofWrappers = []any{} + file_cloudevent_types_proto_msgTypes[1].OneofWrappers = []any{} + file_cloudevent_types_proto_msgTypes[3].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cloudevent_types_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cloudevent_types_proto_goTypes, + DependencyIndexes: file_cloudevent_types_proto_depIdxs, + MessageInfos: file_cloudevent_types_proto_msgTypes, + }.Build() + File_cloudevent_types_proto = out.File + file_cloudevent_types_proto_rawDesc = nil + file_cloudevent_types_proto_goTypes = nil + file_cloudevent_types_proto_depIdxs = nil +} diff --git a/running/runtime.go b/running/runtime.go index 4214b51..57376e9 100644 --- a/running/runtime.go +++ b/running/runtime.go @@ -24,8 +24,8 @@ import ( var ( Env = sync.OnceValue(func() string { return EnvFlag.Get().(string) }) Debug = sync.OnceValue(func() bool { return DebugFlag.Get().(bool) }) - HttpPort = sync.OnceValue(func() int { return GrpcPortFlag.Get().(int) }) - GrpcPort = sync.OnceValue(func() int { return HttpPortFlag.Get().(int) }) + HttpPort = sync.OnceValue(func() int { return HttpPortFlag.Get().(int) }) + GrpcPort = sync.OnceValue(func() int { return GrpcPortFlag.Get().(int) }) Project = version.Project // InstanceID service id From 3d0d368a4c9b3d8f8f344777ee804cccbd5fe149 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 22 Oct 2025 11:19:51 +0800 Subject: [PATCH 41/43] chore: quick update fix/version at 2025-10-22 18:36:17 --- cmds/protoc-gen-go-errors2/internal/gen.go | 2 +- env/env.go | 58 +++++--- env/reload.go | 3 +- env/util.go | 6 + errors/aaa.go | 2 +- errors/err_code.go | 24 ++-- errors/err_msg.go | 12 +- errors/err_wrap.go | 48 +++++-- errors/errinter/aaa.go | 7 +- errors/errinter/utils.go | 2 +- errors/{ => errorcodes}/registry.go | 2 +- errors/errors.go | 88 ++---------- errors/stack_filters.go | 25 ---- errors/util.go | 8 +- errors/z_code_test.go | 9 +- go.mod | 1 - go.sum | 1 - proto/errorpb/errors.pb.go | 153 ++++++--------------- proto/errorpb/errors.proto | 14 +- proto/errorpb/options.pb.go | 10 +- proto/errorpb/options.proto | 6 + proto/testcodepb/test.errors.pb.go | 14 +- 22 files changed, 197 insertions(+), 298 deletions(-) rename errors/{ => errorcodes}/registry.go (95%) delete mode 100644 errors/stack_filters.go diff --git a/cmds/protoc-gen-go-errors2/internal/gen.go b/cmds/protoc-gen-go-errors2/internal/gen.go index 7c19e35..d846f37 100644 --- a/cmds/protoc-gen-go-errors2/internal/gen.go +++ b/cmds/protoc-gen-go-errors2/internal/gen.go @@ -93,7 +93,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated jen.Id("Message"): jen.Lit(rr), }) genFile.Var().Id("_").Op("="). - Qual("github.com/pubgo/funk/v2/errors", "RegisterErrCodes"). + Qual("github.com/pubgo/funk/v2/errors/errorcodes", "RegisterErrCodes"). Call(jen.Id(errCodeName)).Line() } } diff --git a/env/env.go b/env/env.go index 2a8cfb8..e5858ee 100644 --- a/env/env.go +++ b/env/env.go @@ -2,7 +2,6 @@ package env import ( "fmt" - "log/slog" "os" "strconv" "strings" @@ -21,11 +20,12 @@ import ( const Name = "env" func Set(key, value string) result.Error { - return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { - e.Str("key", key) - e.Str("value", value) - e.Str(logfields.Msg, "env_set_error") - }) + return result.ErrOf(os.Setenv(keyHandler(key), value)). + Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str("value", value) + e.Str(logfields.Msg, "env_set_error") + }) } func MustSet(key, value string) { Set(key, value).Must() } @@ -38,7 +38,7 @@ func Get(names ...string) string { func MustGet(names ...string) string { val := Get(names...) - assert.If(val == "", "env not found, names=%q", names) + assert.If(val == "", "env value not set, names=%q", names) return val } @@ -70,7 +70,7 @@ func GetBool(names ...string) bool { v, err := strconv.ParseBool(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to bool, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to bool", "keys", names, "value", val, "err", err) return false } @@ -86,7 +86,7 @@ func GetInt(names ...string) int { v, err := strconv.Atoi(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to int, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to int", "keys", names, "value", val, "err", err) return -1 } @@ -102,7 +102,7 @@ func GetFloat(names ...string) float64 { v, err := strconv.ParseFloat(val, 64) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to float, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to float", "keys", names, "value", val, "err", err) return -1 } @@ -112,19 +112,21 @@ func GetFloat(names ...string) float64 { func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } func Delete(key string) result.Error { - return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { - e.Str("key", key) - e.Str(logfields.Msg, "env_delete_error") - }) + return result.ErrOf(os.Unsetenv(keyHandler(key))). + Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str(logfields.Msg, "env_delete_error") + }) } func MustDelete(key string) { Delete(key).Must() } func Expand(value string) result.Result[string] { - return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { - e.Str("value", value) - e.Str(logfields.Msg, "env_expand_error") - }) + return result.Wrap(envsubst.String(value)). + Log(func(e *zerolog.Event) { + e.Str("value", value) + e.Str(logfields.Msg, "env_expand_error") + }) } func Map() map[string]string { @@ -150,13 +152,22 @@ func LoadFiles(files ...string) (r result.Error) { return } + var needReloadEnv bool for _, file := range files { - data := result.Wrap(os.ReadFile(file)).Unwrap(&r) + data := result.Wrap(os.ReadFile(file)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to read file:%s", file)) + }). + Unwrap(&r) if r.IsErr() { return } - dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + dataMap := result.Wrap(godotenv.UnmarshalBytes(data)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to parse env file:%s", file)) + }). + Unwrap(&r) if r.IsErr() { return } @@ -169,10 +180,15 @@ func LoadFiles(files ...string) (r result.Error) { if Set(k, v).Catch(&r) { return } + + needReloadEnv = true } } - loadEnv() + if needReloadEnv { + loadEnv() + } + return } diff --git a/env/reload.go b/env/reload.go index 8c2818c..15acd50 100644 --- a/env/reload.go +++ b/env/reload.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/log/logfields" ) func Reload() { @@ -17,7 +16,7 @@ func Reload() { // 环境变量处理, key转大写, 同时把`-./`转换为`_` // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { - var logger = slog.With(slog.String(logfields.Module, Name)) + var logger = getLog() logger.Info("reload env") for _, env := range os.Environ() { diff --git a/env/util.go b/env/util.go index ddcccb1..2603c89 100644 --- a/env/util.go +++ b/env/util.go @@ -1,9 +1,11 @@ package env import ( + "log/slog" "strings" "github.com/ettle/strcase" + "github.com/pubgo/funk/v2/log/logfields" ) var trim = strings.TrimSpace @@ -21,3 +23,7 @@ func keyHandler(key string) string { key = strings.ReplaceAll(replacer.ToSNAKE(key), "__", "_") return strings.ToUpper(trim(key)) } + +func getLog() *slog.Logger { + return slog.With(slog.String(logfields.Module, Name)) +} diff --git a/errors/aaa.go b/errors/aaa.go index aaddd2c..999f947 100644 --- a/errors/aaa.go +++ b/errors/aaa.go @@ -9,7 +9,7 @@ type Tags = errinter.Tags type Tag = errinter.Tag type ErrIs = errinter.ErrIs type ErrAs = errinter.ErrAs -type ErrUnwrap = errinter.ErrUnwrap +type ErrUnwrapper = errinter.ErrUnwrapper type Error = errinter.Error type ErrorProto = errinter.ErrorProto type GRPCStatus = errinter.GRPCStatus diff --git a/errors/err_code.go b/errors/err_code.go index 332e30d..d04af86 100644 --- a/errors/err_code.go +++ b/errors/err_code.go @@ -7,13 +7,13 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/v2/errors/errinter" - "github.com/pubgo/funk/v2/generic" - "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" + + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/proto/errorpb" ) func NewCodeErrWithMap(code *errorpb.ErrCode, details ...map[string]any) error { @@ -91,13 +91,10 @@ func WrapCode(err error, code *errorpb.ErrCode) error { } code.Details = append(code.Details, MustProtoToAny(ParseErrToPb(err))) - return &ErrWrap{ - err: &ErrCode{pb: code, err: errors.New(code.Message)}, - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(code), - }, - } + return newErrWrap( + &ErrCode{pb: code, err: errors.New(code.Message)}, + Tags{Kv("msg", err.Error())}, + ) } var ( @@ -126,10 +123,9 @@ func (t *ErrCode) Is(err error) bool { return true } - var check = func(err2 *ErrCode) bool { - return err2.pb.Code == t.pb.Code && err2.pb.Name == t.pb.Name + var check = func(errCode *ErrCode) bool { + return errCode.pb.Code == t.pb.Code && errCode.pb.Name == t.pb.Name } - if err1, ok := err.(*ErrCode); ok && check(err1) { return true } diff --git a/errors/err_msg.go b/errors/err_msg.go index 2ffa04c..06f8c3f 100644 --- a/errors/err_msg.go +++ b/errors/err_msg.go @@ -9,7 +9,6 @@ import ( "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" ) @@ -39,13 +38,10 @@ func WrapMsg(err error, msg *errorpb.ErrMsg) error { msg.Id = lo.ToPtr(getErrorId(err)) } - return &ErrWrap{ - err: &ErrMsg{pb: msg, err: handleGrpcError(err)}, - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(msg), - }, - } + return newErrWrap( + &ErrMsg{pb: msg, err: handleGrpcError(err)}, + Tags{Kv("msg", err.Error())}, + ) } var ( diff --git a/errors/err_wrap.go b/errors/err_wrap.go index 3e8165d..655929c 100644 --- a/errors/err_wrap.go +++ b/errors/err_wrap.go @@ -5,9 +5,12 @@ import ( "encoding/json" "fmt" + "github.com/samber/lo" + "google.golang.org/protobuf/proto" + "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/proto/errorpb" - "google.golang.org/protobuf/proto" + "github.com/pubgo/funk/v2/stack" ) var ( @@ -15,23 +18,44 @@ var ( _ fmt.Formatter = (*ErrWrap)(nil) ) -type ErrWrap struct { - err error - id string - pb *errorpb.ErrWrap +func newErrWrapStack(err error, tags Tags) *ErrWrap { + if err == nil { + return nil + } + + pb := &errorpb.ErrWrap{ + Caller: stack.Caller(2).String(), + Stacks: lo.Map(getStack(), func(item *stack.Frame, index int) string { return item.String() }), + Error: MustProtoToAny(ParseErrToPb(err)), + Tags: tags.ToMap(), + Id: lo.ToPtr(getErrorId(err)), + } + + return &ErrWrap{err: err, pb: pb} } -func (e *ErrWrap) ID() string { - if e.id != "" { - return e.id +func newErrWrap(err error, tags Tags, callers ...int) *ErrWrap { + if err == nil { + return nil + } + + pb := &errorpb.ErrWrap{ + Caller: stack.Caller(2 + lo.FirstOrEmpty(callers)).String(), + Error: MustProtoToAny(ParseErrToPb(err)), + Tags: tags.ToMap(), + Id: lo.ToPtr(getErrorId(err)), } - e.id = getErrorId(e.err) - return e.id + return &ErrWrap{err: handleGrpcError(err), pb: pb} } -func (e *ErrWrap) Proto() proto.Message { - return e.pb + +type ErrWrap struct { + err error + pb *errorpb.ErrWrap } + +func (e *ErrWrap) ID() string { return e.pb.GetId() } +func (e *ErrWrap) Proto() proto.Message { return e.pb } func (e *ErrWrap) Format(f fmt.State, verb rune) { strFormat(f, verb, e) } func (e *ErrWrap) Unwrap() error { return e.err } func (e *ErrWrap) Kind() string { return "err_wrap" } diff --git a/errors/errinter/aaa.go b/errors/errinter/aaa.go index 466a747..50c7d67 100644 --- a/errors/errinter/aaa.go +++ b/errors/errinter/aaa.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" - "golang.org/x/xerrors" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" ) @@ -17,9 +16,9 @@ type Error interface { MarshalJSON() ([]byte, error) } -type ErrUnwrap = xerrors.Wrapper -type Formatter = xerrors.Formatter -type Printer = xerrors.Printer +type ErrUnwrapper interface { + Unwrap() error +} type ErrorProto interface { error diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index ebfbadc..bf5078d 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -51,7 +51,7 @@ func GetErrorId(err error) string { } func Unwrap(err error) error { - u, ok := err.(ErrUnwrap) + u, ok := err.(ErrUnwrapper) if !ok { return nil } diff --git a/errors/registry.go b/errors/errorcodes/registry.go similarity index 95% rename from errors/registry.go rename to errors/errorcodes/registry.go index 62abbec..fcf6f3b 100644 --- a/errors/registry.go +++ b/errors/errorcodes/registry.go @@ -1,4 +1,4 @@ -package errors +package errorcodes import ( "fmt" diff --git a/errors/errors.go b/errors/errors.go index ca37d0f..7e1d1f5 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -33,12 +33,10 @@ func Errorf(msg string, args ...interface{}) error { func Parse(val interface{}) error { return errinter.ParseError(val) } func Debug(err error) { errinter.Debug(err) } - func Is(err, target error) bool { return errors.Is(err, target) } func Join(errs ...error) error { return errors.Join(errs...) } - func UnwrapEach(err error, call func(e error) bool) { if err == nil { return @@ -49,7 +47,7 @@ func UnwrapEach(err error, call func(e error) bool) { return } - err1, ok := err.(ErrUnwrap) + err1, ok := err.(ErrUnwrapper) if !ok { return } @@ -91,7 +89,7 @@ func As(err error, target any) bool { } func Unwrap(err error) error { - u, ok := err.(ErrUnwrap) + u, ok := err.(ErrUnwrapper) if !ok { return nil } @@ -104,14 +102,7 @@ func WrapStack(err error) error { } stack.PrintStack() - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Stacks: lo.Map(getStack(), func(item *stack.Frame, index int) string { return item.String() }), - Error: MustProtoToAny(ParseErrToPb(err)), - }, - } + return newErrWrapStack(err, Tags{T("msg", err.Error())}) } func WrapCaller(err error, skip ...int) error { @@ -119,18 +110,7 @@ func WrapCaller(err error, skip ...int) error { return nil } - depth := 1 - if len(skip) > 0 { - depth += skip[0] - } - - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(depth).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - }, - } + return newErrWrap(err, Tags{T("msg", err.Error())}, lo.FirstOrEmpty(skip)) } func Wrapf(err error, format string, args ...interface{}) error { @@ -138,14 +118,7 @@ func Wrapf(err error, format string, args ...interface{}) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T("msg", fmt.Sprintf(format, args...))}.ToMap(), - }, - } + return newErrWrap(err, Tags{T("msg", fmt.Sprintf(format, args...))}) } func Wrap(err error, msg string) error { @@ -153,14 +126,7 @@ func Wrap(err error, msg string) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T("msg", msg)}.ToMap(), - }, - } + return newErrWrap(err, Tags{T("msg", msg)}) } func WrapMapTag(err error, tags Maps) error { @@ -172,14 +138,7 @@ func WrapMapTag(err error, tags Maps) error { return err } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: tags.Tags().ToMap(), - }, - } + return newErrWrap(err, tags.Tags()) } func WrapTag(err error, tags ...Tag) error { @@ -187,14 +146,7 @@ func WrapTag(err error, tags ...Tag) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags(tags).ToMap(), - }, - } + return newErrWrap(err, tags) } func WrapFn(err error, fn func() Tags) error { @@ -202,14 +154,7 @@ func WrapFn(err error, fn func() Tags) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: fn().ToMap(), - }, - } + return newErrWrap(err, fn()) } func WrapKV(err error, key string, value any, kvs ...any) error { @@ -222,20 +167,11 @@ func WrapKV(err error, key string, value any, kvs ...any) error { tags = append(tags, Tag{K: kvs[i].(string), V: kvs[i+1]}) } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T(key, value)}.ToMap(), - }, - } -} - -func T(k string, v any) Tag { - return Tag{K: k, V: v} + return newErrWrap(err, tags) } +func Kv(k string, v any) Tag { return Tag{K: k, V: v} } +func T(k string, v any) Tag { return Tag{K: k, V: v} } func MustTagsToAny(tags ...*errorpb.Tag) []*anypb.Any { return errinter.MustTagsToAny(tags...) } func MustStructToAny(p map[string]any) *anypb.Any { return errinter.MustStructToAny(p) } func MustProtoToAny(p proto.Message) *anypb.Any { return errinter.MustProtoToAny(p) } diff --git a/errors/stack_filters.go b/errors/stack_filters.go deleted file mode 100644 index 9c1edfc..0000000 --- a/errors/stack_filters.go +++ /dev/null @@ -1,25 +0,0 @@ -package errors - -import ( - "github.com/pubgo/funk/v2/stack" -) - -var stackFilters []func(frame *stack.Frame) bool - -// RegStackPkgFilter filter fn , pkg -func RegStackPkgFilter(filters ...func(frame *stack.Frame) bool) { - if len(filters) == 0 { - return - } - - stackFilters = append(stackFilters, filters...) -} - -func filterStack(frame *stack.Frame) bool { - for _, filter := range stackFilters { - if filter(frame) { - return true - } - } - return false -} diff --git a/errors/util.go b/errors/util.go index f38cc97..3d38213 100644 --- a/errors/util.go +++ b/errors/util.go @@ -22,7 +22,9 @@ func cloneAndCheck(code *errorpb.ErrCode) *errorpb.ErrCode { } code = proto.Clone(code).(*errorpb.ErrCode) - if code.Name != "" && code.StatusCode == 0 { + if code.Code == 0 { + code.StatusCode = errorpb.Code_OK + } else if code.StatusCode == errorpb.Code_OK { code.StatusCode = errorpb.Code_Internal } @@ -106,9 +108,7 @@ func strFormat(f fmt.State, verb rune, err Error) { } func getStack() []*stack.Frame { - return lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { - return !item.IsRuntime() && !filterStack(item) - }) + return lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { return !item.IsRuntime() }) } func newErrorId() *string { diff --git a/errors/z_code_test.go b/errors/z_code_test.go index 113354f..9fbbb13 100644 --- a/errors/z_code_test.go +++ b/errors/z_code_test.go @@ -11,11 +11,18 @@ import ( func TestWrapCaller(t *testing.T) { err := fmt.Errorf("test") + assert.Contains(t, fmt.Sprint(err), "test") + var ff = func() error { return errors.WrapCaller(err, 1) } - assert.Contains(t, fmt.Sprint(ff()), "z_code_test.go:18 TestWrapCaller") + err = ff() + assert.Contains(t, fmt.Sprint(err), "z_code_test.go:20 TestWrapCaller") + + err = errors.WrapKV(err, "key", "value") + errors.Debug(err) + assert.Contains(t, fmt.Sprint(err), "z_code_test.go:20 TestWrapCaller") } func TestCodeErr(t *testing.T) { diff --git a/go.mod b/go.mod index 4fd6bdd..5aa9436 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,6 @@ require ( golang.org/x/mod v0.25.0 golang.org/x/sys v0.33.0 golang.org/x/text v0.26.0 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.5 diff --git a/go.sum b/go.sum index 09f9760..f869b10 100644 --- a/go.sum +++ b/go.sum @@ -399,7 +399,6 @@ golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= diff --git a/proto/errorpb/errors.pb.go b/proto/errorpb/errors.pb.go index 58a22c7..4c5e3db 100644 --- a/proto/errorpb/errors.pb.go +++ b/proto/errorpb/errors.pb.go @@ -243,75 +243,6 @@ func (x *ErrCode) GetId() string { return "" } -type ErrTrace struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"` - Service string `protobuf:"bytes,4,opt,name=service,proto3" json:"service,omitempty"` - Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` -} - -func (x *ErrTrace) Reset() { - *x = ErrTrace{} - mi := &file_errorpb_errors_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ErrTrace) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ErrTrace) ProtoMessage() {} - -func (x *ErrTrace) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ErrTrace.ProtoReflect.Descriptor instead. -func (*ErrTrace) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{3} -} - -func (x *ErrTrace) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ErrTrace) GetOperation() string { - if x != nil { - return x.Operation - } - return "" -} - -func (x *ErrTrace) GetService() string { - if x != nil { - return x.Service - } - return "" -} - -func (x *ErrTrace) GetVersion() string { - if x != nil { - return x.Version - } - return "" -} - type ErrWrap struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -321,11 +252,13 @@ type ErrWrap struct { Caller string `protobuf:"bytes,2,opt,name=caller,proto3" json:"caller,omitempty"` Stacks []string `protobuf:"bytes,3,rep,name=stacks,proto3" json:"stacks,omitempty"` Error *anypb.Any `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + // Error id, which can be used to trace error + Id *string `protobuf:"bytes,5,opt,name=id,proto3,oneof" json:"id,omitempty"` } func (x *ErrWrap) Reset() { *x = ErrWrap{} - mi := &file_errorpb_errors_proto_msgTypes[4] + mi := &file_errorpb_errors_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -337,7 +270,7 @@ func (x *ErrWrap) String() string { func (*ErrWrap) ProtoMessage() {} func (x *ErrWrap) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[4] + mi := &file_errorpb_errors_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -350,7 +283,7 @@ func (x *ErrWrap) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrWrap.ProtoReflect.Descriptor instead. func (*ErrWrap) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{4} + return file_errorpb_errors_proto_rawDescGZIP(), []int{3} } func (x *ErrWrap) GetTags() map[string]string { @@ -381,6 +314,13 @@ func (x *ErrWrap) GetError() *anypb.Any { return nil } +func (x *ErrWrap) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + var File_errorpb_errors_proto protoreflect.FileDescriptor var file_errorpb_errors_proto_rawDesc = []byte{ @@ -417,30 +357,25 @@ var file_errorpb_errors_proto_rawDesc = []byte{ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, - 0x5f, 0x69, 0x64, 0x22, 0x6c, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, - 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5f, 0x69, 0x64, 0x22, 0xe9, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, + 0x2d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, + 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, + 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, + 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -455,24 +390,23 @@ func file_errorpb_errors_proto_rawDescGZIP() []byte { return file_errorpb_errors_proto_rawDescData } -var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_errorpb_errors_proto_goTypes = []any{ (*Tag)(nil), // 0: errors.Tag (*ErrMsg)(nil), // 1: errors.ErrMsg (*ErrCode)(nil), // 2: errors.ErrCode - (*ErrTrace)(nil), // 3: errors.ErrTrace - (*ErrWrap)(nil), // 4: errors.ErrWrap - nil, // 5: errors.ErrMsg.TagsEntry - nil, // 6: errors.ErrWrap.TagsEntry - (Code)(0), // 7: errors.Code - (*anypb.Any)(nil), // 8: google.protobuf.Any + (*ErrWrap)(nil), // 3: errors.ErrWrap + nil, // 4: errors.ErrMsg.TagsEntry + nil, // 5: errors.ErrWrap.TagsEntry + (Code)(0), // 6: errors.Code + (*anypb.Any)(nil), // 7: google.protobuf.Any } var file_errorpb_errors_proto_depIdxs = []int32{ - 5, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry - 7, // 1: errors.ErrCode.status_code:type_name -> errors.Code - 8, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any - 6, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry - 8, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any + 4, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry + 6, // 1: errors.ErrCode.status_code:type_name -> errors.Code + 7, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any + 5, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry + 7, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any 5, // [5:5] is the sub-list for method output_type 5, // [5:5] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name @@ -488,13 +422,14 @@ func file_errorpb_errors_proto_init() { file_errorpb_code_proto_init() file_errorpb_errors_proto_msgTypes[1].OneofWrappers = []any{} file_errorpb_errors_proto_msgTypes[2].OneofWrappers = []any{} + file_errorpb_errors_proto_msgTypes[3].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_errorpb_errors_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/errorpb/errors.proto b/proto/errorpb/errors.proto index df6d1f6..39a4f91 100644 --- a/proto/errorpb/errors.proto +++ b/proto/errorpb/errors.proto @@ -41,16 +41,18 @@ message ErrCode { optional string id = 6; } -message ErrTrace { - string id = 2; - string operation = 3; - string service = 4; - string version = 5; -} +//message ErrTrace { +// string id = 2; +// string operation = 3; +// string service = 4; +// string version = 5; +//} message ErrWrap { map tags = 1; string caller = 2; repeated string stacks = 3; google.protobuf.Any error = 4; + // Error id, which can be used to trace error + optional string id = 5; } diff --git a/proto/errorpb/options.pb.go b/proto/errorpb/options.pb.go index 9e0c1c2..53f2fd6 100644 --- a/proto/errorpb/options.pb.go +++ b/proto/errorpb/options.pb.go @@ -26,9 +26,13 @@ type Options struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Gen bool `protobuf:"varint,1,opt,name=gen,proto3" json:"gen,omitempty"` - DefaultCode Code `protobuf:"varint,2,opt,name=default_code,json=defaultCode,proto3,enum=errors.Code" json:"default_code,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // gen 是否生成 error code + Gen bool `protobuf:"varint,1,opt,name=gen,proto3" json:"gen,omitempty"` + // default_code 默认的 error code, 可能是 Internal + DefaultCode Code `protobuf:"varint,2,opt,name=default_code,json=defaultCode,proto3,enum=errors.Code" json:"default_code,omitempty"` + // name 是生成的 error code 的变量名前缀 + // 如果 name = Test, 那么 生成的 error code 变量名可能为 `TestErrCodeNotFound` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *Options) Reset() { diff --git a/proto/errorpb/options.proto b/proto/errorpb/options.proto index 595f5a4..d8d84f4 100644 --- a/proto/errorpb/options.proto +++ b/proto/errorpb/options.proto @@ -8,8 +8,14 @@ import "google/protobuf/descriptor.proto"; option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Options { + // gen 是否生成 error code bool gen = 1; + + // default_code 默认的 error code, 可能是 Internal Code default_code = 2; + + // name 是生成的 error code 的变量名前缀 + // 如果 name = Test, 那么 生成的 error code 变量名可能为 `TestErrCodeNotFound` string name = 3; } diff --git a/proto/testcodepb/test.errors.pb.go b/proto/testcodepb/test.errors.pb.go index 49ac2f7..025df67 100644 --- a/proto/testcodepb/test.errors.pb.go +++ b/proto/testcodepb/test.errors.pb.go @@ -7,7 +7,7 @@ package testcodepb import ( - errors "github.com/pubgo/funk/v2/errors" + errorcodes "github.com/pubgo/funk/v2/errors/errorcodes" errorpb "github.com/pubgo/funk/v2/proto/errorpb" grpc "google.golang.org/grpc" ) @@ -23,7 +23,7 @@ var TestErrCodeOK = &errorpb.ErrCode{ Name: "demo.test.v1.ok", StatusCode: errorpb.Code_OK, } -var _ = errors.RegisterErrCodes(TestErrCodeOK) +var _ = errorcodes.RegisterErrCodes(TestErrCodeOK) var TestErrCodeNotFound = &errorpb.ErrCode{ Code: int32(100000), @@ -31,7 +31,7 @@ var TestErrCodeNotFound = &errorpb.ErrCode{ Name: "demo.test.v1.not_found", StatusCode: errorpb.Code_NotFound, } -var _ = errors.RegisterErrCodes(TestErrCodeNotFound) +var _ = errorcodes.RegisterErrCodes(TestErrCodeNotFound) var TestErrCodeUnknown = &errorpb.ErrCode{ Code: int32(100001), @@ -39,7 +39,7 @@ var TestErrCodeUnknown = &errorpb.ErrCode{ Name: "demo.test.v1.unknown", StatusCode: errorpb.Code_NotFound, } -var _ = errors.RegisterErrCodes(TestErrCodeUnknown) +var _ = errorcodes.RegisterErrCodes(TestErrCodeUnknown) var TestErrCodeDbConn = &errorpb.ErrCode{ Code: int32(100003), @@ -47,7 +47,7 @@ var TestErrCodeDbConn = &errorpb.ErrCode{ Name: "demo.test.v1.db_conn", StatusCode: errorpb.Code_Internal, } -var _ = errors.RegisterErrCodes(TestErrCodeDbConn) +var _ = errorcodes.RegisterErrCodes(TestErrCodeDbConn) var TestErrCodeUnknownCode = &errorpb.ErrCode{ Code: int32(100004), @@ -55,7 +55,7 @@ var TestErrCodeUnknownCode = &errorpb.ErrCode{ Name: "demo.test.v1.unknown_code", StatusCode: errorpb.Code_Internal, } -var _ = errors.RegisterErrCodes(TestErrCodeUnknownCode) +var _ = errorcodes.RegisterErrCodes(TestErrCodeUnknownCode) var TestErrCodeCustomCode = &errorpb.ErrCode{ Code: int32(100005), @@ -63,4 +63,4 @@ var TestErrCodeCustomCode = &errorpb.ErrCode{ Name: "demo.custom.code", StatusCode: errorpb.Code_OK, } -var _ = errors.RegisterErrCodes(TestErrCodeCustomCode) +var _ = errorcodes.RegisterErrCodes(TestErrCodeCustomCode) From f4b877603877f252895fc0f9fcae9a45b9be1596 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 22 Oct 2025 11:19:51 +0800 Subject: [PATCH 42/43] chore: quick update fix/version at 2025-10-22 20:26:40 --- cmds/protoc-gen-go-errors2/internal/gen.go | 2 +- env/env.go | 58 +++++--- env/reload.go | 3 +- env/util.go | 6 + errors/aaa.go | 2 +- errors/err_code.go | 24 ++-- errors/err_msg.go | 12 +- errors/err_wrap.go | 48 +++++-- errors/errinter/aaa.go | 7 +- errors/errinter/utils.go | 2 +- errors/{ => errorcodes}/registry.go | 2 +- errors/errors.go | 88 ++---------- errors/stack_filters.go | 25 ---- errors/util.go | 8 +- errors/z_code_test.go | 9 +- go.mod | 1 - go.sum | 1 - proto/errorpb/errors.pb.go | 153 ++++++--------------- proto/errorpb/errors.proto | 14 +- proto/errorpb/options.pb.go | 10 +- proto/errorpb/options.proto | 6 + proto/testcodepb/test.errors.pb.go | 14 +- 22 files changed, 197 insertions(+), 298 deletions(-) rename errors/{ => errorcodes}/registry.go (95%) delete mode 100644 errors/stack_filters.go diff --git a/cmds/protoc-gen-go-errors2/internal/gen.go b/cmds/protoc-gen-go-errors2/internal/gen.go index 7c19e35..d846f37 100644 --- a/cmds/protoc-gen-go-errors2/internal/gen.go +++ b/cmds/protoc-gen-go-errors2/internal/gen.go @@ -93,7 +93,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated jen.Id("Message"): jen.Lit(rr), }) genFile.Var().Id("_").Op("="). - Qual("github.com/pubgo/funk/v2/errors", "RegisterErrCodes"). + Qual("github.com/pubgo/funk/v2/errors/errorcodes", "RegisterErrCodes"). Call(jen.Id(errCodeName)).Line() } } diff --git a/env/env.go b/env/env.go index 2a8cfb8..e5858ee 100644 --- a/env/env.go +++ b/env/env.go @@ -2,7 +2,6 @@ package env import ( "fmt" - "log/slog" "os" "strconv" "strings" @@ -21,11 +20,12 @@ import ( const Name = "env" func Set(key, value string) result.Error { - return result.ErrOf(os.Setenv(keyHandler(key), value)).Log(func(e *zerolog.Event) { - e.Str("key", key) - e.Str("value", value) - e.Str(logfields.Msg, "env_set_error") - }) + return result.ErrOf(os.Setenv(keyHandler(key), value)). + Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str("value", value) + e.Str(logfields.Msg, "env_set_error") + }) } func MustSet(key, value string) { Set(key, value).Must() } @@ -38,7 +38,7 @@ func Get(names ...string) string { func MustGet(names ...string) string { val := Get(names...) - assert.If(val == "", "env not found, names=%q", names) + assert.If(val == "", "env value not set, names=%q", names) return val } @@ -70,7 +70,7 @@ func GetBool(names ...string) bool { v, err := strconv.ParseBool(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to bool, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to bool", "keys", names, "value", val, "err", err) return false } @@ -86,7 +86,7 @@ func GetInt(names ...string) int { v, err := strconv.Atoi(val) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to int, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to int", "keys", names, "value", val, "err", err) return -1 } @@ -102,7 +102,7 @@ func GetFloat(names ...string) float64 { v, err := strconv.ParseFloat(val, 64) if err != nil { - slog.Error(fmt.Sprintf("env: failed to parse string to float, keys=%q value=%s err=%v", names, val, err)) + getLog().Error("failed to parse string to float", "keys", names, "value", val, "err", err) return -1 } @@ -112,19 +112,21 @@ func GetFloat(names ...string) float64 { func Lookup(key string) (string, bool) { return os.LookupEnv(keyHandler(key)) } func Delete(key string) result.Error { - return result.ErrOf(os.Unsetenv(keyHandler(key))).Log(func(e *zerolog.Event) { - e.Str("key", key) - e.Str(logfields.Msg, "env_delete_error") - }) + return result.ErrOf(os.Unsetenv(keyHandler(key))). + Log(func(e *zerolog.Event) { + e.Str("key", key) + e.Str(logfields.Msg, "env_delete_error") + }) } func MustDelete(key string) { Delete(key).Must() } func Expand(value string) result.Result[string] { - return result.Wrap(envsubst.String(value)).Log(func(e *zerolog.Event) { - e.Str("value", value) - e.Str(logfields.Msg, "env_expand_error") - }) + return result.Wrap(envsubst.String(value)). + Log(func(e *zerolog.Event) { + e.Str("value", value) + e.Str(logfields.Msg, "env_expand_error") + }) } func Map() map[string]string { @@ -150,13 +152,22 @@ func LoadFiles(files ...string) (r result.Error) { return } + var needReloadEnv bool for _, file := range files { - data := result.Wrap(os.ReadFile(file)).Unwrap(&r) + data := result.Wrap(os.ReadFile(file)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to read file:%s", file)) + }). + Unwrap(&r) if r.IsErr() { return } - dataMap := result.Wrap(godotenv.UnmarshalBytes(data)).Unwrap(&r) + dataMap := result.Wrap(godotenv.UnmarshalBytes(data)). + Log(func(e *zerolog.Event) { + e.Str(logfields.Msg, fmt.Sprintf("failed to parse env file:%s", file)) + }). + Unwrap(&r) if r.IsErr() { return } @@ -169,10 +180,15 @@ func LoadFiles(files ...string) (r result.Error) { if Set(k, v).Catch(&r) { return } + + needReloadEnv = true } } - loadEnv() + if needReloadEnv { + loadEnv() + } + return } diff --git a/env/reload.go b/env/reload.go index 8c2818c..15acd50 100644 --- a/env/reload.go +++ b/env/reload.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/pubgo/funk/v2/assert" - "github.com/pubgo/funk/v2/log/logfields" ) func Reload() { @@ -17,7 +16,7 @@ func Reload() { // 环境变量处理, key转大写, 同时把`-./`转换为`_` // a-b=>a_b, a.b=>a_b, a/b=>a_b func loadEnv() { - var logger = slog.With(slog.String(logfields.Module, Name)) + var logger = getLog() logger.Info("reload env") for _, env := range os.Environ() { diff --git a/env/util.go b/env/util.go index ddcccb1..6072995 100644 --- a/env/util.go +++ b/env/util.go @@ -1,7 +1,9 @@ package env import ( + "log/slog" "strings" + "sync" "github.com/ettle/strcase" ) @@ -21,3 +23,7 @@ func keyHandler(key string) string { key = strings.ReplaceAll(replacer.ToSNAKE(key), "__", "_") return strings.ToUpper(trim(key)) } + +var getLog = sync.OnceValue(func() *slog.Logger { + return slog.Default().WithGroup(Name) +}) diff --git a/errors/aaa.go b/errors/aaa.go index aaddd2c..999f947 100644 --- a/errors/aaa.go +++ b/errors/aaa.go @@ -9,7 +9,7 @@ type Tags = errinter.Tags type Tag = errinter.Tag type ErrIs = errinter.ErrIs type ErrAs = errinter.ErrAs -type ErrUnwrap = errinter.ErrUnwrap +type ErrUnwrapper = errinter.ErrUnwrapper type Error = errinter.Error type ErrorProto = errinter.ErrorProto type GRPCStatus = errinter.GRPCStatus diff --git a/errors/err_code.go b/errors/err_code.go index 332e30d..d04af86 100644 --- a/errors/err_code.go +++ b/errors/err_code.go @@ -7,13 +7,13 @@ import ( "fmt" "strings" - "github.com/pubgo/funk/v2/errors/errinter" - "github.com/pubgo/funk/v2/generic" - "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" + + "github.com/pubgo/funk/v2/errors/errinter" + "github.com/pubgo/funk/v2/generic" + "github.com/pubgo/funk/v2/proto/errorpb" ) func NewCodeErrWithMap(code *errorpb.ErrCode, details ...map[string]any) error { @@ -91,13 +91,10 @@ func WrapCode(err error, code *errorpb.ErrCode) error { } code.Details = append(code.Details, MustProtoToAny(ParseErrToPb(err))) - return &ErrWrap{ - err: &ErrCode{pb: code, err: errors.New(code.Message)}, - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(code), - }, - } + return newErrWrap( + &ErrCode{pb: code, err: errors.New(code.Message)}, + Tags{Kv("msg", err.Error())}, + ) } var ( @@ -126,10 +123,9 @@ func (t *ErrCode) Is(err error) bool { return true } - var check = func(err2 *ErrCode) bool { - return err2.pb.Code == t.pb.Code && err2.pb.Name == t.pb.Name + var check = func(errCode *ErrCode) bool { + return errCode.pb.Code == t.pb.Code && errCode.pb.Name == t.pb.Name } - if err1, ok := err.(*ErrCode); ok && check(err1) { return true } diff --git a/errors/err_msg.go b/errors/err_msg.go index 2ffa04c..06f8c3f 100644 --- a/errors/err_msg.go +++ b/errors/err_msg.go @@ -9,7 +9,6 @@ import ( "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/generic" "github.com/pubgo/funk/v2/proto/errorpb" - "github.com/pubgo/funk/v2/stack" "github.com/samber/lo" "google.golang.org/protobuf/proto" ) @@ -39,13 +38,10 @@ func WrapMsg(err error, msg *errorpb.ErrMsg) error { msg.Id = lo.ToPtr(getErrorId(err)) } - return &ErrWrap{ - err: &ErrMsg{pb: msg, err: handleGrpcError(err)}, - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(msg), - }, - } + return newErrWrap( + &ErrMsg{pb: msg, err: handleGrpcError(err)}, + Tags{Kv("msg", err.Error())}, + ) } var ( diff --git a/errors/err_wrap.go b/errors/err_wrap.go index 3e8165d..655929c 100644 --- a/errors/err_wrap.go +++ b/errors/err_wrap.go @@ -5,9 +5,12 @@ import ( "encoding/json" "fmt" + "github.com/samber/lo" + "google.golang.org/protobuf/proto" + "github.com/pubgo/funk/v2/errors/errinter" "github.com/pubgo/funk/v2/proto/errorpb" - "google.golang.org/protobuf/proto" + "github.com/pubgo/funk/v2/stack" ) var ( @@ -15,23 +18,44 @@ var ( _ fmt.Formatter = (*ErrWrap)(nil) ) -type ErrWrap struct { - err error - id string - pb *errorpb.ErrWrap +func newErrWrapStack(err error, tags Tags) *ErrWrap { + if err == nil { + return nil + } + + pb := &errorpb.ErrWrap{ + Caller: stack.Caller(2).String(), + Stacks: lo.Map(getStack(), func(item *stack.Frame, index int) string { return item.String() }), + Error: MustProtoToAny(ParseErrToPb(err)), + Tags: tags.ToMap(), + Id: lo.ToPtr(getErrorId(err)), + } + + return &ErrWrap{err: err, pb: pb} } -func (e *ErrWrap) ID() string { - if e.id != "" { - return e.id +func newErrWrap(err error, tags Tags, callers ...int) *ErrWrap { + if err == nil { + return nil + } + + pb := &errorpb.ErrWrap{ + Caller: stack.Caller(2 + lo.FirstOrEmpty(callers)).String(), + Error: MustProtoToAny(ParseErrToPb(err)), + Tags: tags.ToMap(), + Id: lo.ToPtr(getErrorId(err)), } - e.id = getErrorId(e.err) - return e.id + return &ErrWrap{err: handleGrpcError(err), pb: pb} } -func (e *ErrWrap) Proto() proto.Message { - return e.pb + +type ErrWrap struct { + err error + pb *errorpb.ErrWrap } + +func (e *ErrWrap) ID() string { return e.pb.GetId() } +func (e *ErrWrap) Proto() proto.Message { return e.pb } func (e *ErrWrap) Format(f fmt.State, verb rune) { strFormat(f, verb, e) } func (e *ErrWrap) Unwrap() error { return e.err } func (e *ErrWrap) Kind() string { return "err_wrap" } diff --git a/errors/errinter/aaa.go b/errors/errinter/aaa.go index 466a747..50c7d67 100644 --- a/errors/errinter/aaa.go +++ b/errors/errinter/aaa.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" - "golang.org/x/xerrors" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" ) @@ -17,9 +16,9 @@ type Error interface { MarshalJSON() ([]byte, error) } -type ErrUnwrap = xerrors.Wrapper -type Formatter = xerrors.Formatter -type Printer = xerrors.Printer +type ErrUnwrapper interface { + Unwrap() error +} type ErrorProto interface { error diff --git a/errors/errinter/utils.go b/errors/errinter/utils.go index ebfbadc..bf5078d 100644 --- a/errors/errinter/utils.go +++ b/errors/errinter/utils.go @@ -51,7 +51,7 @@ func GetErrorId(err error) string { } func Unwrap(err error) error { - u, ok := err.(ErrUnwrap) + u, ok := err.(ErrUnwrapper) if !ok { return nil } diff --git a/errors/registry.go b/errors/errorcodes/registry.go similarity index 95% rename from errors/registry.go rename to errors/errorcodes/registry.go index 62abbec..fcf6f3b 100644 --- a/errors/registry.go +++ b/errors/errorcodes/registry.go @@ -1,4 +1,4 @@ -package errors +package errorcodes import ( "fmt" diff --git a/errors/errors.go b/errors/errors.go index ca37d0f..7e1d1f5 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -33,12 +33,10 @@ func Errorf(msg string, args ...interface{}) error { func Parse(val interface{}) error { return errinter.ParseError(val) } func Debug(err error) { errinter.Debug(err) } - func Is(err, target error) bool { return errors.Is(err, target) } func Join(errs ...error) error { return errors.Join(errs...) } - func UnwrapEach(err error, call func(e error) bool) { if err == nil { return @@ -49,7 +47,7 @@ func UnwrapEach(err error, call func(e error) bool) { return } - err1, ok := err.(ErrUnwrap) + err1, ok := err.(ErrUnwrapper) if !ok { return } @@ -91,7 +89,7 @@ func As(err error, target any) bool { } func Unwrap(err error) error { - u, ok := err.(ErrUnwrap) + u, ok := err.(ErrUnwrapper) if !ok { return nil } @@ -104,14 +102,7 @@ func WrapStack(err error) error { } stack.PrintStack() - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Stacks: lo.Map(getStack(), func(item *stack.Frame, index int) string { return item.String() }), - Error: MustProtoToAny(ParseErrToPb(err)), - }, - } + return newErrWrapStack(err, Tags{T("msg", err.Error())}) } func WrapCaller(err error, skip ...int) error { @@ -119,18 +110,7 @@ func WrapCaller(err error, skip ...int) error { return nil } - depth := 1 - if len(skip) > 0 { - depth += skip[0] - } - - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(depth).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - }, - } + return newErrWrap(err, Tags{T("msg", err.Error())}, lo.FirstOrEmpty(skip)) } func Wrapf(err error, format string, args ...interface{}) error { @@ -138,14 +118,7 @@ func Wrapf(err error, format string, args ...interface{}) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T("msg", fmt.Sprintf(format, args...))}.ToMap(), - }, - } + return newErrWrap(err, Tags{T("msg", fmt.Sprintf(format, args...))}) } func Wrap(err error, msg string) error { @@ -153,14 +126,7 @@ func Wrap(err error, msg string) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T("msg", msg)}.ToMap(), - }, - } + return newErrWrap(err, Tags{T("msg", msg)}) } func WrapMapTag(err error, tags Maps) error { @@ -172,14 +138,7 @@ func WrapMapTag(err error, tags Maps) error { return err } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: tags.Tags().ToMap(), - }, - } + return newErrWrap(err, tags.Tags()) } func WrapTag(err error, tags ...Tag) error { @@ -187,14 +146,7 @@ func WrapTag(err error, tags ...Tag) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags(tags).ToMap(), - }, - } + return newErrWrap(err, tags) } func WrapFn(err error, fn func() Tags) error { @@ -202,14 +154,7 @@ func WrapFn(err error, fn func() Tags) error { return nil } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: fn().ToMap(), - }, - } + return newErrWrap(err, fn()) } func WrapKV(err error, key string, value any, kvs ...any) error { @@ -222,20 +167,11 @@ func WrapKV(err error, key string, value any, kvs ...any) error { tags = append(tags, Tag{K: kvs[i].(string), V: kvs[i+1]}) } - return &ErrWrap{ - err: handleGrpcError(err), - pb: &errorpb.ErrWrap{ - Caller: stack.Caller(1).String(), - Error: MustProtoToAny(ParseErrToPb(err)), - Tags: Tags{T(key, value)}.ToMap(), - }, - } -} - -func T(k string, v any) Tag { - return Tag{K: k, V: v} + return newErrWrap(err, tags) } +func Kv(k string, v any) Tag { return Tag{K: k, V: v} } +func T(k string, v any) Tag { return Tag{K: k, V: v} } func MustTagsToAny(tags ...*errorpb.Tag) []*anypb.Any { return errinter.MustTagsToAny(tags...) } func MustStructToAny(p map[string]any) *anypb.Any { return errinter.MustStructToAny(p) } func MustProtoToAny(p proto.Message) *anypb.Any { return errinter.MustProtoToAny(p) } diff --git a/errors/stack_filters.go b/errors/stack_filters.go deleted file mode 100644 index 9c1edfc..0000000 --- a/errors/stack_filters.go +++ /dev/null @@ -1,25 +0,0 @@ -package errors - -import ( - "github.com/pubgo/funk/v2/stack" -) - -var stackFilters []func(frame *stack.Frame) bool - -// RegStackPkgFilter filter fn , pkg -func RegStackPkgFilter(filters ...func(frame *stack.Frame) bool) { - if len(filters) == 0 { - return - } - - stackFilters = append(stackFilters, filters...) -} - -func filterStack(frame *stack.Frame) bool { - for _, filter := range stackFilters { - if filter(frame) { - return true - } - } - return false -} diff --git a/errors/util.go b/errors/util.go index f38cc97..3d38213 100644 --- a/errors/util.go +++ b/errors/util.go @@ -22,7 +22,9 @@ func cloneAndCheck(code *errorpb.ErrCode) *errorpb.ErrCode { } code = proto.Clone(code).(*errorpb.ErrCode) - if code.Name != "" && code.StatusCode == 0 { + if code.Code == 0 { + code.StatusCode = errorpb.Code_OK + } else if code.StatusCode == errorpb.Code_OK { code.StatusCode = errorpb.Code_Internal } @@ -106,9 +108,7 @@ func strFormat(f fmt.State, verb rune, err Error) { } func getStack() []*stack.Frame { - return lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { - return !item.IsRuntime() && !filterStack(item) - }) + return lo.Filter(stack.Trace(), func(item *stack.Frame, index int) bool { return !item.IsRuntime() }) } func newErrorId() *string { diff --git a/errors/z_code_test.go b/errors/z_code_test.go index 113354f..9fbbb13 100644 --- a/errors/z_code_test.go +++ b/errors/z_code_test.go @@ -11,11 +11,18 @@ import ( func TestWrapCaller(t *testing.T) { err := fmt.Errorf("test") + assert.Contains(t, fmt.Sprint(err), "test") + var ff = func() error { return errors.WrapCaller(err, 1) } - assert.Contains(t, fmt.Sprint(ff()), "z_code_test.go:18 TestWrapCaller") + err = ff() + assert.Contains(t, fmt.Sprint(err), "z_code_test.go:20 TestWrapCaller") + + err = errors.WrapKV(err, "key", "value") + errors.Debug(err) + assert.Contains(t, fmt.Sprint(err), "z_code_test.go:20 TestWrapCaller") } func TestCodeErr(t *testing.T) { diff --git a/go.mod b/go.mod index 4fd6bdd..5aa9436 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,6 @@ require ( golang.org/x/mod v0.25.0 golang.org/x/sys v0.33.0 golang.org/x/text v0.26.0 - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.5 diff --git a/go.sum b/go.sum index 09f9760..f869b10 100644 --- a/go.sum +++ b/go.sum @@ -399,7 +399,6 @@ golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= diff --git a/proto/errorpb/errors.pb.go b/proto/errorpb/errors.pb.go index 58a22c7..4c5e3db 100644 --- a/proto/errorpb/errors.pb.go +++ b/proto/errorpb/errors.pb.go @@ -243,75 +243,6 @@ func (x *ErrCode) GetId() string { return "" } -type ErrTrace struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Operation string `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"` - Service string `protobuf:"bytes,4,opt,name=service,proto3" json:"service,omitempty"` - Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"` -} - -func (x *ErrTrace) Reset() { - *x = ErrTrace{} - mi := &file_errorpb_errors_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ErrTrace) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ErrTrace) ProtoMessage() {} - -func (x *ErrTrace) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ErrTrace.ProtoReflect.Descriptor instead. -func (*ErrTrace) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{3} -} - -func (x *ErrTrace) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ErrTrace) GetOperation() string { - if x != nil { - return x.Operation - } - return "" -} - -func (x *ErrTrace) GetService() string { - if x != nil { - return x.Service - } - return "" -} - -func (x *ErrTrace) GetVersion() string { - if x != nil { - return x.Version - } - return "" -} - type ErrWrap struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -321,11 +252,13 @@ type ErrWrap struct { Caller string `protobuf:"bytes,2,opt,name=caller,proto3" json:"caller,omitempty"` Stacks []string `protobuf:"bytes,3,rep,name=stacks,proto3" json:"stacks,omitempty"` Error *anypb.Any `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + // Error id, which can be used to trace error + Id *string `protobuf:"bytes,5,opt,name=id,proto3,oneof" json:"id,omitempty"` } func (x *ErrWrap) Reset() { *x = ErrWrap{} - mi := &file_errorpb_errors_proto_msgTypes[4] + mi := &file_errorpb_errors_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -337,7 +270,7 @@ func (x *ErrWrap) String() string { func (*ErrWrap) ProtoMessage() {} func (x *ErrWrap) ProtoReflect() protoreflect.Message { - mi := &file_errorpb_errors_proto_msgTypes[4] + mi := &file_errorpb_errors_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -350,7 +283,7 @@ func (x *ErrWrap) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrWrap.ProtoReflect.Descriptor instead. func (*ErrWrap) Descriptor() ([]byte, []int) { - return file_errorpb_errors_proto_rawDescGZIP(), []int{4} + return file_errorpb_errors_proto_rawDescGZIP(), []int{3} } func (x *ErrWrap) GetTags() map[string]string { @@ -381,6 +314,13 @@ func (x *ErrWrap) GetError() *anypb.Any { return nil } +func (x *ErrWrap) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + var File_errorpb_errors_proto protoreflect.FileDescriptor var file_errorpb_errors_proto_rawDesc = []byte{ @@ -417,30 +357,25 @@ var file_errorpb_errors_proto_rawDesc = []byte{ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, - 0x5f, 0x69, 0x64, 0x22, 0x6c, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, 0x2d, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, - 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x75, 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5f, 0x69, 0x64, 0x22, 0xe9, 0x01, 0x0a, 0x07, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x12, + 0x2d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x45, 0x72, 0x72, 0x57, 0x72, 0x61, 0x70, 0x2e, 0x54, + 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x2a, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, + 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x75, + 0x62, 0x67, 0x6f, 0x2f, 0x66, 0x75, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, 0x62, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -455,24 +390,23 @@ func file_errorpb_errors_proto_rawDescGZIP() []byte { return file_errorpb_errors_proto_rawDescData } -var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_errorpb_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_errorpb_errors_proto_goTypes = []any{ (*Tag)(nil), // 0: errors.Tag (*ErrMsg)(nil), // 1: errors.ErrMsg (*ErrCode)(nil), // 2: errors.ErrCode - (*ErrTrace)(nil), // 3: errors.ErrTrace - (*ErrWrap)(nil), // 4: errors.ErrWrap - nil, // 5: errors.ErrMsg.TagsEntry - nil, // 6: errors.ErrWrap.TagsEntry - (Code)(0), // 7: errors.Code - (*anypb.Any)(nil), // 8: google.protobuf.Any + (*ErrWrap)(nil), // 3: errors.ErrWrap + nil, // 4: errors.ErrMsg.TagsEntry + nil, // 5: errors.ErrWrap.TagsEntry + (Code)(0), // 6: errors.Code + (*anypb.Any)(nil), // 7: google.protobuf.Any } var file_errorpb_errors_proto_depIdxs = []int32{ - 5, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry - 7, // 1: errors.ErrCode.status_code:type_name -> errors.Code - 8, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any - 6, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry - 8, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any + 4, // 0: errors.ErrMsg.tags:type_name -> errors.ErrMsg.TagsEntry + 6, // 1: errors.ErrCode.status_code:type_name -> errors.Code + 7, // 2: errors.ErrCode.details:type_name -> google.protobuf.Any + 5, // 3: errors.ErrWrap.tags:type_name -> errors.ErrWrap.TagsEntry + 7, // 4: errors.ErrWrap.error:type_name -> google.protobuf.Any 5, // [5:5] is the sub-list for method output_type 5, // [5:5] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name @@ -488,13 +422,14 @@ func file_errorpb_errors_proto_init() { file_errorpb_code_proto_init() file_errorpb_errors_proto_msgTypes[1].OneofWrappers = []any{} file_errorpb_errors_proto_msgTypes[2].OneofWrappers = []any{} + file_errorpb_errors_proto_msgTypes[3].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_errorpb_errors_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/errorpb/errors.proto b/proto/errorpb/errors.proto index df6d1f6..39a4f91 100644 --- a/proto/errorpb/errors.proto +++ b/proto/errorpb/errors.proto @@ -41,16 +41,18 @@ message ErrCode { optional string id = 6; } -message ErrTrace { - string id = 2; - string operation = 3; - string service = 4; - string version = 5; -} +//message ErrTrace { +// string id = 2; +// string operation = 3; +// string service = 4; +// string version = 5; +//} message ErrWrap { map tags = 1; string caller = 2; repeated string stacks = 3; google.protobuf.Any error = 4; + // Error id, which can be used to trace error + optional string id = 5; } diff --git a/proto/errorpb/options.pb.go b/proto/errorpb/options.pb.go index 9e0c1c2..53f2fd6 100644 --- a/proto/errorpb/options.pb.go +++ b/proto/errorpb/options.pb.go @@ -26,9 +26,13 @@ type Options struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Gen bool `protobuf:"varint,1,opt,name=gen,proto3" json:"gen,omitempty"` - DefaultCode Code `protobuf:"varint,2,opt,name=default_code,json=defaultCode,proto3,enum=errors.Code" json:"default_code,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // gen 是否生成 error code + Gen bool `protobuf:"varint,1,opt,name=gen,proto3" json:"gen,omitempty"` + // default_code 默认的 error code, 可能是 Internal + DefaultCode Code `protobuf:"varint,2,opt,name=default_code,json=defaultCode,proto3,enum=errors.Code" json:"default_code,omitempty"` + // name 是生成的 error code 的变量名前缀 + // 如果 name = Test, 那么 生成的 error code 变量名可能为 `TestErrCodeNotFound` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *Options) Reset() { diff --git a/proto/errorpb/options.proto b/proto/errorpb/options.proto index 595f5a4..d8d84f4 100644 --- a/proto/errorpb/options.proto +++ b/proto/errorpb/options.proto @@ -8,8 +8,14 @@ import "google/protobuf/descriptor.proto"; option go_package = "github.com/pubgo/funk/v2/proto/errorpb;errorpb"; message Options { + // gen 是否生成 error code bool gen = 1; + + // default_code 默认的 error code, 可能是 Internal Code default_code = 2; + + // name 是生成的 error code 的变量名前缀 + // 如果 name = Test, 那么 生成的 error code 变量名可能为 `TestErrCodeNotFound` string name = 3; } diff --git a/proto/testcodepb/test.errors.pb.go b/proto/testcodepb/test.errors.pb.go index 49ac2f7..025df67 100644 --- a/proto/testcodepb/test.errors.pb.go +++ b/proto/testcodepb/test.errors.pb.go @@ -7,7 +7,7 @@ package testcodepb import ( - errors "github.com/pubgo/funk/v2/errors" + errorcodes "github.com/pubgo/funk/v2/errors/errorcodes" errorpb "github.com/pubgo/funk/v2/proto/errorpb" grpc "google.golang.org/grpc" ) @@ -23,7 +23,7 @@ var TestErrCodeOK = &errorpb.ErrCode{ Name: "demo.test.v1.ok", StatusCode: errorpb.Code_OK, } -var _ = errors.RegisterErrCodes(TestErrCodeOK) +var _ = errorcodes.RegisterErrCodes(TestErrCodeOK) var TestErrCodeNotFound = &errorpb.ErrCode{ Code: int32(100000), @@ -31,7 +31,7 @@ var TestErrCodeNotFound = &errorpb.ErrCode{ Name: "demo.test.v1.not_found", StatusCode: errorpb.Code_NotFound, } -var _ = errors.RegisterErrCodes(TestErrCodeNotFound) +var _ = errorcodes.RegisterErrCodes(TestErrCodeNotFound) var TestErrCodeUnknown = &errorpb.ErrCode{ Code: int32(100001), @@ -39,7 +39,7 @@ var TestErrCodeUnknown = &errorpb.ErrCode{ Name: "demo.test.v1.unknown", StatusCode: errorpb.Code_NotFound, } -var _ = errors.RegisterErrCodes(TestErrCodeUnknown) +var _ = errorcodes.RegisterErrCodes(TestErrCodeUnknown) var TestErrCodeDbConn = &errorpb.ErrCode{ Code: int32(100003), @@ -47,7 +47,7 @@ var TestErrCodeDbConn = &errorpb.ErrCode{ Name: "demo.test.v1.db_conn", StatusCode: errorpb.Code_Internal, } -var _ = errors.RegisterErrCodes(TestErrCodeDbConn) +var _ = errorcodes.RegisterErrCodes(TestErrCodeDbConn) var TestErrCodeUnknownCode = &errorpb.ErrCode{ Code: int32(100004), @@ -55,7 +55,7 @@ var TestErrCodeUnknownCode = &errorpb.ErrCode{ Name: "demo.test.v1.unknown_code", StatusCode: errorpb.Code_Internal, } -var _ = errors.RegisterErrCodes(TestErrCodeUnknownCode) +var _ = errorcodes.RegisterErrCodes(TestErrCodeUnknownCode) var TestErrCodeCustomCode = &errorpb.ErrCode{ Code: int32(100005), @@ -63,4 +63,4 @@ var TestErrCodeCustomCode = &errorpb.ErrCode{ Name: "demo.custom.code", StatusCode: errorpb.Code_OK, } -var _ = errors.RegisterErrCodes(TestErrCodeCustomCode) +var _ = errorcodes.RegisterErrCodes(TestErrCodeCustomCode) From 43d3de91c5ee52aee5cbb4d30dee63bb97bfc1a5 Mon Sep 17 00:00:00 2001 From: barry Date: Wed, 29 Oct 2025 11:39:17 +0800 Subject: [PATCH 43/43] chore: quick update fix/version at 2025-10-29 21:10:38 --- cmds/envcmd/cmd.go | 2 +- config/config.go | 23 +++++++++++++++-------- result/api.go | 6 +++--- result/error.go | 2 +- result/future.go | 21 ++++++++++++--------- result/proxy.go | 16 ++++++++-------- result/result.go | 2 +- result/util.go | 6 +++--- 8 files changed, 44 insertions(+), 34 deletions(-) diff --git a/cmds/envcmd/cmd.go b/cmds/envcmd/cmd.go index 0c8cc40..7abc58b 100644 --- a/cmds/envcmd/cmd.go +++ b/cmds/envcmd/cmd.go @@ -22,7 +22,7 @@ func New() *cli.Command { env.Reload() fmt.Println("config path:", config.GetConfigPath()) - envs := config.LoadEnvConfigMap(config.GetConfigPath()) + envs := config.LoadEnvMap(config.GetConfigPath()) for name, cfg := range envs { envData := env.Get(name) if envData != "" { diff --git a/config/config.go b/config/config.go index de208ff..b8c1063 100644 --- a/config/config.go +++ b/config/config.go @@ -73,7 +73,7 @@ func GetConfigData(cfgPath string) (_ []byte, gErr error) { return configBytes, nil } -func LoadEnvConfigMap(cfgPath string) EnvSpecMap { return loadEnvConfigMap(cfgPath) } +func LoadEnvMap(cfgPath string) EnvSpecMap { return loadEnvConfigMap(cfgPath) } func loadEnvConfigMap(cfgPath string) EnvSpecMap { defer recovery.Exit(func(err error) error { @@ -103,19 +103,26 @@ func loadEnvConfigMap(cfgPath string) EnvSpecMap { envConfigBytes := result.Wrap(os.ReadFile(p)). Map(bytes.TrimSpace). Must(func(e *zerolog.Event) { - e.Str(logfields.Msg, fmt.Sprintf("failed to handler env config data, path=%s", p)) + e.Str("env_path", p) + e.Str(logfields.Msg, "failed to handler env config data") }) if len(envConfigBytes) == 0 { continue } envConfigBytes = cfgFormat(envConfigBytes, &config{workDir: filepath.Dir(cfgPath)}) - envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)).Must(func(e *zerolog.Event) { - e.Str(logfields.Msg, fmt.Sprintf("failed to handler config env data: %s", envConfigBytes)) - }) - result.Must(yaml.Unmarshal(envConfigBytes, &envSpecMap), func(e *zerolog.Event) { - e.Str(logfields.Msg, fmt.Sprintf("failed to unmarshal env config, data=%s path=%s", envConfigBytes, p)) - }) + envConfigBytes = result.Wrap(envsubst.Bytes(envConfigBytes)). + Must(func(e *zerolog.Event) { + e.Str("env_path", p) + e.Str("env_data", string(envConfigBytes)) + e.Str(logfields.Msg, "failed to handler config env") + }) + result.ErrOf(yaml.Unmarshal(envConfigBytes, &envSpecMap)). + Must(func(e *zerolog.Event) { + e.Str("env_data", string(envConfigBytes)) + e.Str("env_path", p) + e.Str(logfields.Msg, "failed to unmarshal env config") + }) } } initEnv(envSpecMap) diff --git a/result/api.go b/result/api.go index 30af043..9a726eb 100644 --- a/result/api.go +++ b/result/api.go @@ -57,12 +57,12 @@ func Errorf(msg string, args ...any) Error { return newError(errors.WrapCaller(fmt.Errorf(msg, args...), 1)) } -func ErrProxyOf(err *error) ErrProxy { +func ErrProxyOf(err *error) ProxyErr { if err == nil { errNilOrPanic(errors.Errorf("err param is nil")) - return ErrProxy{} + return ProxyErr{} } - return ErrProxy{err: err} + return ProxyErr{err: err} } func ErrOf(err error) Error { diff --git a/result/error.go b/result/error.go index f961ebd..b82e59c 100644 --- a/result/error.go +++ b/result/error.go @@ -115,7 +115,7 @@ func (e Error) Expect(format string, args ...any) { func (e Error) String() string { if e.IsOK() { - return "Ok" + return "OK" } return fmt.Sprintf("Error(%v)", e.err) diff --git a/result/future.go b/result/future.go index fa173e1..71bb2e1 100644 --- a/result/future.go +++ b/result/future.go @@ -8,13 +8,16 @@ import ( "github.com/pubgo/funk/v2/errors" ) -func AsyncErr(fn func() Error) *ErrFuture { +func AsyncErr(fn func() Error) *FutureErr { if fn == nil { - return &ErrFuture{e: errors.WrapCaller(errFnIsNil, 1)} + return &FutureErr{e: errors.WrapCaller(errFnIsNil, 1)} } future := newErrFuture() - go func() { defer future.close(); future.setErr(try(func() error { return fn().getErr() })) }() + go func() { + defer future.close() + future.setErr(try(func() error { return fn().getErr() })) + }() return future } @@ -53,19 +56,19 @@ func (f *Future[T]) Await(ctxL ...context.Context) Result[T] { } } -func newErrFuture() *ErrFuture { - return &ErrFuture{done: make(chan struct{})} +func newErrFuture() *FutureErr { + return &FutureErr{done: make(chan struct{})} } -type ErrFuture struct { +type FutureErr struct { e error done chan struct{} } -func (f *ErrFuture) close() { close(f.done) } -func (f *ErrFuture) setErr(err error) { f.e = err } +func (f *FutureErr) close() { close(f.done) } +func (f *FutureErr) setErr(err error) { f.e = err } -func (f *ErrFuture) Await(ctxL ...context.Context) Error { +func (f *FutureErr) Await(ctxL ...context.Context) Error { ctx := lo.FirstOr(ctxL, context.Background()) select { case <-f.done: diff --git a/result/proxy.go b/result/proxy.go index 970f6a2..3c1bb9e 100644 --- a/result/proxy.go +++ b/result/proxy.go @@ -6,31 +6,31 @@ import ( "github.com/samber/lo" ) -var _ ErrSetter = new(ErrProxy) +var _ ErrSetter = new(ProxyErr) -type ErrProxy struct { +type ProxyErr struct { err *error } -func (e ErrProxy) IsOK() bool { +func (e ProxyErr) IsOK() bool { return lo.FromPtr(e.err) == nil } -func (e ErrProxy) IsErr() bool { +func (e ProxyErr) IsErr() bool { return lo.FromPtr(e.err) != nil } -func (e ErrProxy) GetErr() error { +func (e ProxyErr) GetErr() error { return lo.FromPtr(e.err) } -func (e ErrProxy) String() string { +func (e ProxyErr) String() string { if e.IsOK() { - return "Ok" + return "OK" } return fmt.Sprintf("Error(%v)", lo.FromPtr(e.err)) } -func (e ErrProxy) setErrorInner() { +func (e ProxyErr) setErrorInner() { } diff --git a/result/result.go b/result/result.go index 711a7b9..c6c52fc 100644 --- a/result/result.go +++ b/result/result.go @@ -177,7 +177,7 @@ func (r Result[T]) GetErr() error { func (r Result[T]) String() string { if r.IsOK() { - return fmt.Sprintf("Ok(%v)", r.getValue()) + return fmt.Sprintf("OK(%v)", r.getValue()) } return fmt.Sprintf("Error(%v)", r.getErr()) } diff --git a/result/util.go b/result/util.go index 6b081bb..2543851 100644 --- a/result/util.go +++ b/result/util.go @@ -234,9 +234,9 @@ func setError(setter ErrSetter, err error) { switch errSet := setter.(type) { case *Error: errSet.err = err - case *ErrProxy: + case *ProxyErr: *errSet.err = err - case ErrProxy: + case ProxyErr: *errSet.err = err default: rv := reflect.ValueOf(setter) @@ -269,7 +269,7 @@ func logErr(ctx context.Context, skip int, err error, events ...func(e *zerolog. log.Error(ctx). Func(func(e *zerolog.Event) { - e.Str(logfields.Module, "result2") + e.Str(logfields.Module, "result") e.Strs(logfields.ErrorStack, lo.Map(traces, func(item *stack.Frame, index int) string { return item.String() })) e.Str(logfields.ErrorID, errors.GetErrorId(err)) e.Str(logfields.ErrorDetail, fmt.Sprintf("%v", err))