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 { ...@@ -34,7 +34,7 @@ func SetValue[D any](obj D, keyWithDots string, newValue any) error {
for keyIndex, key := range keySlice[0 : len(keySlice)-1] { for keyIndex, key := range keySlice[0 : len(keySlice)-1] {
if v.Kind() == reflect.Map { if v.Kind() == reflect.Map {
if v.IsNil() { if v.IsNil() {
return newInvalidPathError(keyWithDots) return newInvalidPathError(keyWithDots)
} }
...@@ -160,8 +160,22 @@ func SetValue[D any](obj D, keyWithDots string, newValue any) error { ...@@ -160,8 +160,22 @@ func SetValue[D any](obj D, keyWithDots string, newValue any) error {
switch v.Kind() { switch v.Kind() {
case reflect.String: case reflect.String:
if newValueKind == reflect.String { if v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface {
v.SetString(newValue.(string)) 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 { } else {
v.SetString(fmt.Sprintf("%v", newValue)) 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