Skip to content

Commit b431f36

Browse files
committed
Merge branch 'master' of github.com:quickfixgo/quickfix
2 parents 172ce0b + 7c1e264 commit b431f36

File tree

1,109 files changed

+11079
-91
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,109 files changed

+11079
-91
lines changed

_gen/generate-messages/main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ func genMessage(msg *datadictionary.MessageDef) string {
8888
return fileOut
8989
}
9090

91+
func genMessageNew(msg *datadictionary.MessageDef) string {
92+
writer := new(bytes.Buffer)
93+
gen.WriteNewMessage(writer, *msg)
94+
return writer.String()
95+
}
96+
9197
func genMessageSetters(msg *datadictionary.MessageDef) string {
9298
writer := new(bytes.Buffer)
9399
if err := gen.WriteFieldSetters(writer, "Message", msg.Parts); err != nil {
@@ -142,6 +148,7 @@ func genMessagePkg(msg *datadictionary.MessageDef) {
142148
fileOut += writer.String()
143149
fileOut += genGroupDeclarations(msg)
144150
fileOut += genMessage(msg)
151+
fileOut += genMessageNew(msg)
145152
fileOut += genMessageSetters(msg)
146153
fileOut += genMessageRoute(msg)
147154

_gen/helpers.go

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var genTemplate *template.Template
1515

1616
func init() {
1717
tmplFuncs := template.FuncMap{
18-
"fixFieldTypeToGoType": FixFieldTypeToGoType,
18+
"fixFieldTypeToGoType": fixFieldTypeToGoType,
1919
"toLower": strings.ToLower,
2020
"partAsGoType": partAsGoType,
2121
}
@@ -33,19 +33,48 @@ import ({{ range .}}
3333
)
3434
{{ end}}
3535
36-
{{/* template writes out a constructor for message/component/group */}}
37-
{{define "new"}}
38-
func New(
39-
{{- range $index, $field := .RequiredParts -}}
40-
{{if $index}},{{end}}{{toLower $field.Name}} {{partAsGoType $field}}
41-
{{- end }}) *{{.Name}} {
36+
37+
{{/* template writes out a constructor for component type */}}
38+
{{define "newcomponent"}}
39+
//New returns an initialized {{.Name}} instance
40+
func New({{ template "parts_args" .RequiredParts}}) *{{.Name}} {
4241
var m {{.Name}}
43-
{{- range .RequiredFields}}
44-
m.Set{{.Name}}({{toLower .Name}})
45-
{{- end}}
42+
{{- template "set_parts" .RequiredParts}}
4643
return &m
4744
}
48-
{{end}}
45+
{{end}}
46+
47+
{{/* template writes out a constructor for message type */}}
48+
{{define "newmessage"}}
49+
//New returns an initialized {{.Name}} instance
50+
func New({{ template "parts_args" .RequiredParts}}) *Message {
51+
var m Message
52+
{{- template "set_parts" .RequiredParts}}
53+
return &m
54+
}
55+
{{end}}
56+
57+
{{/* template writes out a constructor for group */}}
58+
{{define "newgroup"}}
59+
//New{{.Name}} returns an initialized {{.Name}} instance
60+
func New{{.Name}}({{ template "parts_args" .RequiredParts}}) *{{.Name}} {
61+
var m {{.Name}}
62+
{{- template "set_parts" .RequiredParts}}
63+
return &m
64+
}
65+
{{end}}
66+
67+
{{/* template writes out a comma delimited list of parts to be used as an argument list*/}}
68+
{{define "parts_args"}}
69+
{{- range $index, $field := . }}{{if $index}},{{end}}{{toLower $field.Name}} {{partAsGoType $field}}{{ end }}
70+
{{- end }}
71+
72+
{{/* template sets parts*/}}
73+
{{define "set_parts"}}
74+
{{- range .}}
75+
m.Set{{.Name}}({{toLower .Name}})
76+
{{- end}}
77+
{{- end}}
4978
5079
{{define "fieldSetter"}}
5180
func (m *{{.Receiver}}) Set{{.Name}}(v {{ if .IsGroup}}[]{{.Name}}{{else}}{{fixFieldTypeToGoType .Type}}{{end}}) {
@@ -62,7 +91,11 @@ func (m *{{.Receiver}}) Set{{.Name}}(v {{toLower .Name}}.{{ .Name}}) {
6291
}
6392

6493
func WriteNewComponent(writer io.Writer, comp datadictionary.ComponentType) error {
65-
return genTemplate.ExecuteTemplate(writer, "new", comp)
94+
return genTemplate.ExecuteTemplate(writer, "newcomponent", comp)
95+
}
96+
97+
func WriteNewMessage(writer io.Writer, msg datadictionary.MessageDef) error {
98+
return genTemplate.ExecuteTemplate(writer, "newmessage", msg)
6699
}
67100

68101
//WriteFieldSetters generates setters appropriate for Messages, Components or Repeating Groups
@@ -148,7 +181,7 @@ func collectRequiredImports(imports map[string]interface{}, pkg string, part dat
148181
panic("Expected FieldDef")
149182
}
150183

151-
if fieldType := FixFieldTypeToGoType(field.Type); fieldType == "time.Time" {
184+
if fieldType := fixFieldTypeToGoType(field.Type); fieldType == "time.Time" {
152185
imports["time"] = nil
153186
}
154187

@@ -168,10 +201,13 @@ func WriteGroupDeclaration(fixSpecMajor, fixSpecMinor int, field *datadictionary
168201
fileOut += fmt.Sprintf("//%v is a repeating group in %v\n", field.Name(), parent)
169202
fileOut += fmt.Sprintf("type %v struct {\n", field.Name())
170203
fileOut += WriteFieldDeclarations(fixSpecMajor, fixSpecMinor, field.Parts, field.Name())
171-
172204
fileOut += "}\n"
173205

174206
writer := new(bytes.Buffer)
207+
if err := genTemplate.ExecuteTemplate(writer, "newgroup", *field); err != nil {
208+
panic(err)
209+
}
210+
175211
if err := WriteFieldSetters(writer, field.Name(), field.Parts); err != nil {
176212
panic(err)
177213
}
@@ -209,7 +245,7 @@ func writeFieldDeclaration(fixSpecMajor int, fixSpecMinor int, part datadictiona
209245
return
210246
}
211247

212-
goType := FixFieldTypeToGoType(field.Type)
248+
goType := fixFieldTypeToGoType(field.Type)
213249
fixTags := strconv.Itoa(field.Tag)
214250
if field.Tag == 8 {
215251
if fixSpecMajor == 4 {
@@ -242,10 +278,10 @@ func partAsGoType(part datadictionary.MessagePart) string {
242278
return fmt.Sprintf("[]%v", field.Name())
243279
}
244280

245-
return FixFieldTypeToGoType(field.Type)
281+
return fixFieldTypeToGoType(field.Type)
246282
}
247283

248-
func FixFieldTypeToGoType(fieldType string) string {
284+
func fixFieldTypeToGoType(fieldType string) string {
249285
switch fieldType {
250286
case "MULTIPLESTRINGVALUE", "MULTIPLEVALUESTRING":
251287
fallthrough

datadictionary/build.go

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (b builder) buildComponentType(xmlComponent *XMLComponent) (*ComponentType,
6868
var parts []MessagePart
6969

7070
for _, member := range xmlComponent.Members {
71-
if member.XMLName.Local == "component" {
71+
if member.isComponent() {
7272
var childComponentType *ComponentType
7373
var err error
7474
if childComponentType, err = b.findOrBuildComponentType(member); err != nil {
@@ -77,7 +77,7 @@ func (b builder) buildComponentType(xmlComponent *XMLComponent) (*ComponentType,
7777

7878
childComponent := Component{
7979
ComponentType: childComponentType,
80-
required: (member.Required == "Y"),
80+
required: member.isRequired(),
8181
}
8282

8383
parts = append(parts, childComponent)
@@ -126,57 +126,34 @@ func (b builder) buildMessageDefs() error {
126126
}
127127

128128
func (b builder) buildMessageDef(xmlMessage *XMLComponent) (*MessageDef, error) {
129-
m := &MessageDef{Name: xmlMessage.Name, MsgType: xmlMessage.MsgType}
130-
m.Fields = make(map[int]*FieldDef)
131-
m.RequiredTags = make(TagSet)
132-
m.Tags = make(TagSet)
133-
129+
var parts []MessagePart
134130
for _, member := range xmlMessage.Members {
135-
if member.XMLName.Local == "component" {
131+
if member.isComponent() {
136132
var ok bool
137133
var comp *ComponentType
138134
if comp, ok = b.dict.ComponentTypes[member.Name]; !ok {
139135
return nil, newUnknownComponent(member.Name)
140136
}
141137

142-
for _, f := range comp.Fields() {
143-
m.Fields[f.Tag] = f
144-
}
145-
146-
m.Parts = append(m.Parts, Component{ComponentType: comp, required: (member.Required == "Y")})
138+
parts = append(parts, Component{ComponentType: comp, required: member.isRequired()})
147139
} else {
148140
var field *FieldDef
149141
var err error
150142
if field, err = b.buildFieldDef(member); err != nil {
151143
return nil, err
152144
}
153-
m.Fields[field.Tag] = field
154-
m.Parts = append(m.Parts, field)
155-
}
156-
}
157-
158-
for _, f := range m.Fields {
159-
m.Tags.Add(f.Tag)
160-
for _, t := range f.childTags() {
161-
m.Tags.Add(t)
162-
}
163-
164-
if f.Required() {
165-
m.RequiredTags.Add(f.Tag)
166-
for _, t := range f.requiredChildTags() {
167-
m.RequiredTags.Add(t)
168-
}
145+
parts = append(parts, field)
169146
}
170147
}
171148

172-
return m, nil
149+
return NewMessageDef(xmlMessage.Name, xmlMessage.MsgType, parts), nil
173150
}
174151

175152
func (b builder) buildGroupFieldDef(xmlField *XMLComponentMember, groupFieldType *FieldType) (*FieldDef, error) {
176153
var parts []MessagePart
177154

178155
for _, member := range xmlField.Members {
179-
if member.XMLName.Local == "component" {
156+
if member.isComponent() {
180157
var err error
181158
var compType *ComponentType
182159
if compType, err = b.findOrBuildComponentType(member); err != nil {
@@ -185,7 +162,7 @@ func (b builder) buildGroupFieldDef(xmlField *XMLComponentMember, groupFieldType
185162

186163
comp := Component{
187164
ComponentType: compType,
188-
required: (member.Required == "Y"),
165+
required: member.isRequired(),
189166
}
190167

191168
parts = append(parts, comp)
@@ -199,7 +176,7 @@ func (b builder) buildGroupFieldDef(xmlField *XMLComponentMember, groupFieldType
199176
}
200177
}
201178

202-
return NewGroupFieldDef(groupFieldType, (xmlField.Required == "Y"), parts), nil
179+
return NewGroupFieldDef(groupFieldType, xmlField.isRequired(), parts), nil
203180
}
204181

205182
func (b builder) buildFieldDef(xmlField *XMLComponentMember) (*FieldDef, error) {
@@ -210,12 +187,12 @@ func (b builder) buildFieldDef(xmlField *XMLComponentMember) (*FieldDef, error)
210187
return nil, newUnknownField(xmlField.Name)
211188
}
212189

213-
if xmlField.XMLName.Local == "group" {
190+
if xmlField.isGroup() {
214191
f, err := b.buildGroupFieldDef(xmlField, fieldType)
215192
return f, err
216193
}
217194

218-
return NewFieldDef(fieldType, (xmlField.Required == "Y")), nil
195+
return NewFieldDef(fieldType, xmlField.isRequired()), nil
219196
}
220197

221198
func (b builder) buildFieldTypes() {

datadictionary/datadictionary.go

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,10 @@ type FieldDef struct {
106106
*FieldType
107107
required bool
108108

109-
Parts []MessagePart
110-
ChildFields []*FieldDef
109+
Parts []MessagePart
110+
ChildFields []*FieldDef
111+
requiredParts []MessagePart
112+
requiredFields []*FieldDef
111113
}
112114

113115
//NewFieldDef returns an initialized FieldDef
@@ -127,11 +129,23 @@ func NewGroupFieldDef(fieldType *FieldType, required bool, parts []MessagePart)
127129
}
128130

129131
for _, part := range parts {
132+
if part.Required() {
133+
field.requiredParts = append(field.requiredParts, part)
134+
}
135+
130136
if comp, ok := part.(Component); ok {
131137
field.ChildFields = append(field.ChildFields, comp.Fields()...)
138+
139+
if comp.required {
140+
field.requiredFields = append(field.requiredFields, comp.requiredFields...)
141+
}
132142
} else {
133143
if child, ok := part.(*FieldDef); ok {
134144
field.ChildFields = append(field.ChildFields, child)
145+
146+
if child.required {
147+
field.requiredFields = append(field.requiredFields, child)
148+
}
135149
} else {
136150
panic("unknown part")
137151
}
@@ -150,6 +164,14 @@ func (f FieldDef) IsGroup() bool {
150164
return len(f.ChildFields) > 0
151165
}
152166

167+
//RequiredParts returns those parts that are required for this FieldDef. IsGroup
168+
//must return true
169+
func (f FieldDef) RequiredParts() []MessagePart { return f.requiredParts }
170+
171+
//RequiredFields returns those fields that are required for this FieldDef. IsGroup
172+
//must return true
173+
func (f FieldDef) RequiredFields() []*FieldDef { return f.requiredFields }
174+
153175
func (f FieldDef) childTags() []int {
154176
tags := make([]int, 0, len(f.ChildFields))
155177

@@ -213,12 +235,60 @@ type MessageDef struct {
213235
Fields map[int]*FieldDef
214236
//Parts are the MessageParts of contained in this MessageDef in declaration
215237
//order
216-
Parts []MessagePart
238+
Parts []MessagePart
239+
requiredParts []MessagePart
217240

218241
RequiredTags TagSet
219242
Tags TagSet
220243
}
221244

245+
//RequiredParts returns those parts that are required for this Message
246+
func (m MessageDef) RequiredParts() []MessagePart { return m.requiredParts }
247+
248+
//NewMessageDef returns a pointer to an initialized MessageDef
249+
func NewMessageDef(name, msgType string, parts []MessagePart) *MessageDef {
250+
msg := MessageDef{
251+
Name: name,
252+
MsgType: msgType,
253+
Fields: make(map[int]*FieldDef),
254+
RequiredTags: make(TagSet),
255+
Tags: make(TagSet),
256+
Parts: parts,
257+
}
258+
259+
for _, part := range parts {
260+
if part.Required() {
261+
msg.requiredParts = append(msg.requiredParts, part)
262+
}
263+
264+
if comp, ok := part.(Component); ok {
265+
for _, f := range comp.Fields() {
266+
msg.Fields[f.Tag] = f
267+
}
268+
} else if field, ok := part.(*FieldDef); ok {
269+
msg.Fields[field.Tag] = field
270+
} else {
271+
panic("Unknown Part")
272+
}
273+
}
274+
275+
for _, f := range msg.Fields {
276+
msg.Tags.Add(f.Tag)
277+
for _, t := range f.childTags() {
278+
msg.Tags.Add(t)
279+
}
280+
281+
if f.Required() {
282+
msg.RequiredTags.Add(f.Tag)
283+
for _, t := range f.requiredChildTags() {
284+
msg.RequiredTags.Add(t)
285+
}
286+
}
287+
}
288+
289+
return &msg
290+
}
291+
222292
//Parse loads and and build a datadictionary instance from an xml file.
223293
func Parse(path string) (*DataDictionary, error) {
224294
var xmlFile *os.File

datadictionary/xml.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,15 @@ type XMLComponentMember struct {
4949

5050
Members []*XMLComponentMember `xml:",any"`
5151
}
52+
53+
func (member XMLComponentMember) isComponent() bool {
54+
return member.XMLName.Local == "component"
55+
}
56+
57+
func (member XMLComponentMember) isGroup() bool {
58+
return member.XMLName.Local == "group"
59+
}
60+
61+
func (member XMLComponentMember) isRequired() bool {
62+
return member.Required == "Y"
63+
}

0 commit comments

Comments
 (0)