Skip to content

Commit e1beb3e

Browse files
committed
Datadictionary/Gen refactor (#140)
* name cleanup * gen fields refactor
1 parent c2bf2ba commit e1beb3e

File tree

4 files changed

+45
-49
lines changed

4 files changed

+45
-49
lines changed

datadictionary/datadictionary.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ type FieldDef struct {
127127
required bool
128128

129129
Parts []MessagePart
130-
ChildFields []*FieldDef
130+
Fields []*FieldDef
131131
requiredParts []MessagePart
132132
requiredFields []*FieldDef
133133
}
@@ -154,14 +154,14 @@ func NewGroupFieldDef(fieldType *FieldType, required bool, parts []MessagePart)
154154
}
155155

156156
if comp, ok := part.(Component); ok {
157-
field.ChildFields = append(field.ChildFields, comp.Fields()...)
157+
field.Fields = append(field.Fields, comp.Fields()...)
158158

159159
if comp.required {
160160
field.requiredFields = append(field.requiredFields, comp.requiredFields...)
161161
}
162162
} else {
163163
if child, ok := part.(*FieldDef); ok {
164-
field.ChildFields = append(field.ChildFields, child)
164+
field.Fields = append(field.Fields, child)
165165

166166
if child.required {
167167
field.requiredFields = append(field.requiredFields, child)
@@ -181,7 +181,7 @@ func (f FieldDef) Required() bool { return f.required }
181181

182182
//IsGroup is true if the field is a repeating group.
183183
func (f FieldDef) IsGroup() bool {
184-
return len(f.ChildFields) > 0
184+
return len(f.Fields) > 0
185185
}
186186

187187
//RequiredParts returns those parts that are required for this FieldDef. IsGroup
@@ -193,9 +193,9 @@ func (f FieldDef) RequiredParts() []MessagePart { return f.requiredParts }
193193
func (f FieldDef) RequiredFields() []*FieldDef { return f.requiredFields }
194194

195195
func (f FieldDef) childTags() []int {
196-
tags := make([]int, 0, len(f.ChildFields))
196+
tags := make([]int, 0, len(f.Fields))
197197

198-
for _, f := range f.ChildFields {
198+
for _, f := range f.Fields {
199199
tags = append(tags, f.Tag())
200200
for _, t := range f.childTags() {
201201
tags = append(tags, t)
@@ -208,7 +208,7 @@ func (f FieldDef) childTags() []int {
208208
func (f FieldDef) requiredChildTags() []int {
209209
var tags []int
210210

211-
for _, f := range f.ChildFields {
211+
for _, f := range f.Fields {
212212
if !f.Required() {
213213
continue
214214
}

gen/generate-fields/main.go

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,16 @@ import (
1010
"github.com/quickfixgo/quickfix/gen"
1111
)
1212

13-
var (
14-
fieldMap map[string]int
15-
fieldTypeMap map[string]*datadictionary.FieldType
16-
sortedTags []string
17-
)
18-
1913
func usage() {
2014
fmt.Fprintf(os.Stderr, "usage: generate-fields [flags] <path to data dictionary> ... \n")
2115
flag.PrintDefaults()
2216
os.Exit(2)
2317
}
2418

25-
func genEnums() error {
19+
func genEnums(fieldTypes []*datadictionary.FieldType) error {
2620
fileOut := "package enum\n"
2721

28-
for _, fieldName := range sortedTags {
29-
fieldType, _ := fieldTypeMap[fieldName]
22+
for _, fieldType := range fieldTypes {
3023
if len(fieldType.Enums) == 0 {
3124
continue
3225
}
@@ -39,27 +32,26 @@ func genEnums() error {
3932
}
4033
sort.Strings(sortedEnums)
4134

42-
fileOut += fmt.Sprintf("//Enum values for %v\n", fieldName)
35+
fileOut += fmt.Sprintf("//Enum values for %v\n", fieldType.Name())
4336
fileOut += "const(\n"
4437
for _, enumVal := range sortedEnums {
4538
enum, _ := fieldType.Enums[enumVal]
46-
fileOut += fmt.Sprintf("%v_%v = \"%v\"\n", fieldName, enum.Description, enum.Value)
39+
fileOut += fmt.Sprintf("%v_%v = \"%v\"\n", fieldType.Name(), enum.Description, enum.Value)
4740
}
4841
fileOut += ")\n"
4942
}
5043

5144
return gen.WriteFile("enum/enums.go", fileOut)
5245
}
5346

54-
func genFields() error {
47+
func genFields(fieldTypes []*datadictionary.FieldType) error {
5548
fileOut := "package field\n"
5649
fileOut += "import(\n"
5750
fileOut += "\"github.com/quickfixgo/quickfix\"\n"
5851
fileOut += "\"" + gen.GetImportPathRoot() + "/tag\"\n"
5952
fileOut += ")\n"
6053

61-
for _, tag := range sortedTags {
62-
field := fieldTypeMap[tag]
54+
for _, field := range fieldTypes {
6355

6456
baseType := ""
6557
goType := ""
@@ -140,7 +132,7 @@ func genFields() error {
140132
goType = "float64"
141133

142134
default:
143-
return fmt.Errorf("Unknown type '%v' for tag '%v'\n", field.Type, tag)
135+
return fmt.Errorf("Unknown type '%v' for tag '%v'\n", field.Type, field.Tag())
144136
}
145137

146138
fileOut += fmt.Sprintf("//%vField is a %v field\n", field.Name(), field.Type)
@@ -160,19 +152,25 @@ func genFields() error {
160152
return gen.WriteFile("field/fields.go", fileOut)
161153
}
162154

163-
func genTags() error {
155+
func genTags(fieldTypes []*datadictionary.FieldType) error {
164156
fileOut := "package tag\n"
165157
fileOut += "import(\"github.com/quickfixgo/quickfix\")\n"
166158

167159
fileOut += "const (\n"
168-
for _, tag := range sortedTags {
169-
fileOut += fmt.Sprintf("%v quickfix.Tag = %v\n", tag, fieldMap[tag])
160+
for _, f := range fieldTypes {
161+
fileOut += fmt.Sprintf("%v quickfix.Tag = %v\n", f.Name(), f.Tag())
170162
}
171163
fileOut += ")\n"
172164

173165
return gen.WriteFile("tag/tag_numbers.go", fileOut)
174166
}
175167

168+
type byFieldName []*datadictionary.FieldType
169+
170+
func (n byFieldName) Len() int { return len(n) }
171+
func (n byFieldName) Swap(i, j int) { n[i], n[j] = n[j], n[i] }
172+
func (n byFieldName) Less(i, j int) bool { return n[i].Name() < n[j].Name() }
173+
176174
func main() {
177175
flag.Usage = usage
178176
flag.Parse()
@@ -181,8 +179,7 @@ func main() {
181179
usage()
182180
}
183181

184-
fieldMap = make(map[string]int)
185-
fieldTypeMap = make(map[string]*datadictionary.FieldType)
182+
fieldTypeMap := make(map[string]*datadictionary.FieldType)
186183

187184
for _, dataDict := range flag.Args() {
188185
spec, err := datadictionary.Parse(dataDict)
@@ -193,8 +190,6 @@ func main() {
193190
}
194191

195192
for _, field := range spec.FieldTypeByTag {
196-
fieldMap[field.Name()] = field.Tag()
197-
198193
if oldField, ok := fieldTypeMap[field.Name()]; ok {
199194
//merge old enums with new
200195
if len(oldField.Enums) > 0 && field.Enums == nil {
@@ -223,17 +218,18 @@ func main() {
223218
}
224219
}
225220

226-
sortedTags = make([]string, len(fieldMap))
221+
fieldTypes := make([]*datadictionary.FieldType, len(fieldTypeMap))
227222
i := 0
228-
for f := range fieldMap {
229-
sortedTags[i] = f
223+
for _, fieldType := range fieldTypeMap {
224+
fieldTypes[i] = fieldType
230225
i++
231226
}
232-
sort.Strings(sortedTags)
227+
228+
sort.Sort(byFieldName(fieldTypes))
233229

234230
var h gen.ErrorHandler
235-
h.Handle(genTags())
236-
h.Handle(genFields())
237-
h.Handle(genEnums())
231+
h.Handle(genTags(fieldTypes))
232+
h.Handle(genFields(fieldTypes))
233+
h.Handle(genEnums(fieldTypes))
238234
os.Exit(h.ReturnCode)
239235
}

validation.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ func validateVisitGroupField(fieldDef *datadictionary.FieldDef, fieldStack []Tag
189189
for len(fieldStack) > 0 {
190190

191191
//start of repeating group
192-
if int(fieldStack[0].tag) == fieldDef.ChildFields[0].Tag() {
193-
childDefs = fieldDef.ChildFields
192+
if int(fieldStack[0].tag) == fieldDef.Fields[0].Tag() {
193+
childDefs = fieldDef.Fields
194194
groupCount++
195195
}
196196

validation_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ func TestValidate(t *testing.T) {
2525
tcInvalidMsgType(),
2626
tcValueIsIncorrect(),
2727
tcIncorrectDataFormatForValue(),
28-
tcTagSpecifiedOutOfRequiredOrder_Header(),
29-
tcTagSpecifiedOutOfRequiredOrder_Trailer(),
30-
tcTagSpecifiedOutOfRequiredOrder_Disabled_Header(),
31-
tcTagSpecifiedOutOfRequiredOrder_Disabled_Trailer(),
28+
tcTagSpecifiedOutOfRequiredOrderHeader(),
29+
tcTagSpecifiedOutOfRequiredOrderTrailer(),
30+
tcTagSpecifiedOutOfRequiredOrderDisabledHeader(),
31+
tcTagSpecifiedOutOfRequiredOrderDisabledTrailer(),
3232
tcTagAppearsMoreThanOnce(),
3333
tcFloatValidation(),
3434
tcTagNotDefinedForMessage(),
@@ -336,7 +336,7 @@ func tcIncorrectDataFormatForValue() validateTest {
336336
}
337337
}
338338

339-
func tcTagSpecifiedOutOfRequiredOrder_Header() validateTest {
339+
func tcTagSpecifiedOutOfRequiredOrderHeader() validateTest {
340340
dict, _ := datadictionary.Parse("spec/FIX40.xml")
341341
validator := &fixValidator{dict, defaultValidatorSettings}
342342

@@ -355,7 +355,7 @@ func tcTagSpecifiedOutOfRequiredOrder_Header() validateTest {
355355
}
356356
}
357357

358-
func tcTagSpecifiedOutOfRequiredOrder_Trailer() validateTest {
358+
func tcTagSpecifiedOutOfRequiredOrderTrailer() validateTest {
359359
dict, _ := datadictionary.Parse("spec/FIX40.xml")
360360
validator := &fixValidator{dict, defaultValidatorSettings}
361361

@@ -375,7 +375,7 @@ func tcTagSpecifiedOutOfRequiredOrder_Trailer() validateTest {
375375
}
376376
}
377377

378-
func tcTagSpecifiedOutOfRequiredOrder_Disabled_Header() validateTest {
378+
func tcTagSpecifiedOutOfRequiredOrderDisabledHeader() validateTest {
379379
dict, _ := datadictionary.Parse("spec/FIX40.xml")
380380
validator := &fixValidator{dict, defaultValidatorSettings}
381381
validator.settings.CheckFieldsOutOfOrder = false
@@ -394,7 +394,7 @@ func tcTagSpecifiedOutOfRequiredOrder_Disabled_Header() validateTest {
394394
}
395395
}
396396

397-
func tcTagSpecifiedOutOfRequiredOrder_Disabled_Trailer() validateTest {
397+
func tcTagSpecifiedOutOfRequiredOrderDisabledTrailer() validateTest {
398398
dict, _ := datadictionary.Parse("spec/FIX40.xml")
399399
validator := &fixValidator{dict, defaultValidatorSettings}
400400
validator.settings.CheckFieldsOutOfOrder = false
@@ -445,13 +445,13 @@ func TestValidateVisitField(t *testing.T) {
445445
fieldDef0 := &datadictionary.FieldDef{FieldType: fieldType0}
446446

447447
fieldType1 := datadictionary.NewFieldType("myfield", 2, "STRING")
448-
fieldDef1 := &datadictionary.FieldDef{FieldType: fieldType1, ChildFields: []*datadictionary.FieldDef{}}
448+
fieldDef1 := &datadictionary.FieldDef{FieldType: fieldType1, Fields: []*datadictionary.FieldDef{}}
449449

450450
fieldType2 := datadictionary.NewFieldType("myfield", 3, "STRING")
451-
fieldDef2 := &datadictionary.FieldDef{FieldType: fieldType2, ChildFields: []*datadictionary.FieldDef{}}
451+
fieldDef2 := &datadictionary.FieldDef{FieldType: fieldType2, Fields: []*datadictionary.FieldDef{}}
452452

453453
groupFieldType := datadictionary.NewFieldType("mygroupfield", 1, "INT")
454-
groupFieldDef := &datadictionary.FieldDef{FieldType: groupFieldType, ChildFields: []*datadictionary.FieldDef{fieldDef1, fieldDef2}}
454+
groupFieldDef := &datadictionary.FieldDef{FieldType: groupFieldType, Fields: []*datadictionary.FieldDef{fieldDef1, fieldDef2}}
455455

456456
var field TagValue
457457
field.init(Tag(11), []byte("value"))

0 commit comments

Comments
 (0)