Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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)
}

Expand All @@ -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)
}

Expand All @@ -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)
}

Expand Down
16 changes: 12 additions & 4 deletions field_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -81,29 +82,32 @@ 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 {
return ConditionallyRequiredFieldMissing(tag)
}

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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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())
Expand All @@ -149,13 +155,15 @@ 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())
m.tagLookup[field.Tag()] = tValues
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
Expand Down
6 changes: 3 additions & 3 deletions in_session.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
}

Expand Down
2 changes: 1 addition & 1 deletion message_router.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions session.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()}
}
Expand All @@ -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()}
}
Expand All @@ -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()
}
Expand All @@ -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)
Expand All @@ -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{}
}
Expand Down
22 changes: 11 additions & 11 deletions validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand All @@ -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:]
Expand Down Expand Up @@ -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()))
}
}

Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down