From 6b61bc3affb5da24616135e7aabcce28ef05c59f Mon Sep 17 00:00:00 2001 From: Volker Schukai <volker.schukai@schukai.com> Date: Wed, 13 Sep 2023 16:50:32 +0200 Subject: [PATCH] fix: set a string of a derived type #6 --- issue_7_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ set.go | 20 +++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 issue_7_test.go diff --git a/issue_7_test.go b/issue_7_test.go new file mode 100644 index 0000000..20c31d3 --- /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 f4face6..1c2babb 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)) } -- GitLab