diff --git a/errors.go b/errors.go index b91a22d50..40523b695 100644 --- a/errors.go +++ b/errors.go @@ -56,8 +56,8 @@ func NewBusinessMessageRejectError(err string, rejectReason int, refTagID *Tag) return messageRejectError{text: err, rejectReason: rejectReason, refTagID: refTagID, isBusinessReject: true} } -//incorrectDataFormatForValue returns an error indicating a field that cannot be parsed as the type required. -func incorrectDataFormatForValue(tag Tag) MessageRejectError { +//IncorrectDataFormatForValue returns an error indicating a field that cannot be parsed as the type required. +func IncorrectDataFormatForValue(tag Tag) MessageRejectError { return NewMessageRejectError("Incorrect data format for value", rejectReasonIncorrectDataFormatForValue, &tag) } @@ -87,18 +87,18 @@ func valueIsIncorrectNoTag() MessageRejectError { return NewMessageRejectError("Value is incorrect (out of range) for this tag", rejectReasonValueIsIncorrect, nil) } -//invalidMessageType returns an error to indicate an invalid message type -func invalidMessageType() MessageRejectError { +//InvalidMessageType returns an error to indicate an invalid message type +func InvalidMessageType() MessageRejectError { return NewMessageRejectError("Invalid MsgType", rejectReasonInvalidMsgType, nil) } -//unsupportedMessageType returns an error to indicate an unhandled message. -func unsupportedMessageType() MessageRejectError { +//UnsupportedMessageType returns an error to indicate an unhandled message. +func UnsupportedMessageType() MessageRejectError { return NewBusinessMessageRejectError("Unsupported Message Type", rejectReasonUnsupportedMessageType, nil) } -//tagNotDefinedForThisMessageType returns an error for an invalid tag appearing in a message. -func tagNotDefinedForThisMessageType(tag Tag) MessageRejectError { +//TagNotDefinedForThisMessageType returns an error for an invalid tag appearing in a message. +func TagNotDefinedForThisMessageType(tag Tag) MessageRejectError { return NewMessageRejectError("Tag not defined for this message type", rejectReasonTagNotDefinedForThisMessageType, &tag) } @@ -107,8 +107,8 @@ func tagAppearsMoreThanOnce(tag Tag) MessageRejectError { return NewMessageRejectError("Tag appears more than once", rejectReasonTagAppearsMoreThanOnce, &tag) } -//requiredTagMissing returns a validation error when a required field cannot be found in a message. -func requiredTagMissing(tag Tag) MessageRejectError { +//RequiredTagMissing returns a validation error when a required field cannot be found in a message. +func RequiredTagMissing(tag Tag) MessageRejectError { return NewMessageRejectError("Required tag missing", rejectReasonRequiredTagMissing, &tag) } @@ -122,13 +122,13 @@ func tagSpecifiedOutOfRequiredOrder(tag Tag) MessageRejectError { return NewMessageRejectError("Tag specified out of required order", rejectReasonTagSpecifiedOutOfRequiredOrder, &tag) } -//tagSpecifiedWithoutAValue returns a validation error for when a field has no value. -func tagSpecifiedWithoutAValue(tag Tag) MessageRejectError { +//TagSpecifiedWithoutAValue returns a validation error for when a field has no value. +func TagSpecifiedWithoutAValue(tag Tag) MessageRejectError { return NewMessageRejectError("Tag specified without a value", rejectReasonTagSpecifiedWithoutAValue, &tag) } -//invalidTagNumber returns a validation error for messages with invalid tags. -func invalidTagNumber(tag Tag) MessageRejectError { +//InvalidTagNumber returns a validation error for messages with invalid tags. +func InvalidTagNumber(tag Tag) MessageRejectError { return NewMessageRejectError("Invalid tag number", rejectReasonInvalidTagNumber, &tag) } diff --git a/field_map.go b/field_map.go index d7f3cc3e7..af3244a0e 100644 --- a/field_map.go +++ b/field_map.go @@ -72,6 +72,7 @@ func (m *FieldMap) init(ordering tagOrder) { m.tagOrder = ordering } +//Tags returns all of the Field Tags in this FieldMap func (m FieldMap) Tags() []Tag { tags := make([]Tag, 0, len(m.tagLookup)) for t := range m.tagLookup { @@ -81,15 +82,18 @@ func (m FieldMap) Tags() []Tag { return tags } +//Get parses out a field in this FieldMap. Returned reject may indicate the field is not present, or the field value is invalid. func (m FieldMap) Get(parser Field) MessageRejectError { return m.GetField(parser.Tag(), parser) } +//Has returns true if the Tag is present in this FieldMap func (m FieldMap) Has(tag Tag) bool { _, ok := m.tagLookup[tag] return ok } +//GetField parses of a field with Tag tag. Returned reject may indicate the field is not present, or the field value is invalid. func (m FieldMap) GetField(tag Tag, parser FieldValueReader) MessageRejectError { tagValues, ok := m.tagLookup[tag] if !ok { @@ -97,13 +101,13 @@ func (m FieldMap) GetField(tag Tag, parser FieldValueReader) MessageRejectError } if err := parser.Read(tagValues[0].Value); err != nil { - return incorrectDataFormatForValue(tag) + return IncorrectDataFormatForValue(tag) } return nil } -// GetInt is a GetField wrapper for int fields +//GetInt is a GetField wrapper for int fields func (m FieldMap) GetInt(tag Tag) (int, MessageRejectError) { var val FIXInt if err := m.GetField(tag, &val); err != nil { @@ -112,7 +116,7 @@ func (m FieldMap) GetInt(tag Tag) (int, MessageRejectError) { return int(val), nil } -// GetString is a GetField wrapper for string fields +//GetString is a GetField wrapper for string fields func (m FieldMap) GetString(tag Tag) (string, MessageRejectError) { var val FIXString if err := m.GetField(tag, &val); err != nil { @@ -121,6 +125,7 @@ func (m FieldMap) GetString(tag Tag) (string, MessageRejectError) { return string(val), nil } +//GetGroup is a Get function specific to Group Fields. func (m FieldMap) GetGroup(parser *RepeatingGroup) MessageRejectError { tagValues, ok := m.tagLookup[parser.Tag] if !ok { @@ -131,12 +136,13 @@ func (m FieldMap) GetGroup(parser *RepeatingGroup) MessageRejectError { if msgRejErr, ok := err.(MessageRejectError); ok { return msgRejErr } - return incorrectDataFormatForValue(parser.Tag) + return IncorrectDataFormatForValue(parser.Tag) } return nil } +//SetField sets the field with Tag tag func (m FieldMap) SetField(tag Tag, field FieldValueWriter) FieldMap { tValues := make([]tagValue, 1) tValues[0].init(tag, field.Write()) @@ -149,6 +155,7 @@ func (m *FieldMap) Clear() { m.tagLookup = make(map[Tag][]tagValue) } +//Set is a setter for fields func (m FieldMap) Set(field FieldWriter) FieldMap { tValues := make([]tagValue, 1) tValues[0].init(field.Tag(), field.Write()) @@ -156,6 +163,7 @@ func (m FieldMap) Set(field FieldWriter) FieldMap { return m } +//SetGroup is a setter specific to group fields func (m FieldMap) SetGroup(field RepeatingGroup) FieldMap { m.tagLookup[field.Tag] = field.tagValues() return m diff --git a/in_session.go b/in_session.go index ee32c3196..09be82741 100644 --- a/in_session.go +++ b/in_session.go @@ -109,14 +109,14 @@ func (state inSession) handleResendRequest(session *session, msg Message) (nextS var err error var beginSeqNoField FIXInt if err = msg.Body.GetField(tagBeginSeqNo, &beginSeqNoField); err != nil { - return state.processReject(session, msg, requiredTagMissing(tagBeginSeqNo)) + return state.processReject(session, msg, RequiredTagMissing(tagBeginSeqNo)) } beginSeqNo := beginSeqNoField var endSeqNoField FIXInt if err = msg.Body.GetField(tagEndSeqNo, &endSeqNoField); err != nil { - return state.processReject(session, msg, requiredTagMissing(tagEndSeqNo)) + return state.processReject(session, msg, RequiredTagMissing(tagEndSeqNo)) } endSeqNo := int(endSeqNoField) @@ -223,7 +223,7 @@ func (state inSession) doTargetTooLow(session *session, msg Message, rej targetT origSendingTime := new(FIXUTCTimestamp) if err = msg.Header.GetField(tagOrigSendingTime, origSendingTime); err != nil { - session.doReject(msg, requiredTagMissing(tagOrigSendingTime)) + session.doReject(msg, RequiredTagMissing(tagOrigSendingTime)) return state } diff --git a/message_router.go b/message_router.go index 0ca105b77..3eba69d9b 100644 --- a/message_router.go +++ b/message_router.go @@ -70,7 +70,7 @@ func (c MessageRouter) tryRoute(beginString string, msgType string, msg Message, route, ok := c.routes[routeKey{fixVersion, msgType}] if !ok { - return unsupportedMessageType() + return UnsupportedMessageType() } return route(msg, sessionID) diff --git a/session.go b/session.go index 036681ded..961534d39 100644 --- a/session.go +++ b/session.go @@ -382,7 +382,7 @@ func (s *session) checkTargetTooLow(msg Message) MessageRejectError { var seqNum FIXInt switch err := msg.Header.GetField(tagMsgSeqNum, &seqNum); { case err != nil: - return requiredTagMissing(tagMsgSeqNum) + return RequiredTagMissing(tagMsgSeqNum) case int(seqNum) < s.store.NextTargetMsgSeqNum(): return targetTooLow{ReceivedTarget: int(seqNum), ExpectedTarget: s.store.NextTargetMsgSeqNum()} } @@ -394,7 +394,7 @@ func (s *session) checkTargetTooHigh(msg Message) MessageRejectError { var seqNum FIXInt switch err := msg.Header.GetField(tagMsgSeqNum, &seqNum); { case err != nil: - return requiredTagMissing(tagMsgSeqNum) + return RequiredTagMissing(tagMsgSeqNum) case int(seqNum) > s.store.NextTargetMsgSeqNum(): return targetTooHigh{ReceivedTarget: int(seqNum), ExpectedTarget: s.store.NextTargetMsgSeqNum()} } @@ -411,13 +411,13 @@ func (s *session) checkCompID(msg Message) MessageRejectError { switch { case haveSender != nil: - return requiredTagMissing(tagSenderCompID) + return RequiredTagMissing(tagSenderCompID) case haveTarget != nil: - return requiredTagMissing(tagTargetCompID) + return RequiredTagMissing(tagTargetCompID) case len(targetCompID) == 0: - return tagSpecifiedWithoutAValue(tagTargetCompID) + return TagSpecifiedWithoutAValue(tagTargetCompID) case len(senderCompID) == 0: - return tagSpecifiedWithoutAValue(tagSenderCompID) + return TagSpecifiedWithoutAValue(tagSenderCompID) case s.sessionID.SenderCompID != string(targetCompID) || s.sessionID.TargetCompID != string(senderCompID): return compIDProblem() } @@ -427,7 +427,7 @@ func (s *session) checkCompID(msg Message) MessageRejectError { func (s *session) checkSendingTime(msg Message) MessageRejectError { if ok := msg.Header.Has(tagSendingTime); !ok { - return requiredTagMissing(tagSendingTime) + return RequiredTagMissing(tagSendingTime) } sendingTime := new(FIXUTCTimestamp) @@ -446,7 +446,7 @@ func (s *session) checkBeginString(msg Message) MessageRejectError { var beginString FIXString switch err := msg.Header.GetField(tagBeginString, &beginString); { case err != nil: - return requiredTagMissing(tagBeginString) + return RequiredTagMissing(tagBeginString) case s.sessionID.BeginString != string(beginString): return incorrectBeginString{} } diff --git a/validation.go b/validation.go index da755e432..e47502bbe 100644 --- a/validation.go +++ b/validation.go @@ -34,7 +34,7 @@ func (v *fixValidator) Validate(msg Message) MessageRejectError { var msgType FIXString if err := msg.Header.GetField(tagMsgType, &msgType); err != nil { if err.RejectReason() == rejectReasonConditionallyRequiredFieldMissing { - return requiredTagMissing(tagMsgType) + return RequiredTagMissing(tagMsgType) } else { return err } @@ -49,7 +49,7 @@ func (v *fixtValidator) Validate(msg Message) MessageRejectError { var msgType FIXString if err := msg.Header.GetField(tagMsgType, &msgType); err != nil { if err.RejectReason() == rejectReasonConditionallyRequiredFieldMissing { - return requiredTagMissing(tagMsgType) + return RequiredTagMissing(tagMsgType) } else { return err } @@ -114,7 +114,7 @@ func validateFIXT(transportDD, appDD *datadictionary.DataDictionary, settings va func validateMsgType(d *datadictionary.DataDictionary, msgType string, msg Message) MessageRejectError { if _, validMsgType := d.Messages[msgType]; validMsgType == false { - return invalidMessageType() + return InvalidMessageType() } return nil } @@ -142,7 +142,7 @@ func validateWalk(transportDD *datadictionary.DataDictionary, appDD *datadiction } if fieldDef, ok = messageDef.Fields[int(tag)]; !ok { - return tagNotDefinedForThisMessageType(tag) + return TagNotDefinedForThisMessageType(tag) } if _, duplicate := iteratedTags[int(tag)]; duplicate { @@ -156,7 +156,7 @@ func validateWalk(transportDD *datadictionary.DataDictionary, appDD *datadiction } if len(remainingFields) != 0 { - return tagNotDefinedForThisMessageType(remainingFields[0].Tag) + return TagNotDefinedForThisMessageType(remainingFields[0].Tag) } return nil @@ -180,7 +180,7 @@ func validateVisitGroupField(fieldDef *datadictionary.FieldDef, fieldStack []tag var numInGroup FIXInt if err := numInGroup.Read(fieldStack[0].Value); err != nil { - return nil, incorrectDataFormatForValue(numInGroupTag) + return nil, IncorrectDataFormatForValue(numInGroupTag) } fieldStack = fieldStack[1:] @@ -208,7 +208,7 @@ func validateVisitGroupField(fieldDef *datadictionary.FieldDef, fieldStack []tag } } else { if childDefs[0].Required() { - return fieldStack, requiredTagMissing(Tag(childDefs[0].Tag())) + return fieldStack, RequiredTagMissing(Tag(childDefs[0].Tag())) } } @@ -265,7 +265,7 @@ func validateRequiredFieldMap(msg Message, requiredTags map[int]struct{}, fieldM if err := fieldMap.GetField(Tag(required), field); err != nil { //FIXME: add "has..." method? if err.RejectReason() == rejectReasonConditionallyRequiredFieldMissing { - return requiredTagMissing(Tag(required)) + return RequiredTagMissing(Tag(required)) } return err } @@ -297,11 +297,11 @@ func validateFields(transportDD *datadictionary.DataDictionary, appDD *datadicti func validateField(d *datadictionary.DataDictionary, validFields datadictionary.TagSet, field tagValue) MessageRejectError { if len(field.Value) == 0 { - return tagSpecifiedWithoutAValue(field.Tag) + return TagSpecifiedWithoutAValue(field.Tag) } if _, valid := d.FieldTypeByTag[int(field.Tag)]; !valid { - return invalidTagNumber(field.Tag) + return InvalidTagNumber(field.Tag) } allowedValues := d.FieldTypeByTag[int(field.Tag)].Enums @@ -380,7 +380,7 @@ func validateField(d *datadictionary.DataDictionary, validFields datadictionary. } if err := prototype.Read(field.Value); err != nil { - return incorrectDataFormatForValue(field.Tag) + return IncorrectDataFormatForValue(field.Tag) } return nil