Skip to content

Commit

Permalink
mapstruct: Handle nested values when converting to camel case
Browse files Browse the repository at this point in the history
  • Loading branch information
wader committed Jul 10, 2022
1 parent 942524a commit 7671434
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions internal/mapstruct/mapstruct.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,22 @@ func ToStruct(m any, v any) error {
return nil
}

func camelCaseMap(m map[string]any) map[string]any {
nm := map[string]any{}
for k, v := range m {
if vm, ok := v.(map[string]any); ok {
v = camelCaseMap(vm)
func CamelCase(v any) any {
switch vv := v.(type) {
case map[string]any:
n := map[string]any{}
for k, v := range vv {
n[CamelToSnake(k)] = CamelCase(v)
}
nm[CamelToSnake(k)] = v
return n
case []any:
n := make([]any, len(vv))
for i, v := range vv {
n[i] = CamelCase(v)
}
return n
}
return nm
return v
}

func ToMap(v any) (map[string]any, error) {
Expand All @@ -60,6 +67,10 @@ func ToMap(v any) (map[string]any, error) {
if err := ms.Decode(v); err != nil {
return nil, err
}
m, ok := CamelCase(m).(map[string]any)
if !ok {
panic("not map")
}

return camelCaseMap(m), nil
return m, nil
}

0 comments on commit 7671434

Please sign in to comment.