Skip to content
Snippets Groups Projects
Verified Commit 6b61bc3a authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

fix: set a string of a derived type #6

parent 85d91e1d
No related branches found
No related tags found
No related merge requests found
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)
}
}
......@@ -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))
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment