in FixAntenna/NetCore/Validation/Validators/FieldOrderValidator.cs [37:131]
public override FixErrorContainer Validate(string msgType, IValidationFixMessage message,
bool isContentValidation)
{
var fixMessage = (ValidationFixMessage)message;
var msg = fixMessage.FullFixMessage;
var errors = new FixErrorContainer();
if (!IsMessageTypeExist(msgType))
{
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.InvalidMsgtype, fixMessage.GetMsgSeqNumber(),
msgType, Tags.MsgType));
return errors;
}
var fieldsLength = msg.Length;
var state = 0;
for (var fieldCount = 0; fieldCount < fieldsLength; fieldCount++)
{
var tagValue = msg[fieldCount];
var tag = tagValue.TagId;
if (tag >= Utils.Constants.BeginCustomTag)
{
continue;
}
switch (state)
{
case 0:
if (isContentValidation && IsHeader(tag))
{
state = 1;
break;
}
if (Util.IsTagDefinedForMessageOrBlock("SMH", tag))
{
state = 1;
break;
}
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.TagSpecifiedOutOfRequiredOrder,
tagValue, fixMessage.GetMsgSeqNumber(), msgType, tag));
goto case 1;
case 1:
if (isContentValidation && IsHeader(tag) || Util.IsTagDefinedForMessageOrBlock("SMH", tag))
{
break;
}
else if (Util.IsTagDefinedForMessageOrBlock(msgType, tag) ||
msgType.StartsWith("U", StringComparison.Ordinal))
{
state = 2;
break;
}
else if (isContentValidation && IsTrailer(tag) ||
Util.IsTagDefinedForMessageOrBlock("SMT", tag))
{
state = 3;
break;
}
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.TagSpecifiedOutOfRequiredOrder,
tagValue, fixMessage.GetMsgSeqNumber(), msgType, tag));
goto case 2;
case 2:
if (Util.IsTagDefinedForMessageOrBlock(msgType, tag) ||
msgType.StartsWith("U", StringComparison.Ordinal))
{
state = 2;
break;
}
else if (isContentValidation && IsTrailer(tag) ||
Util.IsTagDefinedForMessageOrBlock("SMT", tag))
{
state = 3;
break;
}
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.TagSpecifiedOutOfRequiredOrder,
tagValue, fixMessage.GetMsgSeqNumber(), msgType, tag));
goto case 3;
case 3:
if (isContentValidation && IsTrailer(tag) || Util.IsTagDefinedForMessageOrBlock("SMT", tag))
{
break;
}
errors.Add(FixErrorBuilder.BuildError(FixErrorCode.TagSpecifiedOutOfRequiredOrder,
tagValue, fixMessage.GetMsgSeqNumber(), msgType, tag));
break;
}
}
return errors;
}