From 253e06923db98afa1c3d0bbbc8c16fa9e89804ad Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 5 Apr 2025 11:58:11 +0800 Subject: [PATCH] refactor: rename Deserialize* to UnmarshalValidate* --- internal/autocert/provider.go | 4 ++-- internal/autocert/provider_test/ovh_test.go | 4 ++-- internal/config/agent_pool.go | 2 +- internal/config/config.go | 2 +- internal/config/types/config.go | 2 +- internal/net/gphttp/accesslog/config_test.go | 2 +- internal/net/gphttp/middleware/middleware.go | 2 +- internal/notif/config.go | 2 +- internal/notif/config_test.go | 2 +- internal/route/provider/docker.go | 4 ++-- internal/route/provider/file.go | 2 +- internal/route/rules/rules_test.go | 2 +- internal/route/types/http_config_test.go | 2 +- internal/utils/serialization.go | 23 +++++++++----------- internal/utils/serialization_test.go | 14 ++++++------ internal/utils/validation.go | 4 ---- 16 files changed, 33 insertions(+), 40 deletions(-) diff --git a/internal/autocert/provider.go b/internal/autocert/provider.go index 654d80a..b526cc4 100644 --- a/internal/autocert/provider.go +++ b/internal/autocert/provider.go @@ -19,7 +19,7 @@ import ( "github.com/yusing/go-proxy/internal/gperr" "github.com/yusing/go-proxy/internal/logging" "github.com/yusing/go-proxy/internal/task" - U "github.com/yusing/go-proxy/internal/utils" + "github.com/yusing/go-proxy/internal/utils" "github.com/yusing/go-proxy/internal/utils/strutils" ) @@ -329,7 +329,7 @@ func providerGenerator[CT any, PT challenge.Provider]( ) ProviderGenerator { return func(opt ProviderOpt) (challenge.Provider, gperr.Error) { cfg := defaultCfg() - err := U.Deserialize(opt, &cfg) + err := utils.MapUnmarshalValidate(opt, &cfg) if err != nil { return nil, err } diff --git a/internal/autocert/provider_test/ovh_test.go b/internal/autocert/provider_test/ovh_test.go index b147ce9..4d65212 100644 --- a/internal/autocert/provider_test/ovh_test.go +++ b/internal/autocert/provider_test/ovh_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/go-acme/lego/v4/providers/dns/ovh" - U "github.com/yusing/go-proxy/internal/utils" + "github.com/yusing/go-proxy/internal/utils" . "github.com/yusing/go-proxy/internal/utils/testing" "gopkg.in/yaml.v3" ) @@ -45,6 +45,6 @@ oauth2_config: testYaml = testYaml[1:] // remove first \n opt := make(map[string]any) ExpectNoError(t, yaml.Unmarshal([]byte(testYaml), opt)) - ExpectNoError(t, U.Deserialize(opt, cfg)) + ExpectNoError(t, utils.MapUnmarshalValidate(opt, cfg)) ExpectEqual(t, cfg, cfgExpected) } diff --git a/internal/config/agent_pool.go b/internal/config/agent_pool.go index 8f5f53d..84e9d5a 100644 --- a/internal/config/agent_pool.go +++ b/internal/config/agent_pool.go @@ -40,7 +40,7 @@ func (cfg *Config) VerifyNewAgent(host string, ca agent.PEMPair, client agent.PE var agentCfg agent.AgentConfig agentCfg.Addr = host - err := agentCfg.StartWithCerts(cfg.Task(), ca.Cert, client.Cert, client.Key) + err := agentCfg.InitWithCerts(cfg.Task().Context(), ca.Cert, client.Cert, client.Key) if err != nil { return 0, gperr.Wrap(err, "failed to start agent") } diff --git a/internal/config/config.go b/internal/config/config.go index 4ae01e3..c73a549 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -220,7 +220,7 @@ func (cfg *Config) load() gperr.Error { } model := config.DefaultConfig() - if err := utils.DeserializeYAML(data, model); err != nil { + if err := utils.UnmarshalValidateYAML(data, model); err != nil { gperr.LogFatal(errMsg, err) } diff --git a/internal/config/types/config.go b/internal/config/types/config.go index f8e693b..3db2ceb 100644 --- a/internal/config/types/config.go +++ b/internal/config/types/config.go @@ -81,7 +81,7 @@ func HasInstance() bool { func Validate(data []byte) gperr.Error { var model Config - return utils.DeserializeYAML(data, &model) + return utils.UnmarshalValidateYAML(data, &model) } var matchDomainsRegex = regexp.MustCompile(`^[^\.]?([\w\d\-_]\.?)+[^\.]?$`) diff --git a/internal/net/gphttp/accesslog/config_test.go b/internal/net/gphttp/accesslog/config_test.go index 8483638..c91e600 100644 --- a/internal/net/gphttp/accesslog/config_test.go +++ b/internal/net/gphttp/accesslog/config_test.go @@ -30,7 +30,7 @@ func TestNewConfig(t *testing.T) { ExpectNoError(t, err) var config Config - err = utils.Deserialize(parsed, &config) + err = utils.MapUnmarshalValidate(parsed, &config) ExpectNoError(t, err) ExpectEqual(t, config.BufferSize, 10) diff --git a/internal/net/gphttp/middleware/middleware.go b/internal/net/gphttp/middleware/middleware.go index ccf6705..c6b5fd8 100644 --- a/internal/net/gphttp/middleware/middleware.go +++ b/internal/net/gphttp/middleware/middleware.go @@ -118,7 +118,7 @@ func (m *Middleware) apply(optsRaw OptionsRaw) gperr.Error { } else { m.priority = DefaultPriority } - return utils.Deserialize(optsRaw, m.impl) + return utils.MapUnmarshalValidate(optsRaw, m.impl) } func (m *Middleware) finalize() error { diff --git a/internal/notif/config.go b/internal/notif/config.go index 1f35cdb..5f48f2e 100644 --- a/internal/notif/config.go +++ b/internal/notif/config.go @@ -47,7 +47,7 @@ func (cfg *NotificationConfig) UnmarshalMap(m map[string]any) (err gperr.Error) } // unmarshal provider config - if err := utils.Deserialize(m, cfg.Provider); err != nil { + if err := utils.MapUnmarshalValidate(m, cfg.Provider); err != nil { return err } diff --git a/internal/notif/config_test.go b/internal/notif/config_test.go index 465cefb..1ade43e 100644 --- a/internal/notif/config_test.go +++ b/internal/notif/config_test.go @@ -150,7 +150,7 @@ func TestNotificationConfig(t *testing.T) { t.Run(tt.name, func(t *testing.T) { var cfg NotificationConfig provider := tt.cfg["provider"] - err := utils.Deserialize(tt.cfg, &cfg) + err := utils.MapUnmarshalValidate(tt.cfg, &cfg) if tt.wantErr { ExpectHasError(t, err) } else { diff --git a/internal/route/provider/docker.go b/internal/route/provider/docker.go index e08cfc8..1d1799a 100755 --- a/internal/route/provider/docker.go +++ b/internal/route/provider/docker.go @@ -169,7 +169,7 @@ func (p *DockerProvider) routesFromContainerLabels(container *docker.Container) } // deserialize map into entry object - err := U.Deserialize(entryMap, r) + err := U.MapUnmarshalValidate(entryMap, r) if err != nil { errs.Add(err.Subject(alias)) } else { @@ -178,7 +178,7 @@ func (p *DockerProvider) routesFromContainerLabels(container *docker.Container) } if wildcardProps != nil { for _, re := range routes { - if err := U.Deserialize(wildcardProps, re); err != nil { + if err := U.MapUnmarshalValidate(wildcardProps, re); err != nil { errs.Add(err.Subject(docker.WildcardAlias)) break } diff --git a/internal/route/provider/file.go b/internal/route/provider/file.go index 79855b9..6c23a60 100644 --- a/internal/route/provider/file.go +++ b/internal/route/provider/file.go @@ -34,7 +34,7 @@ func FileProviderImpl(filename string) (ProviderImpl, error) { } func validate(data []byte) (routes route.Routes, err gperr.Error) { - err = utils.DeserializeYAML(data, &routes) + err = utils.UnmarshalValidateYAML(data, &routes) return } diff --git a/internal/route/rules/rules_test.go b/internal/route/rules/rules_test.go index e5bd7af..aa8e8d1 100644 --- a/internal/route/rules/rules_test.go +++ b/internal/route/rules/rules_test.go @@ -28,7 +28,7 @@ func TestParseRule(t *testing.T) { var rules struct { Rules Rules } - err := utils.Deserialize(utils.SerializedObject{"rules": test}, &rules) + err := utils.MapUnmarshalValidate(utils.SerializedObject{"rules": test}, &rules) ExpectNoError(t, err) ExpectEqual(t, len(rules.Rules), len(test)) ExpectEqual(t, rules.Rules[0].Name, "test") diff --git a/internal/route/types/http_config_test.go b/internal/route/types/http_config_test.go index 54693d1..58d7226 100644 --- a/internal/route/types/http_config_test.go +++ b/internal/route/types/http_config_test.go @@ -39,7 +39,7 @@ func TestHTTPConfigDeserialize(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cfg := Route{} - err := utils.Deserialize(tt.input, &cfg) + err := utils.MapUnmarshalValidate(tt.input, &cfg) if err != nil { ExpectNoError(t, err) } diff --git a/internal/utils/serialization.go b/internal/utils/serialization.go index cebcc73..25eb3fc 100644 --- a/internal/utils/serialization.go +++ b/internal/utils/serialization.go @@ -167,8 +167,8 @@ func dive(dst reflect.Value) (v reflect.Value, t reflect.Type, err gperr.Error) } } -// Deserialize takes a SerializedObject and a target value, and assigns the values in the SerializedObject to the target value. -// Deserialize ignores case differences between the field names in the SerializedObject and the target. +// MapUnmarshalValidate takes a SerializedObject and a target value, and assigns the values in the SerializedObject to the target value. +// MapUnmarshalValidate ignores case differences between the field names in the SerializedObject and the target. // // The target value must be a struct or a map[string]any. // If the target value is a struct , and implements the MapUnmarshaller interface, @@ -180,7 +180,7 @@ func dive(dst reflect.Value) (v reflect.Value, t reflect.Type, err gperr.Error) // If the target value is a map[string]any the SerializedObject will be deserialized into the map. // // The function returns an error if the target value is not a struct or a map[string]any, or if there is an error during deserialization. -func Deserialize(src SerializedObject, dst any) (err gperr.Error) { +func MapUnmarshalValidate(src SerializedObject, dst any) (err gperr.Error) { dstV := reflect.ValueOf(dst) dstT := dstV.Type() @@ -341,9 +341,6 @@ func Convert(src reflect.Value, dst reflect.Value) gperr.Error { case srcT.AssignableTo(dstT): dst.Set(src) return nil - // case srcT.ConvertibleTo(dstT): - // dst.Set(src.Convert(dstT)) - // return nil case srcKind == reflect.String: if convertible, err := ConvertString(src.String(), dst); convertible { return err @@ -371,7 +368,7 @@ func Convert(src reflect.Value, dst reflect.Value) gperr.Error { if !ok { return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String()) } - return Deserialize(obj, dst.Addr().Interface()) + return MapUnmarshalValidate(obj, dst.Addr().Interface()) case srcKind == reflect.Slice: if src.Len() == 0 { return nil @@ -448,7 +445,7 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe dst.Set(reflect.ValueOf(i).Convert(dstT)) return } - // check if (*T).Convertor is implemented + // check if target implements string parser if parser, ok := dst.Addr().Interface().(strutils.Parser); ok { return true, gperr.Wrap(parser.Parse(src)) } @@ -458,7 +455,7 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe case reflect.Slice: src = strings.TrimSpace(src) isMultiline := strings.ContainsRune(src, '\n') - // one liner is comma separated list + // treats one liner without leading dash as comma separated list if !isMultiline && src[0] != '-' { values := strutils.CommaSeperatedList(src) dst.Set(reflect.MakeSlice(dst.Type(), len(values), len(values))) @@ -493,21 +490,21 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe return true, Convert(reflect.ValueOf(tmp), dst) } -func DeserializeYAML[T any](data []byte, target *T) gperr.Error { +func UnmarshalValidateYAML[T any](data []byte, target *T) gperr.Error { m := make(map[string]any) if err := yaml.Unmarshal(data, m); err != nil { return gperr.Wrap(err) } - return Deserialize(m, target) + return MapUnmarshalValidate(m, target) } -func DeserializeYAMLMap[V any](data []byte) (_ functional.Map[string, V], err gperr.Error) { +func UnmarshalValidateYAMLMap[V any](data []byte) (_ functional.Map[string, V], err gperr.Error) { m := make(map[string]any) if err = gperr.Wrap(yaml.Unmarshal(data, m)); err != nil { return } m2 := make(map[string]V, len(m)) - if err = Deserialize(m, m2); err != nil { + if err = MapUnmarshalValidate(m, m2); err != nil { return } return functional.NewMapFrom(m2), nil diff --git a/internal/utils/serialization_test.go b/internal/utils/serialization_test.go index 4f91748..ce5669a 100644 --- a/internal/utils/serialization_test.go +++ b/internal/utils/serialization_test.go @@ -40,7 +40,7 @@ func TestDeserialize(t *testing.T) { t.Run("deserialize", func(t *testing.T) { var s2 S - err := Deserialize(testStructSerialized, &s2) + err := MapUnmarshalValidate(testStructSerialized, &s2) ExpectNoError(t, err) ExpectEqual(t, s2, testStruct) }) @@ -60,13 +60,13 @@ func TestDeserializeAnonymousField(t *testing.T) { } // all, anon := extractFields(reflect.TypeOf(s2)) // t.Fatalf("anon %v, all %v", anon, all) - err := Deserialize(map[string]any{"a": 1, "b": 2, "c": 3}, &s) + err := MapUnmarshalValidate(map[string]any{"a": 1, "b": 2, "c": 3}, &s) ExpectNoError(t, err) ExpectEqual(t, s.A, 1) ExpectEqual(t, s.B, 2) ExpectEqual(t, s.C, 3) - err = Deserialize(map[string]any{"a": 1, "b": 2, "c": 3}, &s2) + err = MapUnmarshalValidate(map[string]any{"a": 1, "b": 2, "c": 3}, &s2) ExpectNoError(t, err) ExpectEqual(t, s2.A, 1) ExpectEqual(t, s2.B, 2) @@ -148,7 +148,7 @@ func (c *testType) Parse(v string) (err error) { func TestConvertor(t *testing.T) { t.Run("valid", func(t *testing.T) { m := new(testModel) - ExpectNoError(t, Deserialize(map[string]any{"Test": "123"}, m)) + ExpectNoError(t, MapUnmarshalValidate(map[string]any{"Test": "123"}, m)) ExpectEqual(t, m.Test.foo, 123) ExpectEqual(t, m.Test.bar, "123") @@ -156,18 +156,18 @@ func TestConvertor(t *testing.T) { t.Run("int_to_string", func(t *testing.T) { m := new(testModel) - ExpectNoError(t, Deserialize(map[string]any{"Test": "123"}, m)) + ExpectNoError(t, MapUnmarshalValidate(map[string]any{"Test": "123"}, m)) ExpectEqual(t, m.Test.foo, 123) ExpectEqual(t, m.Test.bar, "123") - ExpectNoError(t, Deserialize(map[string]any{"Baz": 123}, m)) + ExpectNoError(t, MapUnmarshalValidate(map[string]any{"Baz": 123}, m)) ExpectEqual(t, m.Baz, "123") }) t.Run("invalid", func(t *testing.T) { m := new(testModel) - ExpectError(t, ErrUnsupportedConversion, Deserialize(map[string]any{"Test": struct{}{}}, m)) + ExpectError(t, ErrUnsupportedConversion, MapUnmarshalValidate(map[string]any{"Test": struct{}{}}, m)) }) } diff --git a/internal/utils/validation.go b/internal/utils/validation.go index 490c348..f9539bc 100644 --- a/internal/utils/validation.go +++ b/internal/utils/validation.go @@ -13,10 +13,6 @@ type CustomValidator interface { Validate() gperr.Error } -func Validator() *validator.Validate { - return validate -} - func MustRegisterValidation(tag string, fn validator.Func) { err := validate.RegisterValidation(tag, fn) if err != nil {