#![allow(missing_debug_implementations)]
use crate::{DayOfWeek, Dictionary, QuickFixError};
pub trait DictionaryItem {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError>;
}
macro_rules! impl_dictionary_item {
($item:tt) => {
impl DictionaryItem for $item {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(stringify!($item), self.0)
}
}
};
($item:tt as String) => {
impl DictionaryItem for $item<'_> {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(stringify!($item), self.0.to_string())
}
}
};
($item:ty as $target_type:ty) => {
impl DictionaryItem for $item {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(stringify!($item), self.0 as $target_type)
}
}
};
}
pub enum ConnectionType {
Acceptor,
Initiator,
}
impl DictionaryItem for ConnectionType {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(
"ConnectionType",
match self {
Self::Acceptor => "acceptor",
Self::Initiator => "initiator",
},
)
}
}
pub struct SocketAcceptPort(pub u16);
impl_dictionary_item!(SocketAcceptPort as i32);
pub struct SocketConnectPort(pub u16);
impl_dictionary_item!(SocketConnectPort as i32);
pub struct SocketConnectHost<'a>(pub &'a str);
impl_dictionary_item!(SocketConnectHost as String);
pub struct SocketConnectSourcePort(pub u16);
impl_dictionary_item!(SocketConnectSourcePort as i32);
pub struct SocketConnectSourceHost<'a>(pub &'a str);
impl_dictionary_item!(SocketConnectSourceHost as String);
pub struct SocketReuseAddress(pub bool);
impl_dictionary_item!(SocketReuseAddress);
pub struct SocketNodelay(pub bool);
impl_dictionary_item!(SocketNodelay);
pub struct SocketSendBufferSize(pub u16);
impl_dictionary_item!(SocketSendBufferSize as i32);
pub struct SocketReceiveBufferSize(pub u16);
impl_dictionary_item!(SocketReceiveBufferSize as i32);
pub struct ReconnectInterval(pub u16);
impl_dictionary_item!(ReconnectInterval as i32);
pub struct HeartBtInt(pub u16);
impl_dictionary_item!(HeartBtInt as i32);
pub struct SendRedundantResendRequests(pub bool);
impl_dictionary_item!(SendRedundantResendRequests);
pub struct SendNextExpectedMsgSeqNum(pub bool);
impl_dictionary_item!(SendNextExpectedMsgSeqNum);
pub struct UseLocalTime(pub bool);
impl_dictionary_item!(UseLocalTime);
pub struct StartTime<'a>(pub &'a str);
impl_dictionary_item!(StartTime as String);
pub struct StartDay(pub DayOfWeek);
impl_dictionary_item!(StartDay);
pub struct EndTime<'a>(pub &'a str);
impl_dictionary_item!(EndTime as String);
pub struct EndDay(pub DayOfWeek);
impl_dictionary_item!(EndDay);
pub struct LogonTime<'a>(pub &'a str);
impl_dictionary_item!(LogonTime as String);
pub struct LogonDay(pub DayOfWeek);
impl_dictionary_item!(LogonDay);
pub struct LogonTimeout(pub u16);
impl_dictionary_item!(LogonTimeout as i32);
pub struct LogoutTime<'a>(pub &'a str);
impl_dictionary_item!(LogoutTime as String);
pub struct LogoutDay(pub DayOfWeek);
impl_dictionary_item!(LogoutDay);
pub struct LogoutTimeout(pub u16);
impl_dictionary_item!(LogoutTimeout as i32);
pub struct DefaultApplVerID<'a>(pub &'a str);
impl_dictionary_item!(DefaultApplVerID as String);
pub struct UseDataDictionary(pub bool);
impl_dictionary_item!(UseDataDictionary);
pub struct DataDictionary<'a>(pub &'a str);
impl_dictionary_item!(DataDictionary as String);
pub struct TransportDataDictionary<'a>(pub &'a str);
impl_dictionary_item!(TransportDataDictionary as String);
pub struct FileStorePath<'a>(pub &'a str);
impl_dictionary_item!(FileStorePath as String);
pub struct CheckCompID(pub bool);
impl_dictionary_item!(CheckCompID);
pub struct CheckLatency(pub bool);
impl_dictionary_item!(CheckLatency);
pub struct MaxLatency(pub i32);
impl_dictionary_item!(MaxLatency);
pub struct ValidateLengthAndChecksum(pub bool);
impl_dictionary_item!(ValidateLengthAndChecksum);
pub struct ValidateFieldsOutOfOrder(pub bool);
impl_dictionary_item!(ValidateFieldsOutOfOrder);
pub struct ValidateFieldsHaveValues(pub bool);
impl_dictionary_item!(ValidateFieldsHaveValues);
pub struct ValidateUserDefinedFields(pub bool);
impl_dictionary_item!(ValidateUserDefinedFields);
pub struct AllowUnknownMsgFields(pub bool);
impl_dictionary_item!(AllowUnknownMsgFields);
pub struct PreserveMessageFieldsOrder(pub bool);
impl_dictionary_item!(PreserveMessageFieldsOrder);
pub struct ResetOnLogon(pub bool);
impl_dictionary_item!(ResetOnLogon);
pub struct ResetOnLogout(pub bool);
impl_dictionary_item!(ResetOnLogout);
pub struct ResetOnDisconnect(pub bool);
impl_dictionary_item!(ResetOnDisconnect);
pub struct RefreshOnLogon(pub bool);
impl_dictionary_item!(RefreshOnLogon);
pub struct HttpAcceptPort(pub u16);
impl_dictionary_item!(HttpAcceptPort as i32);
pub struct PersistMessages(pub bool);
impl_dictionary_item!(PersistMessages);
pub struct SendResetSeqNumFlag(pub bool);
impl_dictionary_item!(SendResetSeqNumFlag);
pub struct ServerCertificateFile<'a>(pub &'a str);
impl_dictionary_item!(ServerCertificateFile as String);
pub struct ServerCertificateKeyFile<'a>(pub &'a str);
impl_dictionary_item!(ServerCertificateKeyFile as String);
pub struct ClientCertificateFile<'a>(pub &'a str);
impl_dictionary_item!(ClientCertificateFile as String);
pub struct ClientCertificateKeyFile<'a>(pub &'a str);
impl_dictionary_item!(ClientCertificateKeyFile as String);
pub enum SSLProtocol {
SSLv2,
SSLv3,
TLSv1,
TLSv1_1,
TLSv1_2,
All,
}
impl DictionaryItem for SSLProtocol {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(
"SSLProtocol",
match self {
Self::SSLv2 => "SSLv2",
Self::SSLv3 => "SSLv3",
Self::TLSv1 => "TLSv1",
Self::TLSv1_1 => "TLSv1_1",
Self::TLSv1_2 => "TLSv1_2",
Self::All => "all",
},
)
}
}
impl DictionaryItem for (&'static str, &str) {
fn apply_param(&self, dict: &mut Dictionary) -> Result<(), QuickFixError> {
dict.set(self.0, self.1.to_string())
}
}
impl Dictionary {
pub fn try_from_items(items: &[&dyn DictionaryItem]) -> Result<Self, QuickFixError> {
let mut output = Self::new();
for item in items {
item.apply_param(&mut output)?;
}
Ok(output)
}
}