dfx-base 1.0.0-beta

A FIX protocol implementation
Documentation
#![allow(non_snake_case)]

use std::fmt::Display;

use crate::field_map::Tag;

pub struct BeginString {}
impl BeginString {
    pub const FIXT11: &'static str = "FIXT.1.1";
    pub const FIX50SP2: &'static str = "FIX.5.0SP2";
    pub const FIX50SP1: &'static str = "FIX.5.0SP1";
    pub const FIX50: &'static str = "FIX.5.0";
    pub const FIX44: &'static str = "FIX.4.4";
    pub const FIX43: &'static str = "FIX.4.3";
    pub const FIX42: &'static str = "FIX.4.2";
    pub const FIX41: &'static str = "FIX.4.1";
    pub const FIX40: &'static str = "FIX.4.0";
}

pub enum ApplVerID {
    FIX27,
    FIX30,
    FIX40,
    FIX41,
    FIX42,
    FIX43,
    FIX44,
    FIX50,
    FIX50SP1,
    FIX50SP2,
}

impl Display for ApplVerID {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let c = match self {
            ApplVerID::FIX27 => "0",
            ApplVerID::FIX30 => "1",
            ApplVerID::FIX40 => "2",
            ApplVerID::FIX41 => "3",
            ApplVerID::FIX42 => "4",
            ApplVerID::FIX43 => "5",
            ApplVerID::FIX44 => "6",
            ApplVerID::FIX50 => "7",
            ApplVerID::FIX50SP1 => "8",
            ApplVerID::FIX50SP2 => "9",
        };
        f.write_str(c)
    }
}

impl ApplVerID {
    pub fn from_begin_string(begin_string: &str) -> &str {
        if BeginString::FIX40 == begin_string {
            return ApplVerID::FIX40.as_str();
        } else if BeginString::FIX41 == begin_string {
            return ApplVerID::FIX41.as_str();
        } else if BeginString::FIX42 == begin_string {
            return ApplVerID::FIX42.as_str();
        }
        else if BeginString::FIX43 == begin_string {
            return ApplVerID::FIX43.as_str();
        }
        else if BeginString::FIX44 == begin_string {
            return ApplVerID::FIX44.as_str();
        }
        else if BeginString::FIX50 == begin_string {
            return ApplVerID::FIX50.as_str();
        }
        else if BeginString::FIX50SP1 == begin_string {
            return ApplVerID::FIX50SP1.as_str();
        }
        else if BeginString::FIX50SP2 == begin_string {
            return ApplVerID::FIX50SP2.as_str();
        }
        else {
            return begin_string;
        }
    }

    pub fn as_str(&self) -> &str {
        match self {
            ApplVerID::FIX27 => "0",
            ApplVerID::FIX30 => "1",
            ApplVerID::FIX40 => "2",
            ApplVerID::FIX41 => "3",
            ApplVerID::FIX42 => "4",
            ApplVerID::FIX43 => "5",
            ApplVerID::FIX44 => "6",
            ApplVerID::FIX50 => "7",
            ApplVerID::FIX50SP1 => "8",
            ApplVerID::FIX50SP2 => "9",
        }
    }
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SessionRejectReason {
    tag: Tag,
    reason: String,
}

impl SessionRejectReason {
    pub fn INVALID_TAG_NUMBER() -> SessionRejectReason { SessionRejectReason { tag: 0, reason: "Invalid tag number".to_string() } }
    pub fn REQUIRED_TAG_MISSING() -> SessionRejectReason { SessionRejectReason { tag: 1, reason: "Required tag missing".to_string() } }
    pub fn TAG_NOT_DEFINED_FOR_THIS_MESSAGE_TYPE() -> SessionRejectReason { SessionRejectReason { tag: 2, reason: "Tag not defined for this message type".to_string() } }
    pub fn UNDEFINED_TAG() -> SessionRejectReason { SessionRejectReason { tag: 3, reason: "Undefined Tag".to_string() } }
    pub fn TAG_SPECIFIED_WITHOUT_A_VALUE() -> SessionRejectReason { SessionRejectReason { tag: 4, reason: "Tag specified without a value".to_string() } }
    pub fn VALUE_IS_INCORRECT() -> SessionRejectReason { SessionRejectReason { tag: 5, reason: "Value is incorrect (out of range) for this tag".to_string() } }
    pub fn INCORRECT_DATA_FORMAT_FOR_VALUE() -> SessionRejectReason { SessionRejectReason { tag: 6, reason: "Incorrect data format for value".to_string() } }
    pub fn DECRYPTION_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 7, reason: "Decryption problem".to_string() } }
    pub fn SIGNATURE_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 8, reason: "Signature problem".to_string() } }
    pub fn COMPID_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 9, reason: "CompID problem".to_string() } }
    pub fn SENDING_TIME_ACCURACY_PROBLEM() -> SessionRejectReason { SessionRejectReason { tag: 10, reason: "SendingTime accuracy problem".to_string() } }
    pub fn INVALID_MSGTYPE() -> SessionRejectReason { SessionRejectReason { tag: 11, reason: "Invalid MsgType".to_string() } }
    pub fn XML_VALIDATION_ERROR() -> SessionRejectReason { SessionRejectReason { tag: 12, reason: "XML validation error".to_string() } }
    pub fn TAG_APPEARS_MORE_THAN_ONCE() -> SessionRejectReason { SessionRejectReason { tag: 13, reason: "Tag appears more than once".to_string() } }
    pub fn TAG_SPECIFIED_OUT_OF_REQUIRED_ORDER() -> SessionRejectReason { SessionRejectReason { tag: 14, reason: "Tag specified out of required order".to_string() } }
    pub fn REPEATING_GROUP_FIELDS_OUT_OF_ORDER() -> SessionRejectReason { SessionRejectReason { tag: 15, reason: "Repeating group fields out of order".to_string() } }
    pub fn INCORRECT_NUM_IN_GROUP_COUNT_FOR_REPEATING_GROUP() -> SessionRejectReason { SessionRejectReason { tag: 16, reason: "Incorrect NumInGroup count for repeating group".to_string() } }
    pub fn NON_DATA_VALUE_INCLUDES_FIELD_DELIMITER() -> SessionRejectReason { SessionRejectReason { tag: 17, reason: "Non-data value includes field delimiter".to_string() } }
    pub fn OTHER(reason: String) -> SessionRejectReason { SessionRejectReason { tag: 99, reason } }

    pub fn tag(&self) -> Tag {
        self.tag
    }

    pub fn reason(&self) -> &str {
        self.reason.as_ref()
    }

    pub fn description(&self) -> String {
        format!("{}", self.reason)
    }
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BusinessRejectReason {
    index: usize,
    reason: String,
}

impl BusinessRejectReason {
    pub fn UNKNOWN_MESSAGE_TYPE() -> BusinessRejectReason { BusinessRejectReason { index: 3, reason: "Unsupported Message Type".to_string() } }

    pub fn index(&self) -> usize {
        self.index
    }

    pub fn reason(&self) -> &str {
        self.reason.as_ref()
    }

    pub fn description(&self) -> String {
        format!("{}", self.reason)
    }
}