@@ -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-
1913func 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+
176174func 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}
0 commit comments