hotfix-message 0.4.0

FIX messages for HotFIX.
Documentation
use crate::error::MessageIntegrityError;
use crate::message::Message;

pub enum ParsedMessage {
    Valid(Message),
    Invalid {
        message: Message,
        reason: InvalidReason,
    },
    Garbled(GarbledReason),
    UnexpectedError(String),
}

impl ParsedMessage {
    pub fn into_message(self) -> Option<Message> {
        match self {
            ParsedMessage::Valid(message) => Some(message),
            ParsedMessage::Invalid { message, .. } => Some(message),
            _ => None,
        }
    }
}

pub enum InvalidReason {
    InvalidField(u32),
    InvalidGroup(u32),
    InvalidOrderInGroup { tag: u32, group_tag: u32 },
    InvalidComponent(String),
    InvalidMsgType(String),
    RequiredFieldMissing { tag: u32, group_tag: Option<u32> },
}

#[derive(Debug)]
pub enum GarbledReason {
    Malformed,
    InvalidBeginString,
    InvalidBodyLength,
    InvalidMsgType,
    InvalidChecksum,
}

impl From<MessageIntegrityError> for ParsedMessage {
    fn from(header_error: MessageIntegrityError) -> Self {
        match header_error {
            MessageIntegrityError::InvalidBeginString => {
                ParsedMessage::Garbled(GarbledReason::InvalidBeginString)
            }
            MessageIntegrityError::InvalidBodyLength => {
                ParsedMessage::Garbled(GarbledReason::InvalidBodyLength)
            }
            MessageIntegrityError::InvalidMsgType => {
                ParsedMessage::Garbled(GarbledReason::InvalidMsgType)
            }
            MessageIntegrityError::InvalidCheckSum => {
                ParsedMessage::Garbled(GarbledReason::InvalidChecksum)
            }
        }
    }
}