pub struct MdCore { /* private fields */ }Expand description
Sans-io market data core of the BCS market data WebSocket.
It turns inbound frames into [Event]s (order books, quotes, trades, candles), tracks which
subscriptions the broker has confirmed, and after a reconnect tells the consumer that the order
books are void (Event::Resync with [ResyncReason::SubscriptionReset]). It does no I/O.
§Examples
Ask for an order book subscription and read the message the core wants to send:
use std::time::Instant;
use brokapi_bcs::{MdCore, core::SubState};
use brokapi_core::{InstrumentId, InstrumentKey, NativeId, SubscriptionId};
use brokapi_sansio::{
BrokerCore, DesiredSubscription, EventSink, Outbound, SubscriptionKind, SubscriptionSet,
};
let sber = InstrumentId::new(
InstrumentKey::new("SBER", "TQBR"),
NativeId::TickerClass { ticker: "SBER".into(), class_code: "TQBR".into() },
);
let sub = SubscriptionId::new(1);
let mut core = MdCore::new();
core.apply(&SubscriptionSet::with_subscriptions(vec![DesiredSubscription {
id: sub,
kind: SubscriptionKind::OrderBook { instrument: sber, depth: 10 },
}]));
let Some(Outbound::WsText(text)) = core.poll_transmit() else { panic!("a subscribe message") };
assert!(text.contains("\"subscribeType\":0"));
// Waiting for the broker's confirmation.
assert_eq!(core.actual_state(sub), Some(SubState::Pending));
// A subscribe error from the broker fails the subscriptions that wait.
let mut out = EventSink::new();
core.feed_raw(r#"{"errors":[{"message":"unknown instrument"}]}"#, Instant::now(), &mut out);
assert_eq!(core.actual_state(sub), Some(SubState::Failed));Implementations§
Source§impl MdCore
impl MdCore
Sourcepub fn notifier(&self) -> Arc<Notify>
pub fn notifier(&self) -> Arc<Notify>
The signal that is given whenever a subscription is confirmed or refused. A connector waits on it
(with [brokapi_runtime::wait_ack]) to hold subscribe_* until the broker has answered.
Sourcepub fn failure(&self, id: SubscriptionId) -> Option<&str>
pub fn failure(&self, id: SubscriptionId) -> Option<&str>
Why subscription id failed, in the words of the broker, if it did.
Sourcepub fn desired(&self) -> &SubscriptionSet
pub fn desired(&self) -> &SubscriptionSet
Subscriptions the connector asked for (input of the last apply).
Sourcepub fn actual_state(&self, id: SubscriptionId) -> Option<SubState>
pub fn actual_state(&self, id: SubscriptionId) -> Option<SubState>
The state of subscription id, or None if the core does not know it (never applied, or
already unsubscribed).
Sourcepub fn feed_raw(&mut self, text: &str, now: Instant, out: &mut EventSink)
pub fn feed_raw(&mut self, text: &str, now: Instant, out: &mut EventSink)
Feeds one raw text frame of the market data WebSocket.
A frame with an errors array is a subscribe error: the pending subscription it is about becomes
SubState::Failed (all pending ones if the frame does not say which, see fail_pending) and no
event is pushed. Any other frame is parsed and handled like
on_frame does. A frame that cannot be parsed is skipped, there is
no error to return.
Trait Implementations§
Source§impl BrokerCore for MdCore
impl BrokerCore for MdCore
Source§type Frame = IncomingMessage
type Frame = IncomingMessage
String for WebSocket text, or a decoded message.Source§fn on_frame(&mut self, frame: Self::Frame, now: Instant, out: &mut EventSink)
fn on_frame(&mut self, frame: Self::Frame, now: Instant, out: &mut EventSink)
now. Read moreSource§fn poll_transmit(&mut self) -> Option<Outbound>
fn poll_transmit(&mut self) -> Option<Outbound>
None.Source§fn poll_timeout(&self) -> Option<Instant>
fn poll_timeout(&self) -> Option<Instant>
Source§fn on_timeout(&mut self, _now: Instant, _out: &mut EventSink)
fn on_timeout(&mut self, _now: Instant, _out: &mut EventSink)
now is the time the timer was due.