Skip to content

Commit 82ce45c

Browse files
committed
extracts repeating group interface (#137)
1 parent 1b49a49 commit 82ce45c

13 files changed

+260
-223
lines changed

field.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,22 @@ type Field interface {
2929
FieldWriter
3030
FieldValueReader
3131
}
32+
33+
//FieldGroupWriter is an interface for writing a FieldGroup
34+
type FieldGroupWriter interface {
35+
Tag() Tag
36+
Write() TagValues
37+
}
38+
39+
//FieldGroupReader is an interface for reading a FieldGroup
40+
type FieldGroupReader interface {
41+
Tag() Tag
42+
Read(TagValues) (TagValues, error)
43+
}
44+
45+
//FieldGroup is the interface implemented by all typed Groups in a Message
46+
type FieldGroup interface {
47+
Tag() Tag
48+
Write() TagValues
49+
Read(TagValues) (TagValues, error)
50+
}

field_map.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
//FieldMap is a collection of fix fields that make up a fix message.
1010
type FieldMap struct {
11-
tagLookup map[Tag][]tagValue
11+
tagLookup map[Tag]TagValues
1212
tagOrder
1313
}
1414

@@ -68,7 +68,7 @@ func trailerFieldOrder(i, j Tag) bool {
6868
}
6969

7070
func (m *FieldMap) init(ordering tagOrder) {
71-
m.tagLookup = make(map[Tag][]tagValue)
71+
m.tagLookup = make(map[Tag]TagValues)
7272
m.tagOrder = ordering
7373
}
7474

@@ -100,7 +100,7 @@ func (m FieldMap) GetField(tag Tag, parser FieldValueReader) MessageRejectError
100100
return ConditionallyRequiredFieldMissing(tag)
101101
}
102102

103-
if err := parser.Read(tagValues[0].Value); err != nil {
103+
if err := parser.Read(tagValues[0].value); err != nil {
104104
return IncorrectDataFormatForValue(tag)
105105
}
106106

@@ -126,46 +126,46 @@ func (m FieldMap) GetString(tag Tag) (string, MessageRejectError) {
126126
}
127127

128128
//GetGroup is a Get function specific to Group Fields.
129-
func (m FieldMap) GetGroup(parser *RepeatingGroup) MessageRejectError {
130-
tagValues, ok := m.tagLookup[parser.Tag]
129+
func (m FieldMap) GetGroup(parser FieldGroupReader) MessageRejectError {
130+
tagValues, ok := m.tagLookup[parser.Tag()]
131131
if !ok {
132-
return ConditionallyRequiredFieldMissing(parser.Tag)
132+
return ConditionallyRequiredFieldMissing(parser.Tag())
133133
}
134134

135-
if _, err := parser.read(tagValues); err != nil {
135+
if _, err := parser.Read(tagValues); err != nil {
136136
if msgRejErr, ok := err.(MessageRejectError); ok {
137137
return msgRejErr
138138
}
139-
return IncorrectDataFormatForValue(parser.Tag)
139+
return IncorrectDataFormatForValue(parser.Tag())
140140
}
141141

142142
return nil
143143
}
144144

145145
//SetField sets the field with Tag tag
146146
func (m FieldMap) SetField(tag Tag, field FieldValueWriter) FieldMap {
147-
tValues := make([]tagValue, 1)
147+
tValues := make(TagValues, 1)
148148
tValues[0].init(tag, field.Write())
149149
m.tagLookup[tag] = tValues
150150
return m
151151
}
152152

153153
//Clear purges all fields from field map
154154
func (m *FieldMap) Clear() {
155-
m.tagLookup = make(map[Tag][]tagValue)
155+
m.tagLookup = make(map[Tag]TagValues)
156156
}
157157

158158
//Set is a setter for fields
159159
func (m FieldMap) Set(field FieldWriter) FieldMap {
160-
tValues := make([]tagValue, 1)
160+
tValues := make(TagValues, 1)
161161
tValues[0].init(field.Tag(), field.Write())
162162
m.tagLookup[field.Tag()] = tValues
163163
return m
164164
}
165165

166166
//SetGroup is a setter specific to group fields
167-
func (m FieldMap) SetGroup(field RepeatingGroup) FieldMap {
168-
m.tagLookup[field.Tag] = field.tagValues()
167+
func (m FieldMap) SetGroup(field FieldGroupWriter) FieldMap {
168+
m.tagLookup[field.Tag()] = field.Write()
169169
return m
170170
}
171171

@@ -195,7 +195,7 @@ func (m FieldMap) total() int {
195195
total := 0
196196
for _, fields := range m.tagLookup {
197197
for _, tv := range fields {
198-
switch tv.Tag {
198+
switch tv.tag {
199199
case tagCheckSum: //tag does not contribute to total
200200
default:
201201
total += tv.total()
@@ -210,7 +210,7 @@ func (m FieldMap) length() int {
210210
length := 0
211211
for _, fields := range m.tagLookup {
212212
for _, tv := range fields {
213-
switch tv.Tag {
213+
switch tv.tag {
214214
case tagBeginString, tagBodyLength, tagCheckSum: //tags do not contribute to length
215215
default:
216216
length += tv.length()

marshal.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func (e encoder) encodeValue(fixTag Tag, v reflect.Value, omitEmpty bool, defaul
6464
panic("repeating group must be a slice of type struct")
6565
}
6666

67-
repeatingGroup := RepeatingGroup{Tag: fixTag, GroupTemplate: buildGroupTemplate(elem)}
67+
repeatingGroup := NewRepeatingGroup(fixTag, buildGroupTemplate(elem))
6868

6969
for i := 0; i < v.Len(); i++ {
7070
group := repeatingGroup.Add()

marshal_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,14 @@ func TestMarshal_RepeatingGroups(t *testing.T) {
243243
continue
244244
}
245245

246-
groupField := quickfix.RepeatingGroup{Tag: test.groupTag, GroupTemplate: test.template}
247-
if err := fixMsg.Body.GetGroup(&groupField); err != nil {
246+
groupField := quickfix.NewRepeatingGroup(test.groupTag, test.template)
247+
if err := fixMsg.Body.GetGroup(groupField); err != nil {
248248
t.Error("Unexpected error", err)
249249
continue
250250
}
251251

252-
if len(groupField.Groups) != test.expectedGroupSize {
253-
t.Errorf("Expected group %v to have size %v, got %v", test.groupTag, test.expectedGroupSize, len(groupField.Groups))
252+
if groupField.Len() != test.expectedGroupSize {
253+
t.Errorf("Expected group %v to have size %v, got %v", test.groupTag, test.expectedGroupSize, groupField.Len())
254254
}
255255
}
256256
}

message.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type Message struct {
2323
bodyBytes []byte
2424

2525
//field bytes as they appear in the raw message
26-
fields []tagValue
26+
fields TagValues
2727
}
2828

2929
//Marshal marshals the message itself
@@ -61,7 +61,7 @@ func ParseMessage(rawMessage []byte) (Message, error) {
6161
fieldCount++
6262
}
6363
}
64-
msg.fields = make([]tagValue, fieldCount)
64+
msg.fields = make(TagValues, fieldCount)
6565

6666
fieldIndex := 0
6767
var err error
@@ -71,23 +71,23 @@ func ParseMessage(rawMessage []byte) (Message, error) {
7171
return msg, err
7272
}
7373

74-
msg.Header.tagLookup[msg.fields[fieldIndex].Tag] = msg.fields[fieldIndex : fieldIndex+1]
74+
msg.Header.tagLookup[msg.fields[fieldIndex].tag] = msg.fields[fieldIndex : fieldIndex+1]
7575
fieldIndex++
7676

7777
parsedFieldBytes := &msg.fields[fieldIndex]
7878
if rawMessage, err = extractSpecificField(parsedFieldBytes, tagBodyLength, rawMessage); err != nil {
7979
return msg, err
8080
}
8181

82-
msg.Header.tagLookup[parsedFieldBytes.Tag] = msg.fields[fieldIndex : fieldIndex+1]
82+
msg.Header.tagLookup[parsedFieldBytes.tag] = msg.fields[fieldIndex : fieldIndex+1]
8383
fieldIndex++
8484

8585
parsedFieldBytes = &msg.fields[fieldIndex]
8686
if rawMessage, err = extractSpecificField(parsedFieldBytes, tagMsgType, rawMessage); err != nil {
8787
return msg, err
8888
}
8989

90-
msg.Header.tagLookup[parsedFieldBytes.Tag] = msg.fields[fieldIndex : fieldIndex+1]
90+
msg.Header.tagLookup[parsedFieldBytes.tag] = msg.fields[fieldIndex : fieldIndex+1]
9191
fieldIndex++
9292

9393
trailerBytes := []byte{}
@@ -100,16 +100,16 @@ func ParseMessage(rawMessage []byte) (Message, error) {
100100
}
101101

102102
switch {
103-
case parsedFieldBytes.Tag.IsHeader():
104-
msg.Header.tagLookup[parsedFieldBytes.Tag] = msg.fields[fieldIndex : fieldIndex+1]
105-
case parsedFieldBytes.Tag.IsTrailer():
106-
msg.Trailer.tagLookup[parsedFieldBytes.Tag] = msg.fields[fieldIndex : fieldIndex+1]
103+
case parsedFieldBytes.tag.IsHeader():
104+
msg.Header.tagLookup[parsedFieldBytes.tag] = msg.fields[fieldIndex : fieldIndex+1]
105+
case parsedFieldBytes.tag.IsTrailer():
106+
msg.Trailer.tagLookup[parsedFieldBytes.tag] = msg.fields[fieldIndex : fieldIndex+1]
107107
default:
108108
foundBody = true
109109
trailerBytes = rawMessage
110-
msg.Body.tagLookup[parsedFieldBytes.Tag] = msg.fields[fieldIndex : fieldIndex+1]
110+
msg.Body.tagLookup[parsedFieldBytes.tag] = msg.fields[fieldIndex : fieldIndex+1]
111111
}
112-
if parsedFieldBytes.Tag == tagCheckSum {
112+
if parsedFieldBytes.tag == tagCheckSum {
113113
break
114114
}
115115

@@ -127,15 +127,18 @@ func ParseMessage(rawMessage []byte) (Message, error) {
127127

128128
length := 0
129129
for _, field := range msg.fields {
130-
switch field.Tag {
130+
switch field.tag {
131131
case tagBeginString, tagBodyLength, tagCheckSum: //tags do not contribute to length
132132
default:
133133
length += field.length()
134134
}
135135
}
136136

137137
var bodyLength FIXInt
138-
msg.Header.GetField(tagBodyLength, &bodyLength)
138+
if err := msg.Header.GetField(tagBodyLength, &bodyLength); err != nil {
139+
return msg, parseError{OrigError: err.Error()}
140+
}
141+
139142
if length != int(bodyLength) {
140143
return msg, parseError{OrigError: fmt.Sprintf("Incorrect Message Length, expected %d, got %d", bodyLength, length)}
141144
}
@@ -181,20 +184,20 @@ func (m Message) reverseRoute() Message {
181184
return reverseMsg
182185
}
183186

184-
func extractSpecificField(field *tagValue, expectedTag Tag, buffer []byte) (remBuffer []byte, err error) {
187+
func extractSpecificField(field *TagValue, expectedTag Tag, buffer []byte) (remBuffer []byte, err error) {
185188
remBuffer, err = extractField(field, buffer)
186189
switch {
187190
case err != nil:
188191
return
189-
case field.Tag != expectedTag:
190-
err = parseError{OrigError: fmt.Sprintf("extractSpecificField: Fields out of order, expected %d, got %d", expectedTag, field.Tag)}
192+
case field.tag != expectedTag:
193+
err = parseError{OrigError: fmt.Sprintf("extractSpecificField: Fields out of order, expected %d, got %d", expectedTag, field.tag)}
191194
return
192195
}
193196

194197
return
195198
}
196199

197-
func extractField(parsedFieldBytes *tagValue, buffer []byte) (remBytes []byte, err error) {
200+
func extractField(parsedFieldBytes *TagValue, buffer []byte) (remBytes []byte, err error) {
198201
endIndex := bytes.IndexByte(buffer, '\001')
199202
if endIndex == -1 {
200203
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}

0 commit comments

Comments
 (0)