public override FixErrorContainer Validate()

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;
		}