Skip to content

Commit

Permalink
fix(zentao): fix type conversion when setting scopes (apache#6286)
Browse files Browse the repository at this point in the history
* fix(zentao): fix type conversion when setting scopes

* refactor(zentao): rename defaultCustomDecoders to defaultCustomDecoderHooks

* refactor(zentao): remove unused type field for StringFloat64
  • Loading branch information
d4x1 committed Oct 19, 2023
1 parent 98cb04b commit 511088e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
20 changes: 7 additions & 13 deletions backend/core/models/common/string_float64.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,19 @@ import (

type StringFloat64 struct {
v float64
t string
}

func NewStringFloat64FromAny(f interface{}) *StringFloat64 {
return &StringFloat64{
v: cast.ToFloat64(f),
}
}

func (f *StringFloat64) MarshalJSON() ([]byte, error) {
return json.Marshal(f.String())
return json.Marshal(f.v)
}

func (f *StringFloat64) String() string {
if f.t == "string" {
return fmt.Sprintf("\"%v\"", f.v)
}
return fmt.Sprintf("%v", f.v)
}

Expand All @@ -45,12 +47,6 @@ func (f *StringFloat64) UnmarshalJSON(data []byte) error {
if err := json.Unmarshal(data, &i); err != nil {
return err
}
switch i.(type) {
case float64:
f.t = "float64"
case string:
f.t = "string"
}
value, err := cast.ToFloat64E(i)
if err != nil {
return err
Expand All @@ -71,12 +67,10 @@ func (f *StringFloat64) Scan(v interface{}) error {
case float64:
*f = StringFloat64{
v: value,
t: "float64",
}
case string:
*f = StringFloat64{
v: cast.ToFloat64(value),
t: "string",
}
default:
return fmt.Errorf("%+v is an unknown type, with value: %v", v, value)
Expand Down
15 changes: 13 additions & 2 deletions backend/helpers/pluginhelper/api/mapstructure.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,18 @@ import (
"github.com/mitchellh/mapstructure"
)

var defaultCustomDecoderHooks = []mapstructure.DecodeHookFunc{decodeHookStringFloat64, DecodeHook}

func decodeHookStringFloat64(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
if f.Kind() == reflect.Float64 && t.Kind() == reflect.Struct && t == reflect.TypeOf(common.StringFloat64{}) {
return *common.NewStringFloat64FromAny(data), nil
}
if f.Kind() == reflect.Float64 && t.Kind() == reflect.Ptr && t == reflect.TypeOf(&common.StringFloat64{}) {
return common.NewStringFloat64FromAny(data), nil
}
return data, nil
}

func DecodeHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
if data == nil {
return nil, nil
Expand Down Expand Up @@ -68,14 +80,13 @@ func DecodeMapStruct(input map[string]interface{}, result interface{}, zeroField
result = models.UnwrapObject(result)
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
ZeroFields: zeroFields,
DecodeHook: mapstructure.ComposeDecodeHookFunc(DecodeHook),
DecodeHook: mapstructure.ComposeDecodeHookFunc(defaultCustomDecoderHooks...),
Result: result,
WeaklyTypedInput: true,
})
if err != nil {
return errors.Convert(err)
}

if err := decoder.Decode(input); err != nil {
return errors.Convert(err)
}
Expand Down

0 comments on commit 511088e

Please sign in to comment.