mojang cant get their cases straight

i had to implement like 4 cases just  to parse that file
This commit is contained in:
adman
2026-04-21 09:38:14 +02:00
parent d87c362270
commit f6001c8b22
7 changed files with 265 additions and 33 deletions
+29
View File
@@ -3,6 +3,8 @@ package mapstructure
import (
"fmt"
"reflect"
"github.com/admin-else/strom/util"
)
func (f *Format) decode(m map[string]any, target reflect.Value) error {
@@ -26,12 +28,19 @@ func (f *Format) decode(m map[string]any, target reflect.Value) error {
}
val, exists := m[key]
if !exists && f.trySnakeCase {
val, exists = m[util.SnakeCase(key)]
}
if !exists && f.tryLowCase {
val, exists = m[util.FirstLetterLower(key)]
}
if !exists {
if tag.Required || (f.requireAll && !tag.OmitEmpty) {
return fmt.Errorf("%w: %s", ErrMissingRequired, key)
}
continue
}
usedKeys[key] = true
fieldVal := target.Field(i)
@@ -108,6 +117,26 @@ func (f *Format) setField(target reflect.Value, value any, opts tagOptions) erro
return f.setBool(target, value)
}
// this fixes this edge case
// level_test.go:19: field Data: field Player: field Pos: cannot set [3]float64 from []interface {}
if targetType.Kind() == reflect.Array && src.Kind() == reflect.Slice {
if target.Len() != src.Len() {
return fmt.Errorf("cannot set %s from %T because lengths do not match", targetType, value)
}
for i := 0; i < src.Len(); i++ {
if src.Index(i).Type().AssignableTo(targetType.Elem()) {
target.Index(i).Set(src.Index(i))
continue
}
if src.Index(i).Elem().Type().AssignableTo(targetType.Elem()) {
target.Index(i).Set(src.Index(i).Elem())
continue
}
return fmt.Errorf("cannot set %s from %T because element %d cannot be converted to %s", targetType, value, i, targetType.Elem())
}
return nil
}
return fmt.Errorf("cannot set %s from %T", targetType, value)
}