Skip to content

Commit b446540

Browse files
committed
Merge pull request #93 from cbusbey/gen_cleanup
refactoring data dictionary pkg
2 parents e60eb01 + 4068cb9 commit b446540

File tree

4 files changed

+100
-49
lines changed

4 files changed

+100
-49
lines changed

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: 64 additions & 2 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

@@ -219,6 +241,46 @@ type MessageDef struct {
219241
Tags TagSet
220242
}
221243

244+
//NewMessageDef returns a pointer to an initialized MessageDef
245+
func NewMessageDef(name, msgType string, parts []MessagePart) *MessageDef {
246+
msg := MessageDef{
247+
Name: name,
248+
MsgType: msgType,
249+
Fields: make(map[int]*FieldDef),
250+
RequiredTags: make(TagSet),
251+
Tags: make(TagSet),
252+
Parts: parts,
253+
}
254+
255+
for _, part := range parts {
256+
if comp, ok := part.(Component); ok {
257+
for _, f := range comp.Fields() {
258+
msg.Fields[f.Tag] = f
259+
}
260+
} else if field, ok := part.(*FieldDef); ok {
261+
msg.Fields[field.Tag] = field
262+
} else {
263+
panic("Unknown Part")
264+
}
265+
}
266+
267+
for _, f := range msg.Fields {
268+
msg.Tags.Add(f.Tag)
269+
for _, t := range f.childTags() {
270+
msg.Tags.Add(t)
271+
}
272+
273+
if f.Required() {
274+
msg.RequiredTags.Add(f.Tag)
275+
for _, t := range f.requiredChildTags() {
276+
msg.RequiredTags.Add(t)
277+
}
278+
}
279+
}
280+
281+
return &msg
282+
}
283+
222284
//Parse loads and and build a datadictionary instance from an xml file.
223285
func Parse(path string) (*DataDictionary, error) {
224286
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+
}

datadictionary/xml_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,17 @@ func TestComponentMembers(t *testing.T) {
126126
Value *XMLComponentMember
127127
XMLNameLocal string
128128
Name string
129-
Required string
129+
Required bool
130130
}{
131-
{doc.Header.Members[0], "field", "BeginString", "Y"},
132-
{doc.Header.Members[1], "group", "NoHops", "N"},
133-
{doc.Header.Members[1].Members[0], "field", "HopCompID", "N"},
134-
{doc.Trailer.Members[0], "field", "SignatureLength", "N"},
135-
{doc.Messages[0].Members[0], "field", "TestReqID", "N"},
136-
{doc.Messages[1].Members[3], "component", "Instrument", "Y"},
137-
{doc.Messages[1].Members[4], "group", "NoRoutingIDs", "N"},
138-
{doc.Messages[1].Members[4].Members[0], "field", "RoutingType", "N"},
139-
{doc.Messages[1].Members[4].Members[1], "field", "RoutingID", "N"},
131+
{doc.Header.Members[0], "field", "BeginString", true},
132+
{doc.Header.Members[1], "group", "NoHops", false},
133+
{doc.Header.Members[1].Members[0], "field", "HopCompID", false},
134+
{doc.Trailer.Members[0], "field", "SignatureLength", false},
135+
{doc.Messages[0].Members[0], "field", "TestReqID", false},
136+
{doc.Messages[1].Members[3], "component", "Instrument", true},
137+
{doc.Messages[1].Members[4], "group", "NoRoutingIDs", false},
138+
{doc.Messages[1].Members[4].Members[0], "field", "RoutingType", false},
139+
{doc.Messages[1].Members[4].Members[1], "field", "RoutingID", false},
140140
}
141141

142142
for _, test := range tests {
@@ -148,8 +148,8 @@ func TestComponentMembers(t *testing.T) {
148148
t.Errorf("%v: Expected Name %v got %v", test.Name, test.Name, test.Value.Name)
149149
}
150150

151-
if test.Value.Required != test.Required {
152-
t.Errorf("%v: Expected Required %v got %v", test.Name, test.Required, test.Value.Required)
151+
if test.Value.isRequired() != test.Required {
152+
t.Errorf("%v: Expected Required %v got %v", test.Name, test.Required, test.Value.isRequired())
153153
}
154154
}
155155
}

0 commit comments

Comments
 (0)