99 "github.com/MartinSimango/dstruct/dreflect"
1010)
1111
12- type FieldMap map [string ]* Node [field ]
12+ type FieldNode map [string ]* Node [structField ]
13+
14+ type FieldData map [string ]structField
1315
1416type DynamicStructModifier interface {
1517 // Instance returns a copy of the struct
@@ -26,8 +28,8 @@ type DynamicStructModifier interface {
2628 // The program will panic if the type of value does not match the type of the struct field `field`.
2729 Set (field string , value any ) error
2830
29- // GetFields returns are map containing all fields within a struct (including fields subfields)
30- GetFields () map [ string ] field
31+ // GetFields returns a map containing all fields within a struct
32+ GetFields () FieldData
3133
3234 // Update updates the struct's underlying tree to represent that of the strct's value
3335 Update ()
@@ -36,35 +38,36 @@ type DynamicStructModifier interface {
3638 Apply (field string , value any ) error
3739}
3840
39- type FieldModifier func (* field )
41+ type FieldModifier func (* structField )
4042
4143type DynamicStructModifierImpl struct {
42- strct any
43- fieldMap FieldMap
44- fieldData map [string ]field
45- root * Node [field ]
44+ strct any
45+ fieldNodeMap FieldNode
46+ fieldData map [string ]structField
47+ root * Node [structField ]
4648}
4749
4850var _ DynamicStructModifier = & DynamicStructModifierImpl {}
4951
50- func newStruct (strct any , rootNode * Node [field ]) * DynamicStructModifierImpl {
52+ func newStruct (strct any , rootNode * Node [structField ]) * DynamicStructModifierImpl {
5153 dsm := & DynamicStructModifierImpl {
52- strct : strct ,
53- fieldMap : make (FieldMap ),
54- fieldData : make (map [string ]field ),
55- root : rootNode ,
54+ strct : strct ,
55+ fieldNodeMap : make (FieldNode ),
56+ fieldData : make (map [string ]structField ),
57+ root : rootNode ,
5658 }
57- dsm .createFieldMap (rootNode )
59+ dsm .createFieldToNodeMappings (rootNode )
5860 return dsm
5961}
6062
61- func (dm * DynamicStructModifierImpl ) createFieldMap (rootNode * Node [field ]) {
63+ func (dm * DynamicStructModifierImpl ) createFieldToNodeMappings (rootNode * Node [structField ]) {
6264
6365 for _ , field := range rootNode .children {
64- dm .fieldMap [field .data .fqn ] = field
66+ dm .fieldNodeMap [field .data .fqn ] = field
6567 dm .fieldData [field .data .fqn ] = * field .data
66- dm .createFieldMap (field )
68+ dm .createFieldToNodeMappings (field )
6769 }
70+
6871}
6972
7073func (dm * DynamicStructModifierImpl ) New () any {
@@ -74,11 +77,17 @@ func (dm *DynamicStructModifierImpl) Instance() any {
7477 return dreflect .GetUnderlyingPointerValue (dm .strct )
7578}
7679
80+ func (dm * DynamicStructModifierImpl ) get (field string ) (n * Node [structField ]) {
81+ return dm .fieldNodeMap [field ]
82+
83+ }
84+
7785func (dm * DynamicStructModifierImpl ) Get (field string ) (any , error ) {
78- if dm .fieldMap [ field ] == nil {
86+ if f := dm .get ( field ); f == nil {
7987 return nil , fmt .Errorf ("field %s does not exists in struct" , field )
88+ } else {
89+ return f .data .value .Interface (), nil
8090 }
81- return dm .fieldMap [field ].data .value .Interface (), nil
8291}
8392
8493func isFieldExported (field string ) bool {
@@ -94,15 +103,16 @@ func isFieldExported(field string) bool {
94103 return true
95104}
96105func (dm * DynamicStructModifierImpl ) Set (field string , value any ) error {
97- if dm .fieldMap [field ] == nil {
106+ var f * Node [structField ]
107+ if f = dm .get (field ); f == nil {
98108 return fmt .Errorf ("field %s does not exists in struct" , field )
99109 }
100110
101111 if ! isFieldExported (field ) {
102112 return fmt .Errorf ("field %s is not exported" , field )
103113 }
104114
105- fieldValue := dm . fieldMap [ field ] .data .value
115+ fieldValue := f .data .value
106116 if ! canExtend (value ) {
107117 if value == nil {
108118 if ! fieldValue .IsZero () {
@@ -119,7 +129,7 @@ func (dm *DynamicStructModifierImpl) Set(field string, value any) error {
119129 return nil
120130}
121131
122- func (dm * DynamicStructModifierImpl ) GetFields () map [ string ] field {
132+ func (dm * DynamicStructModifierImpl ) GetFields () FieldData {
123133 return dm .fieldData
124134}
125135
0 commit comments