mirror of
https://github.com/yusing/godoxy.git
synced 2025-07-22 20:24:03 +02:00
refactor: rename Deserialize* to UnmarshalValidate*
This commit is contained in:
parent
2c0d58f692
commit
253e06923d
16 changed files with 33 additions and 40 deletions
internal
autocert
config
net/gphttp
notif
route
utils
|
@ -19,7 +19,7 @@ import (
|
||||||
"github.com/yusing/go-proxy/internal/gperr"
|
"github.com/yusing/go-proxy/internal/gperr"
|
||||||
"github.com/yusing/go-proxy/internal/logging"
|
"github.com/yusing/go-proxy/internal/logging"
|
||||||
"github.com/yusing/go-proxy/internal/task"
|
"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"
|
"github.com/yusing/go-proxy/internal/utils/strutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ func providerGenerator[CT any, PT challenge.Provider](
|
||||||
) ProviderGenerator {
|
) ProviderGenerator {
|
||||||
return func(opt ProviderOpt) (challenge.Provider, gperr.Error) {
|
return func(opt ProviderOpt) (challenge.Provider, gperr.Error) {
|
||||||
cfg := defaultCfg()
|
cfg := defaultCfg()
|
||||||
err := U.Deserialize(opt, &cfg)
|
err := utils.MapUnmarshalValidate(opt, &cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/providers/dns/ovh"
|
"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"
|
. "github.com/yusing/go-proxy/internal/utils/testing"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
@ -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)
|
||||||
ExpectNoError(t, yaml.Unmarshal([]byte(testYaml), opt))
|
ExpectNoError(t, yaml.Unmarshal([]byte(testYaml), opt))
|
||||||
ExpectNoError(t, U.Deserialize(opt, cfg))
|
ExpectNoError(t, utils.MapUnmarshalValidate(opt, cfg))
|
||||||
ExpectEqual(t, cfg, cfgExpected)
|
ExpectEqual(t, cfg, cfgExpected)
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (cfg *Config) VerifyNewAgent(host string, ca agent.PEMPair, client agent.PE
|
||||||
|
|
||||||
var agentCfg agent.AgentConfig
|
var agentCfg agent.AgentConfig
|
||||||
agentCfg.Addr = host
|
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 {
|
if err != nil {
|
||||||
return 0, gperr.Wrap(err, "failed to start agent")
|
return 0, gperr.Wrap(err, "failed to start agent")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,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\-_]\.?)+[^\.]?$`)
|
||||||
|
|
|
@ -30,7 +30,7 @@ func TestNewConfig(t *testing.T) {
|
||||||
ExpectNoError(t, err)
|
ExpectNoError(t, err)
|
||||||
|
|
||||||
var config Config
|
var config Config
|
||||||
err = utils.Deserialize(parsed, &config)
|
err = utils.MapUnmarshalValidate(parsed, &config)
|
||||||
ExpectNoError(t, err)
|
ExpectNoError(t, err)
|
||||||
|
|
||||||
ExpectEqual(t, config.BufferSize, 10)
|
ExpectEqual(t, config.BufferSize, 10)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -169,7 +169,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 {
|
||||||
|
@ -178,7 +178,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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -39,7 +39,7 @@ func TestHTTPConfigDeserialize(t *testing.T) {
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
cfg := Route{}
|
cfg := Route{}
|
||||||
err := utils.Deserialize(tt.input, &cfg)
|
err := utils.MapUnmarshalValidate(tt.input, &cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ExpectNoError(t, err)
|
ExpectNoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
// 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,
|
||||||
|
@ -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.
|
// 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) {
|
||||||
dstV := reflect.ValueOf(dst)
|
dstV := reflect.ValueOf(dst)
|
||||||
dstT := dstV.Type()
|
dstT := dstV.Type()
|
||||||
|
|
||||||
|
@ -341,9 +341,6 @@ func Convert(src reflect.Value, dst reflect.Value) gperr.Error {
|
||||||
case srcT.AssignableTo(dstT):
|
case srcT.AssignableTo(dstT):
|
||||||
dst.Set(src)
|
dst.Set(src)
|
||||||
return nil
|
return nil
|
||||||
// case srcT.ConvertibleTo(dstT):
|
|
||||||
// dst.Set(src.Convert(dstT))
|
|
||||||
// return nil
|
|
||||||
case srcKind == reflect.String:
|
case srcKind == reflect.String:
|
||||||
if convertible, err := ConvertString(src.String(), dst); convertible {
|
if convertible, err := ConvertString(src.String(), dst); convertible {
|
||||||
return err
|
return err
|
||||||
|
@ -371,7 +368,7 @@ func Convert(src reflect.Value, dst reflect.Value) gperr.Error {
|
||||||
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())
|
return MapUnmarshalValidate(obj, dst.Addr().Interface())
|
||||||
case srcKind == reflect.Slice:
|
case srcKind == reflect.Slice:
|
||||||
if src.Len() == 0 {
|
if src.Len() == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -448,7 +445,7 @@ func ConvertString(src string, dst reflect.Value) (convertible bool, convErr gpe
|
||||||
dst.Set(reflect.ValueOf(i).Convert(dstT))
|
dst.Set(reflect.ValueOf(i).Convert(dstT))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// check if (*T).Convertor is implemented
|
// check if target implements string parser
|
||||||
if parser, ok := dst.Addr().Interface().(strutils.Parser); ok {
|
if parser, ok := dst.Addr().Interface().(strutils.Parser); ok {
|
||||||
return true, gperr.Wrap(parser.Parse(src))
|
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:
|
case reflect.Slice:
|
||||||
src = strings.TrimSpace(src)
|
src = strings.TrimSpace(src)
|
||||||
isMultiline := strings.ContainsRune(src, '\n')
|
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] != '-' {
|
if !isMultiline && src[0] != '-' {
|
||||||
values := strutils.CommaSeperatedList(src)
|
values := strutils.CommaSeperatedList(src)
|
||||||
dst.Set(reflect.MakeSlice(dst.Type(), len(values), len(values)))
|
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)
|
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)
|
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 UnmarshalValidateYAMLMap[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
|
||||||
|
|
|
@ -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))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,6 @@ type CustomValidator interface {
|
||||||
Validate() gperr.Error
|
Validate() gperr.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func Validator() *validator.Validate {
|
|
||||||
return validate
|
|
||||||
}
|
|
||||||
|
|
||||||
func MustRegisterValidation(tag string, fn validator.Func) {
|
func MustRegisterValidation(tag string, fn validator.Func) {
|
||||||
err := validate.RegisterValidation(tag, fn)
|
err := validate.RegisterValidation(tag, fn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue