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