refactor: rename Deserialize to MapUnmarshalValidate

This commit is contained in:
yusing 2025-04-29 01:29:02 +08:00
parent 0b69589586
commit 7aa1215491
15 changed files with 31 additions and 31 deletions

View file

@ -45,6 +45,6 @@ oauth2_config:
testYaml = testYaml[1:] // remove first \n testYaml = testYaml[1:] // remove first \n
opt := make(map[string]any) opt := make(map[string]any)
require.NoError(t, yaml.Unmarshal([]byte(testYaml), &opt)) require.NoError(t, yaml.Unmarshal([]byte(testYaml), &opt))
require.NoError(t, utils.Deserialize(opt, cfg)) require.NoError(t, utils.MapUnmarshalValidate(opt, cfg))
require.Equal(t, cfg, cfgExpected) require.Equal(t, cfg, cfgExpected)
} }

View file

@ -16,7 +16,7 @@ func DNSProvider[CT any, PT challenge.Provider](
) Generator { ) Generator {
return func(opt map[string]any) (challenge.Provider, gperr.Error) { return func(opt map[string]any) (challenge.Provider, gperr.Error) {
cfg := defaultCfg() cfg := defaultCfg()
err := utils.Deserialize(opt, &cfg) err := utils.MapUnmarshalValidate(opt, &cfg)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -220,7 +220,7 @@ func (cfg *Config) load() gperr.Error {
} }
model := config.DefaultConfig() model := config.DefaultConfig()
if err := utils.DeserializeYAML(data, model); err != nil { if err := utils.UnmarshalValidateYAML(data, model); err != nil {
gperr.LogFatal(errMsg, err) gperr.LogFatal(errMsg, err)
} }

View file

@ -88,7 +88,7 @@ func HasInstance() bool {
func Validate(data []byte) gperr.Error { func Validate(data []byte) gperr.Error {
var model Config var model Config
return utils.DeserializeYAML(data, &model) return utils.UnmarshalValidateYAML(data, &model)
} }
var matchDomainsRegex = regexp.MustCompile(`^[^\.]?([\w\d\-_]\.?)+[^\.]?$`) var matchDomainsRegex = regexp.MustCompile(`^[^\.]?([\w\d\-_]\.?)+[^\.]?$`)

View file

@ -178,7 +178,7 @@ func (c *Container) loadDeleteIdlewatcherLabels(helper containerHelper) {
ContainerName: c.ContainerName, ContainerName: c.ContainerName,
}, },
} }
err := utils.Deserialize(cfg, idwCfg) err := utils.MapUnmarshalValidate(cfg, idwCfg)
if err != nil { if err != nil {
gperr.LogWarn("invalid idlewatcher config", gperr.PrependSubject(c.ContainerName, err)) gperr.LogWarn("invalid idlewatcher config", gperr.PrependSubject(c.ContainerName, err))
} else { } else {

View file

@ -30,7 +30,7 @@ func TestNewConfig(t *testing.T) {
expect.NoError(t, err) expect.NoError(t, err)
var config RequestLoggerConfig var config RequestLoggerConfig
err = utils.Deserialize(parsed, &config) err = utils.MapUnmarshalValidate(parsed, &config)
expect.NoError(t, err) expect.NoError(t, err)
expect.Equal(t, config.BufferSize, 10) expect.Equal(t, config.BufferSize, 10)

View file

@ -118,7 +118,7 @@ func (m *Middleware) apply(optsRaw OptionsRaw) gperr.Error {
} else { } else {
m.priority = DefaultPriority m.priority = DefaultPriority
} }
return utils.Deserialize(optsRaw, m.impl) return utils.MapUnmarshalValidate(optsRaw, m.impl)
} }
func (m *Middleware) finalize() error { func (m *Middleware) finalize() error {

View file

@ -47,7 +47,7 @@ func (cfg *NotificationConfig) UnmarshalMap(m map[string]any) (err gperr.Error)
} }
// unmarshal provider config // unmarshal provider config
if err := utils.Deserialize(m, cfg.Provider); err != nil { if err := utils.MapUnmarshalValidate(m, cfg.Provider); err != nil {
return err return err
} }

View file

@ -150,7 +150,7 @@ func TestNotificationConfig(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
var cfg NotificationConfig var cfg NotificationConfig
provider := tt.cfg["provider"] provider := tt.cfg["provider"]
err := utils.Deserialize(tt.cfg, &cfg) err := utils.MapUnmarshalValidate(tt.cfg, &cfg)
if tt.wantErr { if tt.wantErr {
ExpectHasError(t, err) ExpectHasError(t, err)
} else { } else {

View file

@ -172,7 +172,7 @@ func (p *DockerProvider) routesFromContainerLabels(container *docker.Container)
} }
// deserialize map into entry object // deserialize map into entry object
err := U.Deserialize(entryMap, r) err := U.MapUnmarshalValidate(entryMap, r)
if err != nil { if err != nil {
errs.Add(err.Subject(alias)) errs.Add(err.Subject(alias))
} else { } else {
@ -181,7 +181,7 @@ func (p *DockerProvider) routesFromContainerLabels(container *docker.Container)
} }
if wildcardProps != nil { if wildcardProps != nil {
for _, re := range routes { 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)) errs.Add(err.Subject(docker.WildcardAlias))
break break
} }

View file

@ -34,7 +34,7 @@ func FileProviderImpl(filename string) (ProviderImpl, error) {
} }
func validate(data []byte) (routes route.Routes, err gperr.Error) { func validate(data []byte) (routes route.Routes, err gperr.Error) {
err = utils.DeserializeYAML(data, &routes) err = utils.UnmarshalValidateYAML(data, &routes)
return return
} }

View file

@ -28,7 +28,7 @@ func TestParseRule(t *testing.T) {
var rules struct { var rules struct {
Rules Rules Rules Rules
} }
err := utils.Deserialize(utils.SerializedObject{"rules": test}, &rules) err := utils.MapUnmarshalValidate(utils.SerializedObject{"rules": test}, &rules)
ExpectNoError(t, err) ExpectNoError(t, err)
ExpectEqual(t, len(rules.Rules), len(test)) ExpectEqual(t, len(rules.Rules), len(test))
ExpectEqual(t, rules.Rules[0].Name, "test") ExpectEqual(t, rules.Rules[0].Name, "test")

View file

@ -40,7 +40,7 @@ func TestHTTPConfigDeserialize(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
cfg := Route{} cfg := Route{}
tt.input["host"] = "internal" tt.input["host"] = "internal"
err := utils.Deserialize(tt.input, &cfg) err := utils.MapUnmarshalValidate(tt.input, &cfg)
if err != nil { if err != nil {
expect.NoError(t, err) expect.NoError(t, err)
} }

View file

@ -170,8 +170,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. // MapUnmarshalValidate 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 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. // The target value must be a struct or a map[string]any.
// If the target value is a struct , and implements the MapUnmarshaller interface, // If the target value is a struct , and implements the MapUnmarshaller interface,
@ -183,11 +183,11 @@ 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. // 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. // 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) {
return deserialize(src, dst, true) return mapUnmarshalValidate(src, dst, true)
} }
func deserialize(src SerializedObject, dst any, checkValidateTag bool) (err gperr.Error) { func mapUnmarshalValidate(src SerializedObject, dst any, checkValidateTag bool) (err gperr.Error) {
dstV := reflect.ValueOf(dst) dstV := reflect.ValueOf(dst)
dstT := dstV.Type() dstT := dstV.Type()
@ -378,7 +378,7 @@ func Convert(src reflect.Value, dst reflect.Value, checkValidateTag bool) gperr.
if !ok { if !ok {
return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String()) return ErrUnsupportedConversion.Subject(dstT.String() + " to " + srcT.String())
} }
return deserialize(obj, dst.Addr().Interface(), checkValidateTag) return mapUnmarshalValidate(obj, dst.Addr().Interface(), checkValidateTag)
case srcKind == reflect.Slice: case srcKind == reflect.Slice:
if src.Len() == 0 { if src.Len() == 0 {
return nil return nil
@ -500,21 +500,21 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe
return true, Convert(reflect.ValueOf(tmp), dst, true) return true, Convert(reflect.ValueOf(tmp), dst, true)
} }
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) m := make(map[string]any)
if err := yaml.Unmarshal(data, &m); err != nil { if err := yaml.Unmarshal(data, &m); err != nil {
return gperr.Wrap(err) 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 UnmarshalValidateYAMLXSync[V any](data []byte) (_ functional.Map[string, V], err gperr.Error) {
m := make(map[string]any) m := make(map[string]any)
if err = gperr.Wrap(yaml.Unmarshal(data, &m)); err != nil { if err = gperr.Wrap(yaml.Unmarshal(data, &m)); err != nil {
return return
} }
m2 := make(map[string]V, len(m)) m2 := make(map[string]V, len(m))
if err = Deserialize(m, m2); err != nil { if err = MapUnmarshalValidate(m, m2); err != nil {
return return
} }
return functional.NewMapFrom(m2), nil return functional.NewMapFrom(m2), nil

View file

@ -40,7 +40,7 @@ func TestDeserialize(t *testing.T) {
t.Run("deserialize", func(t *testing.T) { t.Run("deserialize", func(t *testing.T) {
var s2 S var s2 S
err := Deserialize(testStructSerialized, &s2) err := MapUnmarshalValidate(testStructSerialized, &s2)
ExpectNoError(t, err) ExpectNoError(t, err)
ExpectEqual(t, s2, testStruct) ExpectEqual(t, s2, testStruct)
}) })
@ -60,13 +60,13 @@ func TestDeserializeAnonymousField(t *testing.T) {
} }
// all, anon := extractFields(reflect.TypeOf(s2)) // all, anon := extractFields(reflect.TypeOf(s2))
// t.Fatalf("anon %v, all %v", anon, all) // 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) ExpectNoError(t, err)
ExpectEqual(t, s.A, 1) ExpectEqual(t, s.A, 1)
ExpectEqual(t, s.B, 2) ExpectEqual(t, s.B, 2)
ExpectEqual(t, s.C, 3) 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) ExpectNoError(t, err)
ExpectEqual(t, s2.A, 1) ExpectEqual(t, s2.A, 1)
ExpectEqual(t, s2.B, 2) ExpectEqual(t, s2.B, 2)
@ -148,7 +148,7 @@ func (c *testType) Parse(v string) (err error) {
func TestConvertor(t *testing.T) { func TestConvertor(t *testing.T) {
t.Run("valid", func(t *testing.T) { t.Run("valid", func(t *testing.T) {
m := new(testModel) 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.foo, 123)
ExpectEqual(t, m.Test.bar, "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) { t.Run("int_to_string", func(t *testing.T) {
m := new(testModel) 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.foo, 123)
ExpectEqual(t, m.Test.bar, "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") ExpectEqual(t, m.Baz, "123")
}) })
t.Run("invalid", func(t *testing.T) { t.Run("invalid", func(t *testing.T) {
m := new(testModel) m := new(testModel)
ExpectError(t, ErrUnsupportedConversion, Deserialize(map[string]any{"Test": struct{}{}}, m)) ExpectError(t, ErrUnsupportedConversion, MapUnmarshalValidate(map[string]any{"Test": struct{}{}}, m))
}) })
} }