Skip to content

Commit 79a4312

Browse files
authored
Merge pull request #18 from saedx1/master
Change to storing fields into slices for retrieval consistency
2 parents 8bbcc94 + 912631c commit 79a4312

File tree

2 files changed

+75
-55
lines changed

2 files changed

+75
-55
lines changed

builder.go

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,13 @@ type (
8383
}
8484

8585
builderImpl struct {
86-
fields map[string]*fieldConfigImpl
86+
fields []*fieldConfigImpl
8787
}
8888

8989
fieldConfigImpl struct {
90-
typ interface{}
91-
tag string
90+
name string
91+
typ interface{}
92+
tag string
9293
}
9394

9495
dynamicStructImpl struct {
@@ -103,7 +104,7 @@ type (
103104
//
104105
func NewStruct() Builder {
105106
return &builderImpl{
106-
fields: map[string]*fieldConfigImpl{},
107+
fields: []*fieldConfigImpl{},
107108
}
108109
}
109110

@@ -139,38 +140,49 @@ func MergeStructs(values ...interface{}) Builder {
139140
}
140141

141142
func (b *builderImpl) AddField(name string, typ interface{}, tag string) Builder {
142-
b.fields[name] = &fieldConfigImpl{
143-
typ: typ,
144-
tag: tag,
145-
}
143+
b.fields = append(b.fields, &fieldConfigImpl{
144+
name: name,
145+
typ: typ,
146+
tag: tag,
147+
})
146148

147149
return b
148150
}
149151

150152
func (b *builderImpl) RemoveField(name string) Builder {
151-
delete(b.fields, name)
152-
153+
for i := range b.fields {
154+
if b.fields[i].name == name {
155+
b.fields = append(b.fields[:i], b.fields[i+1:]...)
156+
break
157+
}
158+
}
153159
return b
154160
}
155161

156162
func (b *builderImpl) HasField(name string) bool {
157-
_, ok := b.fields[name]
158-
return ok
163+
for i := range b.fields {
164+
if b.fields[i].name == name {
165+
return true
166+
}
167+
}
168+
return false
159169
}
160170

161171
func (b *builderImpl) GetField(name string) FieldConfig {
162-
if !b.HasField(name) {
163-
return nil
172+
for i := range b.fields {
173+
if b.fields[i].name == name {
174+
return b.fields[i]
175+
}
164176
}
165-
return b.fields[name]
177+
return nil
166178
}
167179

168180
func (b *builderImpl) Build() DynamicStruct {
169181
var structFields []reflect.StructField
170182

171-
for name, field := range b.fields {
183+
for _, field := range b.fields {
172184
structFields = append(structFields, reflect.StructField{
173-
Name: name,
185+
Name: field.name,
174186
Type: reflect.TypeOf(field.typ),
175187
Tag: reflect.StructTag(field.tag),
176188
})
@@ -191,14 +203,14 @@ func (f *fieldConfigImpl) SetTag(tag string) FieldConfig {
191203
return f
192204
}
193205

194-
func (ds *dynamicStructImpl) New() interface{} {
206+
func (ds *dynamicStructImpl) New() interface{} {
195207
return reflect.New(ds.definition).Interface()
196208
}
197209

198-
func (ds *dynamicStructImpl) NewSliceOfStructs() interface{} {
210+
func (ds *dynamicStructImpl) NewSliceOfStructs() interface{} {
199211
return reflect.New(reflect.SliceOf(ds.definition)).Interface()
200212
}
201213

202-
func (ds *dynamicStructImpl) NewMapOfStructs(key interface{}) interface{} {
214+
func (ds *dynamicStructImpl) NewMapOfStructs(key interface{}) interface{} {
203215
return reflect.New(reflect.MapOf(reflect.Indirect(reflect.ValueOf(key)).Type(), ds.definition)).Interface()
204216
}

builder_test.go

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ func TestExtendStruct(t *testing.T) {
4040
t.Errorf(`TestExtendStruct - expected length of fields map to be 1 got %d`, len(builder.fields))
4141
}
4242

43-
field, ok := builder.fields["Field"]
44-
if !ok {
43+
field := builder.GetField("Field")
44+
if field == nil {
4545
t.Error(`TestExtendStruct - expected to have field "Field"`)
4646
}
4747

4848
expected := &fieldConfigImpl{
49-
typ: 0,
50-
tag: `key:"value"`,
49+
name: "Field",
50+
typ: 0,
51+
tag: `key:"value"`,
5152
}
5253

5354
if !reflect.DeepEqual(field, expected) {
@@ -78,28 +79,30 @@ func TestMergeStructs(t *testing.T) {
7879
t.Errorf(`TestMergeStructs - expected length of fields map to be 1 got %d`, len(builder.fields))
7980
}
8081

81-
fieldOne, ok := builder.fields["FieldOne"]
82-
if !ok {
82+
fieldOne := builder.GetField("FieldOne")
83+
if fieldOne == nil {
8384
t.Error(`TestMergeStructs - expected to have field "FieldOne"`)
8485
}
8586

8687
expectedOne := &fieldConfigImpl{
87-
typ: 0,
88-
tag: `keyOne:"valueOne"`,
88+
name: "FieldOne",
89+
typ: 0,
90+
tag: `keyOne:"valueOne"`,
8991
}
9092

9193
if !reflect.DeepEqual(fieldOne, expectedOne) {
9294
t.Errorf(`TestMergeStructs - expected field "FieldOne" to be %#v got %#v`, expectedOne, fieldOne)
9395
}
9496

95-
fieldTwo, ok := builder.fields["FieldTwo"]
96-
if !ok {
97+
fieldTwo := builder.GetField("FieldTwo")
98+
if fieldTwo == nil {
9799
t.Error(`TestMergeStructs - expected to have field "FieldTwo"`)
98100
}
99101

100102
expectedTwo := &fieldConfigImpl{
101-
typ: "",
102-
tag: `keyTwo:"valueTwo"`,
103+
name: "FieldTwo",
104+
typ: "",
105+
tag: `keyTwo:"valueTwo"`,
103106
}
104107

105108
if !reflect.DeepEqual(fieldTwo, expectedTwo) {
@@ -109,19 +112,20 @@ func TestMergeStructs(t *testing.T) {
109112

110113
func TestBuilderImpl_AddField(t *testing.T) {
111114
builder := &builderImpl{
112-
fields: map[string]*fieldConfigImpl{},
115+
fields: []*fieldConfigImpl{},
113116
}
114117

115118
builder.AddField("Field", 1, `key:"value"`)
116119

117-
field, ok := builder.fields["Field"]
118-
if !ok {
120+
field := builder.GetField("Field")
121+
if field == nil {
119122
t.Error(`TestBuilder_AddField - expected to have field "Field"`)
120123
}
121124

122125
expected := &fieldConfigImpl{
123-
typ: 1,
124-
tag: `key:"value"`,
126+
name: "Field",
127+
typ: 1,
128+
tag: `key:"value"`,
125129
}
126130

127131
if !reflect.DeepEqual(field, expected) {
@@ -131,50 +135,53 @@ func TestBuilderImpl_AddField(t *testing.T) {
131135

132136
func TestBuilderImpl_RemoveField(t *testing.T) {
133137
builder := &builderImpl{
134-
fields: map[string]*fieldConfigImpl{
135-
"Field": {
136-
tag: `key:"value"`,
137-
typ: 1,
138+
fields: []*fieldConfigImpl{
139+
{
140+
name: "Field",
141+
tag: `key:"value"`,
142+
typ: 1,
138143
},
139144
},
140145
}
141146

142147
builder.RemoveField("Field")
143148

144-
if _, ok := builder.fields["Field"]; ok {
149+
if ok := builder.HasField("Field"); ok {
145150
t.Error(`TestBuilder_RemoveField - expected not to have field "Field"`)
146151
}
147152
}
148153

149154
func TestBuilderImpl_HasField(t *testing.T) {
150155
builder := &builderImpl{
151-
fields: map[string]*fieldConfigImpl{},
156+
fields: []*fieldConfigImpl{},
152157
}
153158

154-
if builder.HasField("Field") {
159+
if ok := builder.HasField("Field"); ok {
155160
t.Error(`TestBuilder_HasField - expected not to have field "Field"`)
156161
}
157162

158163
builder = &builderImpl{
159-
fields: map[string]*fieldConfigImpl{
160-
"Field": {
161-
tag: `key:"value"`,
162-
typ: 1,
164+
fields: []*fieldConfigImpl{
165+
{
166+
name: "Field",
167+
tag: `key:"value"`,
168+
typ: 1,
163169
},
164170
},
165171
}
166172

167-
if !builder.HasField("Field") {
173+
if ok := builder.HasField("Field"); !ok {
168174
t.Error(`TestBuilder_HasField - expected to have field "Field"`)
169175
}
170176
}
171177

172178
func TestBuilderImpl_GetField(t *testing.T) {
173179
builder := &builderImpl{
174-
fields: map[string]*fieldConfigImpl{
175-
"Field": {
176-
tag: `key:"value"`,
177-
typ: 1,
180+
fields: []*fieldConfigImpl{
181+
{
182+
name: "Field",
183+
tag: `key:"value"`,
184+
typ: 1,
178185
},
179186
},
180187
}
@@ -187,8 +194,9 @@ func TestBuilderImpl_GetField(t *testing.T) {
187194
}
188195

189196
expected := &fieldConfigImpl{
190-
typ: 1,
191-
tag: `key:"value"`,
197+
name: "Field",
198+
typ: 1,
199+
tag: `key:"value"`,
192200
}
193201

194202
if !reflect.DeepEqual(field, expected) {

0 commit comments

Comments
 (0)