use std::collections::HashSet;
use std::sync::LazyLock;
use super::{IncomingMessages, OutgoingMessages};
#[allow(dead_code)]
pub struct ChannelMapping {
pub request: OutgoingMessages,
pub responses: &'static [IncomingMessages],
pub one_shot: bool,
}
pub(crate) const CHANNEL_MAPPINGS: &[ChannelMapping] = &[
ChannelMapping {
request: OutgoingMessages::RequestIds,
responses: &[IncomingMessages::NextValidId],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestFamilyCodes,
responses: &[IncomingMessages::FamilyCodes],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestMarketRule,
responses: &[IncomingMessages::MarketRule],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestPositions,
responses: &[IncomingMessages::Position, IncomingMessages::PositionEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestPositionsMulti,
responses: &[IncomingMessages::PositionMulti, IncomingMessages::PositionMultiEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestOpenOrders,
responses: &[IncomingMessages::OpenOrder, IncomingMessages::OrderStatus, IncomingMessages::OpenOrderEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestAllOpenOrders,
responses: &[IncomingMessages::OpenOrder, IncomingMessages::OrderStatus, IncomingMessages::OpenOrderEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestAutoOpenOrders,
responses: &[IncomingMessages::OpenOrder, IncomingMessages::OrderStatus, IncomingMessages::OpenOrderEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestCompletedOrders,
responses: &[IncomingMessages::CompletedOrder, IncomingMessages::CompletedOrdersEnd],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestManagedAccounts,
responses: &[IncomingMessages::ManagedAccounts],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestAccountData,
responses: &[
IncomingMessages::AccountValue,
IncomingMessages::PortfolioValue,
IncomingMessages::AccountDownloadEnd,
IncomingMessages::AccountUpdateTime,
],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestMktDepthExchanges,
responses: &[IncomingMessages::MktDepthExchanges],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestCurrentTime,
responses: &[IncomingMessages::CurrentTime],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestCurrentTimeInMillis,
responses: &[IncomingMessages::CurrentTimeInMillis],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestNewsProviders,
responses: &[IncomingMessages::NewsProviders],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestNewsBulletins,
responses: &[IncomingMessages::NewsBulletins],
one_shot: false,
},
ChannelMapping {
request: OutgoingMessages::RequestScannerParameters,
responses: &[IncomingMessages::ScannerParameters],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestWshMetaData,
responses: &[IncomingMessages::WshMetaData],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::RequestFA,
responses: &[IncomingMessages::ReceiveFA],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::VerifyRequest,
responses: &[IncomingMessages::VerifyMessageApi],
one_shot: true,
},
ChannelMapping {
request: OutgoingMessages::VerifyMessage,
responses: &[IncomingMessages::VerifyCompleted],
one_shot: true,
},
];
static EXCLUSIVE_ONE_SHOT_RESPONSE_TYPES: LazyLock<HashSet<IncomingMessages>> = LazyLock::new(|| {
let streaming: HashSet<IncomingMessages> = CHANNEL_MAPPINGS
.iter()
.filter(|m| !m.one_shot)
.flat_map(|m| m.responses.iter().copied())
.collect();
CHANNEL_MAPPINGS
.iter()
.filter(|m| m.one_shot)
.flat_map(|m| m.responses.iter().copied())
.filter(|r| !streaming.contains(r))
.collect()
});
pub(crate) fn exclusive_one_shot_response_types() -> &'static HashSet<IncomingMessages> {
&EXCLUSIVE_ONE_SHOT_RESPONSE_TYPES
}
#[cfg(any(feature = "sync", test))]
pub(crate) fn is_one_shot_request(request: OutgoingMessages) -> bool {
CHANNEL_MAPPINGS.iter().any(|m| m.request == request && m.one_shot)
}