Skip to content

Commit 908f03f

Browse files
author
Chris Busbey
committed
hiding where appropriate, more usable send method
1 parent f813455 commit 908f03f

File tree

9 files changed

+114
-104
lines changed

9 files changed

+114
-104
lines changed

field_map.go

Lines changed: 7 additions & 7 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][]tagValue
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][]tagValue)
7272
m.tagOrder = ordering
7373
}
7474

@@ -109,34 +109,34 @@ func (m FieldMap) GetGroup(parser *RepeatingGroup) MessageRejectError {
109109
return ConditionallyRequiredFieldMissing(parser.Tag)
110110
}
111111

112-
if _, err := parser.Read(tagValues); err != nil {
112+
if _, err := parser.read(tagValues); err != nil {
113113
return incorrectDataFormatForValue(parser.Tag)
114114
}
115115

116116
return nil
117117
}
118118

119119
func (m FieldMap) SetField(tag Tag, field FieldValueWriter) FieldMap {
120-
tValues := make([]TagValue, 1)
120+
tValues := make([]tagValue, 1)
121121
tValues[0].init(tag, field.Write())
122122
m.tagLookup[tag] = tValues
123123
return m
124124
}
125125

126126
//Clear purges all fields from field map
127127
func (m *FieldMap) Clear() {
128-
m.tagLookup = make(map[Tag][]TagValue)
128+
m.tagLookup = make(map[Tag][]tagValue)
129129
}
130130

131131
func (m FieldMap) Set(field FieldWriter) FieldMap {
132-
tValues := make([]TagValue, 1)
132+
tValues := make([]tagValue, 1)
133133
tValues[0].init(field.Tag(), field.Write())
134134
m.tagLookup[field.Tag()] = tValues
135135
return m
136136
}
137137

138138
func (m FieldMap) SetGroup(field RepeatingGroup) FieldMap {
139-
m.tagLookup[field.Tag] = field.TagValues()
139+
m.tagLookup[field.Tag] = field.tagValues()
140140
return m
141141
}
142142

message.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ type Message struct {
2222
bodyBytes []byte
2323

2424
//field bytes as they appear in the raw message
25-
fields []TagValue
25+
fields []tagValue
2626
}
2727

28+
//Message marshals itself
29+
func (m Message) Marshal() Message { return m }
30+
2831
//parseError is returned when bytes cannot be parsed as a FIX message.
2932
type parseError struct {
3033
OrigError string
@@ -57,7 +60,7 @@ func parseMessage(rawMessage []byte) (Message, error) {
5760
fieldCount++
5861
}
5962
}
60-
msg.fields = make([]TagValue, fieldCount)
63+
msg.fields = make([]tagValue, fieldCount)
6164

6265
fieldIndex := 0
6366
var err error
@@ -177,7 +180,7 @@ func (m Message) reverseRoute() Message {
177180
return reverseMsg
178181
}
179182

180-
func extractSpecificField(field *TagValue, expectedTag Tag, buffer []byte) (remBuffer []byte, err error) {
183+
func extractSpecificField(field *tagValue, expectedTag Tag, buffer []byte) (remBuffer []byte, err error) {
181184
remBuffer, err = extractField(field, buffer)
182185
switch {
183186
case err != nil:
@@ -190,7 +193,7 @@ func extractSpecificField(field *TagValue, expectedTag Tag, buffer []byte) (remB
190193
return
191194
}
192195

193-
func extractField(parsedFieldBytes *TagValue, buffer []byte) (remBytes []byte, err error) {
196+
func extractField(parsedFieldBytes *tagValue, buffer []byte) (remBytes []byte, err error) {
194197
endIndex := bytes.IndexByte(buffer, '\001')
195198
if endIndex == -1 {
196199
err = parseError{OrigError: "extractField: No Trailing Delim in " + string(buffer)}

registry.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@ import (
44
"fmt"
55
)
66

7-
//Send determines the session to send msgBuilder using header fields BeginString, TargetCompID, SenderCompID
8-
func Send(msg Message) (err error) {
7+
//Marshaler Marshals self to quickfix.Message type
8+
type Marshaler interface {
9+
Marshal() Message
10+
}
11+
12+
//Send determines the session to send Marshaler using header fields BeginString, TargetCompID, SenderCompID
13+
func Send(m Marshaler) (err error) {
14+
msg := m.Marshal()
915
var beginString FIXString
1016
if err := msg.Header.GetField(tagBeginString, &beginString); err != nil {
1117
return err
@@ -27,7 +33,8 @@ func Send(msg Message) (err error) {
2733
return SendToTarget(msg, sessionID)
2834
}
2935

30-
func SendToTarget(msg Message, sessionID SessionID) error {
36+
func SendToTarget(m Marshaler, sessionID SessionID) error {
37+
msg := m.Marshal()
3138
session, err := LookupSession(sessionID)
3239
if err != nil {
3340
return err

repeating_group.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@ type GroupItem interface {
1111
//Tag returns the tag identifying this GroupItem
1212
Tag() Tag
1313

14-
//Parameter to Read is TagValues. For most fields, only the first TagValue will be required.
15-
//The length of the slice extends from the TagValue mapped to the field to be read through the
14+
//Parameter to Read is tagValues. For most fields, only the first tagValue will be required.
15+
//The length of the slice extends from the tagValue mapped to the field to be read through the
1616
//following fields. This can be useful for GroupItems made up of repeating groups.
1717
//
18-
//The Read function returns the remaining TagValues not processed by the GroupItem. If there was a
18+
//The Read function returns the remaining tagValues not processed by the GroupItem. If there was a
1919
//problem reading the field, an error may be returned
20-
Read(TagValues) (TagValues, error)
20+
read(tagValues) (tagValues, error)
2121
}
2222

2323
type protoGroupElement struct {
2424
tag Tag
2525
}
2626

2727
func (t protoGroupElement) Tag() Tag { return t.tag }
28-
func (t protoGroupElement) Read(tv TagValues) (TagValues, error) {
28+
func (t protoGroupElement) read(tv tagValues) (tagValues, error) {
2929
if tv[0].Tag == t.tag {
3030
return tv[1:], nil
3131
}
@@ -59,10 +59,10 @@ func (f *RepeatingGroup) Add() Group {
5959
return g
6060
}
6161

62-
//TagValues returns TagValues for all Items in the repeating group ordered by
62+
//tagValues returns tagValues for all Items in the repeating group ordered by
6363
//Group sequence and Group template order
64-
func (f RepeatingGroup) TagValues() TagValues {
65-
tvs := make(TagValues, 1, 1)
64+
func (f RepeatingGroup) tagValues() tagValues {
65+
tvs := make(tagValues, 1, 1)
6666
tvs[0].init(f.Tag, []byte(strconv.Itoa(len(f.Groups))))
6767

6868
for _, group := range f.Groups {
@@ -116,7 +116,7 @@ func (f RepeatingGroup) isDelimiter(t Tag) bool {
116116
return t == f.GroupTemplate[0].Tag()
117117
}
118118

119-
func (f *RepeatingGroup) Read(tv TagValues) (TagValues, error) {
119+
func (f *RepeatingGroup) read(tv tagValues) (tagValues, error) {
120120
expectedGroupSize, err := atoi(tv[0].Value)
121121
if err != nil {
122122
return tv, err
@@ -137,7 +137,7 @@ func (f *RepeatingGroup) Read(tv TagValues) (TagValues, error) {
137137
}
138138

139139
tvRange := tv
140-
if tv, err = field.Read(tv); err != nil {
140+
if tv, err = field.read(tv); err != nil {
141141
return tv, err
142142
}
143143

repeating_group_test.go

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func TestRepeatingGroup_TagValues(t *testing.T) {
7676

7777
for _, test := range tests {
7878
tvbytes := []byte{}
79-
for _, tv := range test.f.TagValues() {
79+
for _, tv := range test.f.tagValues() {
8080
tvbytes = append(tvbytes, tv.bytes...)
8181
}
8282

@@ -89,26 +89,26 @@ func TestRepeatingGroup_TagValues(t *testing.T) {
8989
func TestRepeatingGroup_ReadError(t *testing.T) {
9090
singleFieldTemplate := GroupTemplate{GroupElement(1)}
9191
tests := []struct {
92-
tv TagValues
92+
tv tagValues
9393
expectedGroupNum int
9494
}{
9595
{
96-
TagValues{
97-
TagValue{Value: []byte("1")},
98-
TagValue{Tag: Tag(2), Value: []byte("not in template")},
99-
TagValue{Tag: Tag(1), Value: []byte("hello")},
96+
tagValues{
97+
tagValue{Value: []byte("1")},
98+
tagValue{Tag: Tag(2), Value: []byte("not in template")},
99+
tagValue{Tag: Tag(1), Value: []byte("hello")},
100100
}, 0},
101101
{
102-
TagValues{
103-
TagValue{Value: []byte("2")},
104-
TagValue{Tag: Tag(1), Value: []byte("hello")},
105-
TagValue{Tag: Tag(2), Value: []byte("not in template")},
106-
TagValue{Tag: Tag(1), Value: []byte("hello")},
102+
tagValues{
103+
tagValue{Value: []byte("2")},
104+
tagValue{Tag: Tag(1), Value: []byte("hello")},
105+
tagValue{Tag: Tag(2), Value: []byte("not in template")},
106+
tagValue{Tag: Tag(1), Value: []byte("hello")},
107107
}, 1}}
108108

109109
for _, s := range tests {
110110
f := RepeatingGroup{GroupTemplate: singleFieldTemplate}
111-
_, err := f.Read(s.tv)
111+
_, err := f.read(s.tv)
112112
if err == nil || len(f.Groups) != s.expectedGroupNum {
113113
t.Errorf("Should have raised an error because expected group number is wrong: %v instead of %v", len(f.Groups), s.expectedGroupNum)
114114
}
@@ -122,55 +122,55 @@ func TestRepeatingGroup_Read(t *testing.T) {
122122

123123
tests := []struct {
124124
groupTemplate GroupTemplate
125-
tv TagValues
126-
expectedGroupTvs []TagValues
125+
tv tagValues
126+
expectedGroupTvs []tagValues
127127
}{
128-
{singleFieldTemplate, TagValues{TagValue{Value: []byte("0")}},
129-
[]TagValues{}},
130-
{singleFieldTemplate, TagValues{TagValue{Value: []byte("1")}, TagValue{Tag: Tag(1), Value: []byte("hello")}},
131-
[]TagValues{TagValues{TagValue{Tag: Tag(1), Value: []byte("hello")}}}},
128+
{singleFieldTemplate, tagValues{tagValue{Value: []byte("0")}},
129+
[]tagValues{}},
130+
{singleFieldTemplate, tagValues{tagValue{Value: []byte("1")}, tagValue{Tag: Tag(1), Value: []byte("hello")}},
131+
[]tagValues{tagValues{tagValue{Tag: Tag(1), Value: []byte("hello")}}}},
132132
{singleFieldTemplate,
133-
TagValues{TagValue{Value: []byte("1")},
134-
TagValue{Tag: Tag(1), Value: []byte("hello")},
135-
TagValue{Tag: Tag(2), Value: []byte("not in group")}},
136-
[]TagValues{
137-
TagValues{TagValue{Tag: Tag(1), Value: []byte("hello")}}}},
133+
tagValues{tagValue{Value: []byte("1")},
134+
tagValue{Tag: Tag(1), Value: []byte("hello")},
135+
tagValue{Tag: Tag(2), Value: []byte("not in group")}},
136+
[]tagValues{
137+
tagValues{tagValue{Tag: Tag(1), Value: []byte("hello")}}}},
138138
{singleFieldTemplate,
139-
TagValues{TagValue{Value: []byte("2")},
140-
TagValue{Tag: Tag(1), Value: []byte("hello")},
141-
TagValue{Tag: Tag(1), Value: []byte("world")}},
142-
[]TagValues{
143-
TagValues{TagValue{Tag: Tag(1), Value: []byte("hello")}},
144-
TagValues{TagValue{Tag: Tag(1), Value: []byte("world")}},
139+
tagValues{tagValue{Value: []byte("2")},
140+
tagValue{Tag: Tag(1), Value: []byte("hello")},
141+
tagValue{Tag: Tag(1), Value: []byte("world")}},
142+
[]tagValues{
143+
tagValues{tagValue{Tag: Tag(1), Value: []byte("hello")}},
144+
tagValues{tagValue{Tag: Tag(1), Value: []byte("world")}},
145145
}},
146146
{multiFieldTemplate,
147-
TagValues{
148-
TagValue{Value: []byte("2")},
149-
TagValue{Tag: Tag(1), Value: []byte("hello")},
150-
TagValue{Tag: Tag(1), Value: []byte("goodbye")}, TagValue{Tag: Tag(2), Value: []byte("cruel")}, TagValue{Tag: Tag(3), Value: []byte("world")},
147+
tagValues{
148+
tagValue{Value: []byte("2")},
149+
tagValue{Tag: Tag(1), Value: []byte("hello")},
150+
tagValue{Tag: Tag(1), Value: []byte("goodbye")}, tagValue{Tag: Tag(2), Value: []byte("cruel")}, tagValue{Tag: Tag(3), Value: []byte("world")},
151151
},
152-
[]TagValues{
153-
TagValues{TagValue{Tag: Tag(1), Value: []byte("hello")}},
154-
TagValues{TagValue{Tag: Tag(1), Value: []byte("goodbye")}, TagValue{Tag: Tag(2), Value: []byte("cruel")}, TagValue{Tag: Tag(3), Value: []byte("world")}},
152+
[]tagValues{
153+
tagValues{tagValue{Tag: Tag(1), Value: []byte("hello")}},
154+
tagValues{tagValue{Tag: Tag(1), Value: []byte("goodbye")}, tagValue{Tag: Tag(2), Value: []byte("cruel")}, tagValue{Tag: Tag(3), Value: []byte("world")}},
155155
}},
156156
{multiFieldTemplate,
157-
TagValues{
158-
TagValue{Value: []byte("3")},
159-
TagValue{Tag: Tag(1), Value: []byte("hello")},
160-
TagValue{Tag: Tag(1), Value: []byte("goodbye")}, TagValue{Tag: Tag(2), Value: []byte("cruel")}, TagValue{Tag: Tag(3), Value: []byte("world")},
161-
TagValue{Tag: Tag(1), Value: []byte("another")},
157+
tagValues{
158+
tagValue{Value: []byte("3")},
159+
tagValue{Tag: Tag(1), Value: []byte("hello")},
160+
tagValue{Tag: Tag(1), Value: []byte("goodbye")}, tagValue{Tag: Tag(2), Value: []byte("cruel")}, tagValue{Tag: Tag(3), Value: []byte("world")},
161+
tagValue{Tag: Tag(1), Value: []byte("another")},
162162
},
163-
[]TagValues{
164-
TagValues{TagValue{Tag: Tag(1), Value: []byte("hello")}},
165-
TagValues{TagValue{Tag: Tag(1), Value: []byte("goodbye")}, TagValue{Tag: Tag(2), Value: []byte("cruel")}, TagValue{Tag: Tag(3), Value: []byte("world")}},
166-
TagValues{TagValue{Tag: Tag(1), Value: []byte("another")}},
163+
[]tagValues{
164+
tagValues{tagValue{Tag: Tag(1), Value: []byte("hello")}},
165+
tagValues{tagValue{Tag: Tag(1), Value: []byte("goodbye")}, tagValue{Tag: Tag(2), Value: []byte("cruel")}, tagValue{Tag: Tag(3), Value: []byte("world")}},
166+
tagValues{tagValue{Tag: Tag(1), Value: []byte("another")}},
167167
}},
168168
}
169169

170170
for _, test := range tests {
171171
f := RepeatingGroup{GroupTemplate: test.groupTemplate}
172172

173-
_, err := f.Read(test.tv)
173+
_, err := f.read(test.tv)
174174
if err != nil {
175175
t.Error(err)
176176
}

tag_value.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import (
66
"strconv"
77
)
88

9-
//TagValue is a low-level FIX field abstraction
10-
type TagValue struct {
9+
//tagValue is a low-level FIX field abstraction
10+
type tagValue struct {
1111
Tag
1212
Value []byte
1313
bytes []byte
1414
}
1515

16-
//TagValues is a slice of TagValue
17-
type TagValues []TagValue
16+
//tagValues is a slice of tagValue
17+
type tagValues []tagValue
1818

19-
func (tv *TagValue) init(tag Tag, value []byte) {
19+
func (tv *tagValue) init(tag Tag, value []byte) {
2020
var buf bytes.Buffer
2121
buf.WriteString(strconv.Itoa(int(tag)))
2222
buf.WriteString("=")
@@ -28,18 +28,18 @@ func (tv *TagValue) init(tag Tag, value []byte) {
2828
tv.Value = value
2929
}
3030

31-
func (tv *TagValue) parse(rawFieldBytes []byte) (err error) {
31+
func (tv *tagValue) parse(rawFieldBytes []byte) (err error) {
3232
sepIndex := bytes.IndexByte(rawFieldBytes, '=')
3333

3434
if sepIndex == -1 {
35-
err = fmt.Errorf("TagValue.Parse: No '=' in '%s'", rawFieldBytes)
35+
err = fmt.Errorf("tagValue.Parse: No '=' in '%s'", rawFieldBytes)
3636
return
3737
}
3838

3939
parsedTag, err := atoi(rawFieldBytes[:sepIndex])
4040

4141
if err != nil {
42-
err = fmt.Errorf("TagValue.Parse: %s", err.Error())
42+
err = fmt.Errorf("tagValue.Parse: %s", err.Error())
4343
return
4444
}
4545

@@ -50,11 +50,11 @@ func (tv *TagValue) parse(rawFieldBytes []byte) (err error) {
5050
return
5151
}
5252

53-
func (tv TagValue) String() string {
53+
func (tv tagValue) String() string {
5454
return string(tv.bytes)
5555
}
5656

57-
func (tv TagValue) total() int {
57+
func (tv tagValue) total() int {
5858
total := 0
5959

6060
for _, b := range []byte(tv.bytes) {
@@ -64,6 +64,6 @@ func (tv TagValue) total() int {
6464
return total
6565
}
6666

67-
func (tv TagValue) length() int {
67+
func (tv tagValue) length() int {
6868
return len(tv.bytes)
6969
}

0 commit comments

Comments
 (0)