diff --git a/issue_7_test.go b/issue_7_test.go new file mode 100644 index 0000000000000000000000000000000000000000..20c31d39328c8798c73b74343a645bebfb6762d0 --- /dev/null +++ b/issue_7_test.go @@ -0,0 +1,40 @@ +package pathfinder + +import ( + "testing" +) + +//// Ihre Fehlerdefinitionen +//func newInvalidPathError(path string) error { +// return fmt.Errorf("invalid path: %s", path) +//} +// +//func newCannotSetError(path string) error { +// return fmt.Errorf("cannot set: %s", path) +//} + +// ... weitere Fehlerdefinitionen + +// Test für SetValue +func TestSetValue(t *testing.T) { + type Inner struct { + Field PathValue + } + type Outer struct { + InnerField *Inner + } + obj := &Outer{ + InnerField: &Inner{ + Field: "oldValue", + }, + } + + err := SetValue(obj, "InnerField.Field", PathValue("newValue")) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if obj.InnerField.Field != "newValue" { + t.Fatalf("expected newValue, got: %s", obj.InnerField.Field) + } +} diff --git a/set.go b/set.go index f4face6853abdbd8d23ca9e5de3201ff9f3eb55a..1c2babb1eca4db438c852ce643926da170b51861 100644 --- a/set.go +++ b/set.go @@ -34,7 +34,7 @@ func SetValue[D any](obj D, keyWithDots string, newValue any) error { for keyIndex, key := range keySlice[0 : len(keySlice)-1] { if v.Kind() == reflect.Map { - + if v.IsNil() { return newInvalidPathError(keyWithDots) } @@ -160,8 +160,22 @@ func SetValue[D any](obj D, keyWithDots string, newValue any) error { switch v.Kind() { case reflect.String: - if newValueKind == reflect.String { - v.SetString(newValue.(string)) + if v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { + if v.Elem().CanSet() && v.Elem().Kind() == reflect.String { + if newValueKind == reflect.String { + v.Elem().SetString(newValue.(string)) + } else { + v.Elem().SetString(fmt.Sprintf("%v", newValue)) + } + } + } else if newValueKind == reflect.String { + + if reflect.TypeOf(newValue).ConvertibleTo(reflect.TypeOf("")) { + newValueString := reflect.ValueOf(newValue).Convert(reflect.TypeOf("")).Interface().(string) + v.SetString(newValueString) + } else { + return newUnsupportedTypePathError(keyWithDots, v.Type()) + } } else { v.SetString(fmt.Sprintf("%v", newValue)) }