diff --git a/etcd/client/client.go b/etcd/client/client.go index fd96401..4e8a44e 100644 --- a/etcd/client/client.go +++ b/etcd/client/client.go @@ -1,8 +1,7 @@ -package client +package etcdclient import ( clientv3 "go.etcd.io/etcd/client/v3" - "go.uber.org/zap" "text/template" "time" ) @@ -13,7 +12,6 @@ type ReaderOptions struct { Prefix string PathFormat string Timeout time.Duration - LoggerConfig *zap.Config ConfigParser ConfigParser MyConfig Config } @@ -35,8 +33,8 @@ func NewReader(opts ReaderOptions) (*EtcdReader, error) { opts.PathFormat = EtcdClientDefaultPath } etcdClient, err := clientv3.New(clientv3.Config{ - Endpoints: opts.Node, - LogConfig: opts.LoggerConfig, + Endpoints: opts.Node, + DialTimeout: opts.Timeout, }) if err != nil { return nil, err diff --git a/etcd/client/decoder.go b/etcd/client/decoder.go index 48dded5..ab1177c 100644 --- a/etcd/client/decoder.go +++ b/etcd/client/decoder.go @@ -1,20 +1,20 @@ -package client +package etcdclient import ( "encoding/json" "fmt" - "time" + "strings" ) type ConfigParser interface { - Decode(data []byte, config EtcdConfig) error + Decode(data []byte, config *EtcdConfig) error } type defaultParser struct { } -func (p *defaultParser) Decode(data []byte, config EtcdConfig) error { - return json.Unmarshal(data, &config) +func (p *defaultParser) Decode(data []byte, config *EtcdConfig) error { + return json.Unmarshal(data, config) } type Config interface { @@ -23,7 +23,7 @@ type Config interface { type EtcdConfig struct { ClientBasicInfo *EndpointBasicInfo `mapstructure:"ClientBasicInfo"` - HostPorts *string `mapstructure:"HostPorts"` + HostPorts []string `mapstructure:"HostPorts"` DestService *string `mapstructure:"DestService"` Protocol *string `mapstructure:"Protocol"` Connection *Connection `mapstructure:"Connection"` @@ -31,17 +31,33 @@ type EtcdConfig struct { } func (c *EtcdConfig) String() string { - baseInfo := "nil" + var builder strings.Builder + + if c.ClientBasicInfo != nil { + builder.WriteString(fmt.Sprintf("ClientBasicInfo: %v\n", *c.ClientBasicInfo)) + } + + if c.HostPorts != nil { + builder.WriteString(fmt.Sprintf("HostPorts: %v\n", c.HostPorts)) + } + + if c.DestService != nil { + builder.WriteString(fmt.Sprintf("DestService: %v\n", *c.DestService)) + } + + if c.Protocol != nil { + builder.WriteString(fmt.Sprintf("Protocol: %v\n", *c.Protocol)) + } + + if c.Connection != nil { + builder.WriteString(fmt.Sprintf("Connection: %v\n", *c.Connection)) + } + if c.MyConfig != nil { - baseInfo = c.MyConfig.String() + builder.WriteString(c.MyConfig.String()) } - return fmt.Sprintf("ClientBasicInfo: %v\n"+ - " HostPorts: %s\n"+ - " DestService: %s\n"+ - " Protocol: %s\n"+ - " Connection: %v\n"+ - " MyConfig: %s\n", - *c.ClientBasicInfo, *c.HostPorts, *c.DestService, *c.Protocol, *c.Connection, baseInfo) + + return builder.String() } type EndpointBasicInfo struct { @@ -51,13 +67,13 @@ type EndpointBasicInfo struct { } type IdleConfig struct { - MinIdlePerAddress int `mapstructure:"MinIdlePerAddress"` - MaxIdlePerAddress int `mapstructure:"MaxIdlePerAddress"` - MaxIdleGlobal int `mapstructure:"MaxIdleGlobal"` - MaxIdleTimeout time.Duration `mapstructure:"MaxIdleTimeout"` + MinIdlePerAddress int `mapstructure:"MinIdlePerAddress"` + MaxIdlePerAddress int `mapstructure:"MaxIdlePerAddress"` + MaxIdleGlobal int `mapstructure:"MaxIdleGlobal"` + MaxIdleTimeout string `mapstructure:"MaxIdleTimeout"` } type MuxConnection struct { - ConnNum int `json:"connNum"` + ConnNum int `mapstructure:"ConnNum"` } type Connection struct { diff --git a/etcd/client/loader.go b/etcd/client/loader.go index cca7c2d..0c1bff8 100644 --- a/etcd/client/loader.go +++ b/etcd/client/loader.go @@ -1,4 +1,4 @@ -package client +package etcdclient import ( kitexclient "github.com/cloudwego/kitex/client" @@ -22,6 +22,11 @@ type EtcdLoader struct { } func (l *EtcdLoader) Load() error { + path := Path{ClientServiceName: l.ClientServiceName, ServerServiceName: l.ServerServiceName} + err := l.reader.ReadToConfig(&path) + if err != nil { + return err + } config, err := l.reader.GetConfig() if err != nil { return err diff --git a/etcd/client/reader.go b/etcd/client/reader.go index 23242f6..0d2ac78 100644 --- a/etcd/client/reader.go +++ b/etcd/client/reader.go @@ -1,4 +1,4 @@ -package client +package etcdclient import ( "bytes" @@ -13,7 +13,7 @@ const ( EtcdDefaultNode = "http://127.0.0.1:2379" EtcdDefaultConfigPrefix = "/KitexConfig" EtcdDefaultTimeout = 5 * time.Second - EtcdClientDefaultPath = "{{.ClientServiceName}}/{{.ServerServiceName}}" + EtcdClientDefaultPath = "/{{.ClientServiceName}}/{{.ServerServiceName}}" ) type Reader interface { @@ -55,7 +55,7 @@ func (r *EtcdReader) ReadToConfig(p *Path) error { klog.Debugf("[etcd] key: %s config get value failed", key) return err } - err = r.parser.Decode(data.Kvs[0].Value, *r.config) + err = r.parser.Decode(data.Kvs[0].Value, r.config) if err != nil { return err } diff --git a/etcd/client/suite.go b/etcd/client/suite.go index 5032613..8c6f08c 100644 --- a/etcd/client/suite.go +++ b/etcd/client/suite.go @@ -1,4 +1,4 @@ -package client +package etcdclient import ( "github.com/cloudwego/kitex/client" diff --git a/etcd/client/translator.go b/etcd/client/translator.go index e63b1f3..4c017ea 100644 --- a/etcd/client/translator.go +++ b/etcd/client/translator.go @@ -1,13 +1,12 @@ -package client +package etcdclient import ( "fmt" + "github.com/Printemps417/optionloader/utils" kitexclient "github.com/cloudwego/kitex/client" "github.com/cloudwego/kitex/pkg/connpool" "github.com/cloudwego/kitex/pkg/rpcinfo" "github.com/cloudwego/kitex/transport" - "strconv" - "strings" ) // Protocol indicates the transport protocol. @@ -38,6 +37,9 @@ var protocolMap = map[string]Protocol{ func basicInfoTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { c := config.ClientBasicInfo + if c == nil { + return nil, nil + } var res []kitexclient.Option rpcInfo := rpcinfo.EndpointBasicInfo{ ServiceName: c.ServiceName, @@ -49,6 +51,9 @@ func basicInfoTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { } func protocolTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { c := config.Protocol + if c == nil { + return nil, nil + } var res []kitexclient.Option protocol, ok := protocolMap[*c] if !ok { @@ -60,6 +65,9 @@ func protocolTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { } func destServiceTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { c := config.DestService + if c == nil { + return nil, nil + } var res []kitexclient.Option res = append(res, kitexclient.WithDestService(*c)) return res, nil @@ -67,33 +75,33 @@ func destServiceTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { func hostPortsTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { c := config.HostPorts - var res []kitexclient.Option - - ports := strings.Split(*c, ",") - for _, port := range ports { - hostPort := strings.Split(port, ":") - portNum, err := strconv.Atoi(hostPort[len(hostPort)-1]) - if err != nil || portNum < 1 || portNum > 65535 { - return nil, fmt.Errorf("invalid port number: %s", port) - } + if c == nil { + return nil, nil } - - res = append(res, kitexclient.WithHostPorts(*c)) + var res []kitexclient.Option + res = append(res, kitexclient.WithHostPorts(c...)) return res, nil } func connectionTranslator(config *EtcdConfig) ([]kitexclient.Option, error) { c := config.Connection + if c == nil { + return nil, nil + } var res []kitexclient.Option switch c.Method { case "ShortConnection": res = append(res, kitexclient.WithShortConnection()) case "LongConnection": + MaxIdleTimeout, err := utils.ParseDuration(c.LongConnection.MaxIdleTimeout) + if err != nil { + return nil, err + } idleConfig := connpool.IdleConfig{ MinIdlePerAddress: c.LongConnection.MinIdlePerAddress, MaxIdlePerAddress: c.LongConnection.MaxIdlePerAddress, MaxIdleGlobal: c.LongConnection.MaxIdleGlobal, - MaxIdleTimeout: c.LongConnection.MaxIdleTimeout, + MaxIdleTimeout: MaxIdleTimeout, } res = append(res, kitexclient.WithLongConnection(idleConfig)) case "MuxConnection": diff --git a/etcd/server/decoder.go b/etcd/server/decoder.go index 6a35aa7..1077a8d 100644 --- a/etcd/server/decoder.go +++ b/etcd/server/decoder.go @@ -1,4 +1,4 @@ -package server +package etcdserver import ( "encoding/json" @@ -6,14 +6,14 @@ import ( ) type ConfigParser interface { - Decode(data []byte, config EtcdConfig) error + Decode(data []byte, config *EtcdConfig) error } type defaultParser struct { } -func (p *defaultParser) Decode(data []byte, config EtcdConfig) error { - return json.Unmarshal(data, &config) +func (p *defaultParser) Decode(data []byte, config *EtcdConfig) error { + return json.Unmarshal(data, config) } type Config interface { diff --git a/etcd/server/loader.go b/etcd/server/loader.go index 34c6039..e39965c 100644 --- a/etcd/server/loader.go +++ b/etcd/server/loader.go @@ -1,4 +1,4 @@ -package server +package etcdserver import ( "github.com/cloudwego/kitex/pkg/klog" @@ -21,6 +21,11 @@ type EtcdLoader struct { } func (l *EtcdLoader) Load() error { + path := Path{ServerServiceName: l.ServerServiceName} + err := l.reader.ReadToConfig(&path) + if err != nil { + return err + } config, err := l.reader.GetConfig() if err != nil { return err diff --git a/etcd/server/reader.go b/etcd/server/reader.go index 2473328..938f80e 100644 --- a/etcd/server/reader.go +++ b/etcd/server/reader.go @@ -1,4 +1,4 @@ -package server +package etcdserver import ( "bytes" @@ -13,7 +13,7 @@ const ( EtcdDefaultNode = "http://127.0.0.1:2379" EtcdDefaultConfigPrefix = "/KitexConfig" EtcdDefaultTimeout = 5 * time.Second - EtcdServerDefaultPath = "{{.ServerServiceName}}" + EtcdServerDefaultPath = "/{{.ServerServiceName}}" ) type Reader interface { @@ -33,7 +33,6 @@ type EtcdReader struct { } type Path struct { - ClientServiceName string ServerServiceName string } @@ -55,7 +54,7 @@ func (r *EtcdReader) ReadToConfig(p *Path) error { klog.Debugf("[etcd] key: %s config get value failed", key) return err } - err = r.parser.Decode(data.Kvs[0].Value, *r.config) + err = r.parser.Decode(data.Kvs[0].Value, r.config) if err != nil { return err } diff --git a/etcd/server/server.go b/etcd/server/server.go index 2dbec16..dbe9778 100644 --- a/etcd/server/server.go +++ b/etcd/server/server.go @@ -1,8 +1,7 @@ -package server +package etcdserver import ( clientv3 "go.etcd.io/etcd/client/v3" - "go.uber.org/zap" "text/template" "time" ) @@ -13,7 +12,6 @@ type ReaderOptions struct { Prefix string PathFormat string Timeout time.Duration - LoggerConfig *zap.Config ConfigParser ConfigParser MyConfig Config } @@ -35,8 +33,8 @@ func NewReader(opts ReaderOptions) (*EtcdReader, error) { opts.PathFormat = EtcdServerDefaultPath } etcdClient, err := clientv3.New(clientv3.Config{ - Endpoints: opts.Node, - LogConfig: opts.LoggerConfig, + Endpoints: opts.Node, + DialTimeout: opts.Timeout, }) if err != nil { return nil, err diff --git a/etcd/server/suite.go b/etcd/server/suite.go index 07eccce..1fff53b 100644 --- a/etcd/server/suite.go +++ b/etcd/server/suite.go @@ -1,4 +1,4 @@ -package server +package etcdserver import ( "github.com/cloudwego/kitex/server" diff --git a/etcd/server/translator.go b/etcd/server/translator.go index 441b742..c5503ce 100644 --- a/etcd/server/translator.go +++ b/etcd/server/translator.go @@ -1,4 +1,4 @@ -package server +package etcdserver import ( "errors" @@ -9,6 +9,9 @@ import ( func basicInfoTranslator(config *EtcdConfig) ([]kitexserver.Option, error) { c := config.ServerBasicInfo + if c == nil { + return nil, nil + } var res []kitexserver.Option rpcInfo := rpcinfo.EndpointBasicInfo{ ServiceName: c.ServiceName, @@ -20,6 +23,9 @@ func basicInfoTranslator(config *EtcdConfig) ([]kitexserver.Option, error) { } func serviceAddrTranslator(config *EtcdConfig) ([]kitexserver.Option, error) { c := config.ServiceAddr + if c == nil { + return nil, nil + } var res []kitexserver.Option for _, addr := range c { network := addr.Network @@ -47,6 +53,9 @@ func serviceAddrTranslator(config *EtcdConfig) ([]kitexserver.Option, error) { } func muxTransportTranslator(config *EtcdConfig) ([]kitexserver.Option, error) { c := config.MuxTransport + if c == nil { + return nil, nil + } var res []kitexserver.Option if *c { res = append(res, kitexserver.WithMuxTransport()) diff --git a/examples/etcd/client/main.go b/examples/etcd/client/main.go index 336dfc9..dccc2ab 100644 --- a/examples/etcd/client/main.go +++ b/examples/etcd/client/main.go @@ -1,42 +1,45 @@ package main import ( - "context" "encoding/json" "fmt" etcdClient "github.com/Printemps417/optionloader/etcd/client" "github.com/Printemps417/optionloader/utils" - "github.com/cloudwego/kitex-examples/kitex_gen/api" - "github.com/cloudwego/kitex-examples/kitex_gen/api/echo" kitexclient "github.com/cloudwego/kitex/client" - "github.com/cloudwego/kitex/pkg/klog" "log" - "time" ) const ( - serverServiceName = "serverServiceName" - clientServiceName = "clientServiceName" + serverServiceName = "echo_server_service" + clientServiceName = "echo_client_service" ) // 用户可以自定义读取数据的类型,要求通过Decode返回一个字节流 type myConfigParser struct { } -func (p *myConfigParser) Decode(data []byte, config etcdClient.EtcdConfig) error { - return json.Unmarshal(data, &config) +func (p *myConfigParser) Decode(data []byte, config *etcdClient.EtcdConfig) error { + return json.Unmarshal(data, config) } // 用户可以自定义新增Config文件结构,并且默认的的Config文件结构仍然存在 type myConfig struct { - configOne *string `mapstructure:"configOne"` - configTwo *string `mapstructure:"configTwo"` + ConfigOne *string `mapstructure:"configOne"` + ConfigTwo []string `mapstructure:"configTwo"` } func (r *myConfig) String() string { - return fmt.Sprintf( - "configOne: %s\n"+ - "configTwo: %s\n", *r.configOne, *r.configTwo) + var output string + + if r.ConfigOne != nil { + output += fmt.Sprintf("ConfigOne: %s\n", *r.ConfigOne) + } + + if r.ConfigTwo != nil { + output += fmt.Sprintf("ConfigTwo: %v\n", r.ConfigTwo) + } + + return output } // 用户可自定义Translator,用于将myConfig解析成Options @@ -44,8 +47,8 @@ func myTranslator(config *etcdClient.EtcdConfig) ([]kitexclient.Option, error) { c := config.MyConfig opts := []kitexclient.Option{} //具体处理逻辑 - _ = c _ = opts + fmt.Println("myConfigTranslator run! myConfig:" + c.String()) return opts, nil } @@ -72,21 +75,24 @@ func main() { log.Fatal(err) return } - client, err := echo.NewClient( - serverServiceName, - kitexclient.WithSuite(loader.GetSuite()), - ) - if err != nil { - log.Fatal(err) - } - for { - req := &api.Request{Message: "my request"} - resp, err := client.Echo(context.Background(), req) - if err != nil { - klog.Errorf("take request error: %v", err) - } else { - klog.Infof("receive response %v", resp) - } - time.Sleep(time.Second * 10) - } + fmt.Println("Options: ", loader.GetSuite().Options()) + config, _ := reader.GetConfig() + fmt.Print("Config:", config.String()) + //client, err := echo.NewClient( + // serverServiceName, + // kitexclient.WithSuite(loader.GetSuite()), + //) + //if err != nil { + // log.Fatal(err) + //} + //for { + // req := &api.Request{Message: "my request"} + // resp, err := client.Echo(context.Background(), req) + // if err != nil { + // klog.Errorf("take request error: %v", err) + // } else { + // klog.Infof("receive response %v", resp) + // } + // time.Sleep(time.Second * 10) + //} } diff --git a/examples/etcd/default.etcd/member/snap/db b/examples/etcd/default.etcd/member/snap/db new file mode 100644 index 0000000..2bf12ab Binary files /dev/null and b/examples/etcd/default.etcd/member/snap/db differ diff --git a/examples/etcd/default.etcd/member/wal/0000000000000000-0000000000000000.wal b/examples/etcd/default.etcd/member/wal/0000000000000000-0000000000000000.wal new file mode 100644 index 0000000..8285c33 Binary files /dev/null and b/examples/etcd/default.etcd/member/wal/0000000000000000-0000000000000000.wal differ diff --git a/examples/etcd/server/main.go b/examples/etcd/server/main.go index 4f62405..ee62d49 100644 --- a/examples/etcd/server/main.go +++ b/examples/etcd/server/main.go @@ -1,51 +1,44 @@ -package server +package main import ( - "context" "encoding/json" "fmt" etcdServer "github.com/Printemps417/optionloader/etcd/server" "github.com/Printemps417/optionloader/utils" - "github.com/cloudwego/kitex-examples/kitex_gen/api" - "github.com/cloudwego/kitex-examples/kitex_gen/api/echo" - "github.com/cloudwego/kitex/pkg/klog" kitexserver "github.com/cloudwego/kitex/server" "log" ) const ( - serverServiceName = "serverServiceName" + serverServiceName = "echo_server_service" ) -var _ api.Echo = &EchoImpl{} - -// EchoImpl implements the last service interface defined in the IDL. -type EchoImpl struct{} - -// Echo implements the Echo interface. -func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) { - klog.Info("echo called") - return &api.Response{Message: req.Message}, nil -} - // 用户可以自定义读取数据的类型,要求通过Decode返回一个字节流 type myConfigParser struct { } -func (p *myConfigParser) Decode(data []byte, config etcdServer.EtcdConfig) error { - return json.Unmarshal(data, &config) +func (p *myConfigParser) Decode(data []byte, config *etcdServer.EtcdConfig) error { + return json.Unmarshal(data, config) } // 用户可以自定义新增Config文件结构,并且默认的的Config文件结构仍然存在 type myConfig struct { - configOne *string `mapstructure:"configOne"` - configTwo *string `mapstructure:"configTwo"` + ConfigOne *string `mapstructure:"configOne"` + ConfigTwo []string `mapstructure:"configTwo"` } func (r *myConfig) String() string { - return fmt.Sprintf( - "configOne: %s\n"+ - "configTwo: %s\n", *r.configOne, *r.configTwo) + var output string + + if r.ConfigOne != nil { + output += fmt.Sprintf("ConfigOne: %s\n", *r.ConfigOne) + } + + if r.ConfigTwo != nil { + output += fmt.Sprintf("ConfigTwo: %v\n", r.ConfigTwo) + } + + return output } // 用户可自定义Translator,用于将myConfig解析成Options @@ -53,8 +46,8 @@ func myTranslator(config *etcdServer.EtcdConfig) ([]kitexserver.Option, error) { c := config.MyConfig var opts []kitexserver.Option //具体处理逻辑 - _ = c _ = opts + fmt.Println("myConfigTranslator run! myConfig:" + c.String()) return opts, nil } @@ -81,13 +74,16 @@ func main() { log.Fatal(err) return } - server := echo.NewServer( - new(EchoImpl), - kitexserver.WithSuite(loader.GetSuite()), - ) - if err := server.Run(); err != nil { - log.Println("server stopped with error:", err) - } else { - log.Println("server stopped") - } + fmt.Println("Options: ", loader.GetSuite().Options()) + config, _ := reader.GetConfig() + fmt.Print("Config:", config.String()) + // server := echo.NewServer( + // new(EchoImpl), + // kitexserver.WithSuite(loader.GetSuite()), + // ) + // if err := server.Run(); err != nil { + // log.Println("server stopped with error:", err) + // } else { + // log.Println("server stopped") + // } } diff --git a/go.mod b/go.mod index 65e64a7..9e20c77 100644 --- a/go.mod +++ b/go.mod @@ -1,28 +1,28 @@ module github.com/Printemps417/optionloader -go 1.21.6 +go 1.22.1 require ( - github.com/cloudwego/kitex v0.9.1 - github.com/cloudwego/kitex-examples v0.3.3 + github.com/cloudwego/kitex v0.10.0 go.etcd.io/etcd/client/v3 v3.5.14 go.uber.org/zap v1.27.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/apache/thrift v0.20.0 // indirect - github.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b // indirect - github.com/bytedance/sonic v1.11.2 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect - github.com/chenzhuoyu/iasm v0.9.1 // indirect - github.com/choleraehyq/pid v0.0.18 // indirect - github.com/cloudwego/configmanager v0.2.0 // indirect - github.com/cloudwego/dynamicgo v0.2.0 // indirect + github.com/apache/thrift v0.13.0 // indirect + github.com/bytedance/gopkg v0.0.0-20240514070511-01b2cbcf35e1 // indirect + github.com/bytedance/sonic v1.11.8 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/configmanager v0.2.2 // indirect + github.com/cloudwego/dynamicgo v0.2.8 // indirect github.com/cloudwego/fastpb v0.0.4 // indirect - github.com/cloudwego/frugal v0.1.14 // indirect + github.com/cloudwego/frugal v0.1.15 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/cloudwego/localsession v0.0.2 // indirect - github.com/cloudwego/netpoll v0.6.0 // indirect + github.com/cloudwego/netpoll v0.6.1 // indirect + github.com/cloudwego/runtimex v0.1.0 // indirect github.com/cloudwego/thriftgo v0.3.6 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect @@ -30,32 +30,32 @@ require ( github.com/fatih/structtag v1.2.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a // indirect + github.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/jhump/protoreflect v1.8.2 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/oleiade/lane v1.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/testify v1.8.4 // indirect - github.com/tidwall/gjson v1.14.4 // indirect + github.com/tidwall/gjson v1.9.3 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect go.etcd.io/etcd/api/v3 v3.5.14 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect - go.uber.org/multierr v1.11.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/arch v0.2.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 4e0b2e0..f354730 100644 --- a/go.sum +++ b/go.sum @@ -8,76 +8,47 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= -github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/brianvoe/gofakeit/v6 v6.16.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= -github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= -github.com/bytedance/gopkg v0.0.0-20220509134931-d1878f638986/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= -github.com/bytedance/gopkg v0.0.0-20220531084716-665b4f21126f/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= -github.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ= -github.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b h1:R6PWoQtxEMpWJPHnpci+9LgFxCS7iJCfOGBvCgZeTKI= github.com/bytedance/gopkg v0.0.0-20230728082804-614d0af6619b/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ= -github.com/bytedance/mockey v1.2.0/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4= +github.com/bytedance/gopkg v0.0.0-20240507064146-197ded923ae3/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ= +github.com/bytedance/gopkg v0.0.0-20240514070511-01b2cbcf35e1 h1:rT7Mm6uUpHeZQzfs2v0Mlj0SL02CzyVi+EB7VYPM/z4= +github.com/bytedance/gopkg v0.0.0-20240514070511-01b2cbcf35e1/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ= github.com/bytedance/mockey v1.2.7 h1:8j4yCqS5OmMe2dQCxPit4FVkwTK9nrykIgbOZN3s28o= github.com/bytedance/mockey v1.2.7/go.mod h1:bNrUnI1u7+pAc0TYDgPATM+wF2yzHxmNH+iDXg4AOCU= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.8/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A= -github.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic v1.11.8 h1:Zw/j1KfiS+OYTi9lyB3bb0CFxPJVkM17k1wyDG32LRA= +github.com/bytedance/sonic v1.11.8/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.0.0-20220818063314-28c361dae733/go.mod h1:wOQ0nsbeOLa2awv8bUYFW/EHXbjQMlZ10fAlXDB2sz8= -github.com/chenzhuoyu/iasm v0.0.0-20230222070914-0b1b64b0e762/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= -github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/choleraehyq/pid v0.0.13/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U= -github.com/choleraehyq/pid v0.0.15/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U= -github.com/choleraehyq/pid v0.0.16/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U= -github.com/choleraehyq/pid v0.0.18 h1:O7LLxPoOyt3YtonlCC8BmNrF9P6Hc8B509UOqlPSVhw= -github.com/choleraehyq/pid v0.0.18/go.mod h1:uhzeFgxJZWQsZulelVQZwdASxQ9TIPZYL4TPkQMtL/U= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudwego/configmanager v0.2.0 h1:niVpVg+wQ+npNqnH3dup96SMbR02Pk+tNErubYCJqKo= -github.com/cloudwego/configmanager v0.2.0/go.mod h1:FLIQTjxsZRGjnmDhTttWQTy6f6DghPTatfBVOs2gQLk= -github.com/cloudwego/dynamicgo v0.1.0/go.mod h1:Mdsz0XGsIImi15vxhZaHZpspNChEmBMIiWkUfD6JDKg= -github.com/cloudwego/dynamicgo v0.2.0 h1:2mIqwYjS4TvjIov+dV5/y4OO33x/YMdfaeiRgXiineg= -github.com/cloudwego/dynamicgo v0.2.0/go.mod h1:zTbRLRyBdP+OLalvkiwWPnvg84v1UungzT7iuL/2Qgc= -github.com/cloudwego/fastpb v0.0.3/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/configmanager v0.2.2 h1:sVrJB8gWYTlPV2OS3wcgJSO9F2/9Zbkmcm1Z7jempOU= +github.com/cloudwego/configmanager v0.2.2/go.mod h1:ppiyU+5TPLonE8qMVi/pFQk2eL3Q4P7d4hbiNJn6jwI= +github.com/cloudwego/dynamicgo v0.2.8 h1:rCkVEZzXpdnM1dlunu6mMz5pDtZfBQFv9/FAk1hOoOE= +github.com/cloudwego/dynamicgo v0.2.8/go.mod h1:F3jlbPmlNzhcuDMXwZoBJ7rJKpg2iE+TnIy9pSJiGzs= github.com/cloudwego/fastpb v0.0.4 h1:/ROVVfoFtpfc+1pkQLzGs+azjxUbSOsAqSY4tAAx4mg= github.com/cloudwego/fastpb v0.0.4/go.mod h1:/V13XFTq2TUkxj2qWReV8MwfPC4NnPcy6FsrojnsSG0= -github.com/cloudwego/frugal v0.1.3/go.mod h1:b981ViPYdhI56aFYsoMjl9kv6yeqYSO+iEz2jrhkCgI= -github.com/cloudwego/frugal v0.1.6/go.mod h1:9ElktKsh5qd2zDBQ5ENhPSQV7F2dZ/mXlr1eaZGDBFs= -github.com/cloudwego/frugal v0.1.14 h1:vkjQMb5OsPL779RfMdLI4YJZsOH8fR0ewJpTuAVSeiQ= -github.com/cloudwego/frugal v0.1.14/go.mod h1:zFBA63ne4+Tz4qayRZFZf+ZVwGqTzb+1Xe3ZDCq+Wfc= -github.com/cloudwego/kitex v0.3.2/go.mod h1:/XD07VpUD9VQWmmoepASgZ6iw//vgWikVA9MpzLC5i0= -github.com/cloudwego/kitex v0.4.4/go.mod h1:3FcH5h9Qw+dhRljSzuGSpWuThttA8DvK0BsL7HUYydo= -github.com/cloudwego/kitex v0.6.1/go.mod h1:zI1GBrjT0qloTikcCfQTgxg3Ws+yQMyaChEEOcGNUvA= -github.com/cloudwego/kitex v0.9.1 h1:4Rkmngk4b5nHQ6sPM9BNgnW5cb9niB7hzzQBkkfa8/s= -github.com/cloudwego/kitex v0.9.1/go.mod h1:CBMfRKBuZ9EeSEfeoveC7cR6JG4lY1Bpo+d0Eb7zUDA= -github.com/cloudwego/kitex-examples v0.3.3 h1:VkAHDmmWTY/3TY52yF9T8F/CKBT1wmssB2hnanqlWjM= -github.com/cloudwego/kitex-examples v0.3.3/go.mod h1:bh79UiY/QiYL7MvmqAp7RVmNsIKmn66WpbOG47Jxwo8= +github.com/cloudwego/frugal v0.1.15 h1:LC55UJKhQPMFVjDPbE+LJcF7etZjSx6uokG1tk0wPK0= +github.com/cloudwego/frugal v0.1.15/go.mod h1:26kU1r18vA8vRg12c66XPDlfv1GQHDbE1RpusipXfcI= +github.com/cloudwego/iasm v0.0.9/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/kitex v0.10.0 h1:FDQHv5dH3lUqxC9G526/CyI1ODYzV8bSsqUxK1uzbxI= +github.com/cloudwego/kitex v0.10.0/go.mod h1:7fMLSJwWcwkZD3YB4tCIi9itUH/LsmVD13vUV/Tl0V4= github.com/cloudwego/localsession v0.0.2 h1:N9/IDtCPj1fCL9bCTP+DbXx3f40YjVYWcwkJG0YhQkY= github.com/cloudwego/localsession v0.0.2/go.mod h1:kiJxmvAcy4PLgKtEnPS5AXed3xCiXcs7Z+KBHP72Wv8= -github.com/cloudwego/netpoll v0.2.4/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= -github.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= -github.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= -github.com/cloudwego/netpoll v0.6.0 h1:JRMkrA1o8k/4quxzg6Q1XM+zIhwZsyoWlq6ef+ht31U= -github.com/cloudwego/netpoll v0.6.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= -github.com/cloudwego/thriftgo v0.1.2/go.mod h1:LzeafuLSiHA9JTiWC8TIMIq64iadeObgRUhmVG1OC/w= -github.com/cloudwego/thriftgo v0.2.4/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4= -github.com/cloudwego/thriftgo v0.2.7/go.mod h1:8i9AF5uDdWHGqzUhXDlubCjx4MEfKvWXGQlMWyR0tM4= -github.com/cloudwego/thriftgo v0.2.11/go.mod h1:dAyXHEmKXo0LfMCrblVEY3mUZsdeuA5+i0vF5f09j7E= +github.com/cloudwego/netpoll v0.6.1 h1:Cjftvi6bmumsOijmuUFy6HqAUXMxAT3fKK96wsrm3XA= +github.com/cloudwego/netpoll v0.6.1/go.mod h1:kaqvfZ70qd4T2WtIIpCOi5Cxyob8viEpzLhCrTrz3HM= +github.com/cloudwego/runtimex v0.1.0 h1:HG+WxWoj5/CDChDZ7D99ROwvSMkuNXAqt6hnhTTZDiI= +github.com/cloudwego/runtimex v0.1.0/go.mod h1:23vL/HGV0W8nSCHbe084AgEBdDV4rvXenEUMnUNvUd8= github.com/cloudwego/thriftgo v0.3.6 h1:gHHW8Ag3cAEQ/awP4emTJiRPr5yQjbANhcsmV8/Epbw= github.com/cloudwego/thriftgo v0.3.6/go.mod h1:29ukiySoAMd0vXMYIduAY9dph/7dmChvOS11YLotFb8= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -139,9 +110,8 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3 h1:mpL/HvfIgIejhVwAfxBQkwEjlhP5o0O9RAeTAjpwzxc= github.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= -github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a h1:PEOGDI1kkyW37YqPWHLHc+D20D9+87Wt12TCcfTUo5Q= -github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -152,7 +122,6 @@ github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47 github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0= github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -162,7 +131,6 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E 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/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= @@ -172,13 +140,10 @@ 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/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -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/gls v0.0.0-20220109145502-612d0167dce5 h1:uiS4zKYKJVj5F3ID+5iylfKPsEQmBEOucSD9Vgmn0i0= github.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5/go.mod h1:I8AX+yW//L8Hshx6+a1m3bYkwXkpsVjA2795vP4f4oQ= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= @@ -192,7 +157,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= @@ -206,7 +170,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE 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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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= @@ -214,19 +177,14 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/thrift-iterator/go v0.0.0-20190402154806-9b5a67519118/go.mod h1:60PRwE/TCI1UqLvn8v2pwAf6+yzTPLP/Ji5xaesWDqk= +github.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/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/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/v2pro/plz v0.0.0-20221028024117-e5f9aec5b631/go.mod h1:3gacX+hQo+xvl0vtLqCMufzxuNCwt4geAVOMt2LQYfE= -github.com/v2pro/quokka v0.0.0-20171201153428-382cb39c6ee6/go.mod h1:0VP5W9AFNVWU8C1QLNeVg8TvzoEkIHWZ4vxtxEVFWUY= -github.com/v2pro/wombat v0.0.0-20180402055224-a56dbdcddef2/go.mod h1:wen8nMxrRrUmXnRwH+3wGAW+hyYTHcOrTNhMpxyp/i0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -241,13 +199,12 @@ go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= 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/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.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/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -301,7 +258,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= @@ -325,7 +281,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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= @@ -337,20 +292,16 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/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-20220704084225-05e143d24a9e/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-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= @@ -405,12 +356,12 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -438,13 +389,10 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/utils/utils.go b/utils/utils.go index 103d673..8e4cfda 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -5,6 +5,9 @@ import ( "fmt" "io/fs" "os" + "regexp" + "strconv" + "time" ) // PathExists check whether the file or directory exists @@ -26,3 +29,34 @@ func Printpath() { } fmt.Println("Current directory:", dir) } + +func ParseDuration(s string) (time.Duration, error) { + // 定义一个正则表达式来匹配时间量和单位 + // 假设时间量是一个整数,单位可以是 s(秒), m(分钟), h(小时) 等 + re := regexp.MustCompile(`^(\d+)([smh])$`) + matches := re.FindStringSubmatch(s) + if matches == nil || len(matches) != 3 { + return 0, fmt.Errorf("invalid duration format: %s", s) + } + + // 将时间量从字符串转换为整数 + amount, err := strconv.Atoi(matches[1]) + if err != nil { + return 0, fmt.Errorf("invalid duration amount: %s", matches[1]) + } + + // 根据单位计算纳秒数 + var duration time.Duration + switch matches[2] { + case "s": + duration = time.Duration(amount) * time.Second + case "m": + duration = time.Duration(amount) * time.Minute + case "h": + duration = time.Duration(amount) * time.Hour + default: + return 0, fmt.Errorf("unsupported duration unit: %s", matches[2]) + } + + return duration, nil +}