Skip to content

Commit 58c2a92

Browse files
Merge pull request #1 from MartinSimango/fix/embedded-fields
fix: remove support for embedded field alias names
2 parents 1de416a + b518626 commit 58c2a92

5 files changed

Lines changed: 69 additions & 103 deletions

File tree

field.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dstruct
22

33
import "reflect"
44

5-
type field struct {
5+
type structField struct {
66
name string
77
tag reflect.StructTag
88
value reflect.Value
@@ -14,25 +14,24 @@ type field struct {
1414
fqn string
1515
structIndex *int
1616
numberOfSubFields *int
17-
isFQNAlias bool
1817
}
1918

20-
func (f field) GetFieldName() string {
19+
func (f structField) GetFieldName() string {
2120
return f.name
2221
}
2322

24-
func (f field) GetValue() any {
23+
func (f structField) GetValue() any {
2524
return f.value.Interface()
2625
}
2726

28-
func (f field) GetType() reflect.Type {
27+
func (f structField) GetType() reflect.Type {
2928
return f.typ
3029
}
3130

32-
func (f field) GetFieldFQName() string {
31+
func (f structField) GetFieldFQName() string {
3332
return f.fqn
3433
}
3534

36-
func (f field) GetTag(t string) string {
35+
func (f structField) GetTag(t string) string {
3736
return f.tag.Get(t)
3837
}

generated.struct.go

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ func NewGeneratedStructWithConfig(val any,
5656

5757
func (gs *GeneratedStructImpl) populateGeneratedFields() {
5858

59-
for name, field := range gs.fieldMap {
60-
if field.HasChildren() || field.data.isFQNAlias {
59+
for name, field := range gs.fieldNodeMap {
60+
if field.HasChildren() {
6161
continue
6262
}
6363

@@ -77,13 +77,10 @@ func (gs *GeneratedStructImpl) Generate() {
7777
func (gs *GeneratedStructImpl) GenerateAndUpdate() {
7878
gs.Generate()
7979
gs.Update()
80-
// for k, v := range gs.GetFields() {
81-
// fmt.Println(k, v.anonymous, v.isFQNAlias)
82-
// }
8380
}
8481

8582
func (gs *GeneratedStructImpl) SetFieldGenerationConfig(field string, generationConfig *generator.GenerationConfig) error {
86-
if gs.fieldMap[field] == nil {
83+
if gs.fieldNodeMap[field] == nil {
8784
return fmt.Errorf("field %s does not exist within the struct", field)
8885
}
8986
if gs.generatedFields[field] == nil {
@@ -102,7 +99,7 @@ func (gs *GeneratedStructImpl) GetFieldGenerator(field string) *generator.Genera
10299
}
103100
func (gs *GeneratedStructImpl) SetFieldDefaultGenerationFunction(field string,
104101
generationFunction generator.GenerationFunction) {
105-
kind := gs.fieldMap[field].data.GetType().Kind()
102+
kind := gs.fieldNodeMap[field].data.GetType().Kind()
106103
generator := gs.generatedFields[field].Field.Generator
107104
generator.DefaultGenerationFunctions[kind] = generationFunction
108105
generationFunction.SetGenerationConfig(generator.GenerationConfig)
@@ -123,12 +120,3 @@ func (gs *GeneratedStructImpl) generateFields() {
123120
}
124121
}
125122
}
126-
127-
func getGeneratorField(field *field, defaultGenerationFunction *generator.Generator) *generator.GeneratedField {
128-
return &generator.GeneratedField{
129-
Name: field.fqn,
130-
Value: field.value,
131-
Tag: field.tag,
132-
Generator: defaultGenerationFunction,
133-
}
134-
}

limitations/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,6 @@ func main() {
5656

5757
}
5858

59+
* Generated structs cannot generate slice fields whose types have recursive definition.
60+
5961
```

modifier.go

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import (
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

1416
type 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

4143
type 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

4850
var _ 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

7073
func (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+
7785
func (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

8493
func isFieldExported(field string) bool {
@@ -94,15 +103,16 @@ func isFieldExported(field string) bool {
94103
return true
95104
}
96105
func (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

Comments
 (0)