Skip to main content

UdCore

Struct UdCore 

pub struct UdCore { /* private fields */ }
Expand description

User data core: turns stream frames into order, execution and portfolio events.

It resolves the client order id of every order echo through the OrderIndex and advances the local lifecycle of orders this process placed (so order_state and the stream agree).

Implements BrokerCore from brokapi-sansio.

§Examples

use std::sync::Arc;
use std::time::Instant;
use brokapi_core::{Event, SubscriptionId};
use brokapi_finam::core::ud::UdSubKind;
use brokapi_finam::core::{SubStatus, UdCore, UdEvent, UdFrame};
use brokapi_finam::index::OrderIndex;
use brokapi_sansio::{BrokerCore, EventSink};
use brokapi_finam_protocol::pb::grpc::tradeapi::v1::orders as po;

let sub = SubscriptionId::new(1000);
let mut core = UdCore::new(Arc::new(OrderIndex::new()));
core.register(sub, UdSubKind::Orders);
assert_eq!(core.status(sub), Some(SubStatus::Connecting));

// An order that this process did not place: it still reaches the consumer, under a made-up cid.
let echo = po::OrderState { order_id: "ORD-7".into(), ..Default::default() };
let mut out = EventSink::new();
core.on_frame(
    UdFrame { sub, event: UdEvent::Orders(po::SubscribeOrdersResponse { orders: vec![echo] }) },
    Instant::now(),
    &mut out,
);
assert_eq!(core.status(sub), Some(SubStatus::Active));
assert!(matches!(out.drain()[0].payload, Event::Order(_)));

Implementations§

§

impl UdCore

pub fn new(index: Arc<OrderIndex>) -> UdCore

A core with no subscriptions. index is shared with the connector.

pub fn orders(&mut self) -> &mut OrderRuntime

Local lifecycle of orders placed through this connector.

pub fn take_forgotten(&mut self) -> Vec<Uuid>

Takes the cids the core forgot since the last call: orders that finished long ago (see the memory window of [OrderRuntime]). The connector drops what else it keeps for them.

pub fn index(&self) -> &Arc<OrderIndex> ⓘ

The order index shared with the connector.

pub fn register(&mut self, sub: SubscriptionId, kind: UdSubKind)

Adds a subscription of kind (status Connecting). Executions need this call because the shared SubscriptionKind has no variant for them.

pub fn unregister(&mut self, sub: SubscriptionId)

Forgets subscription sub and its status. Late frames for it are ignored.

pub fn status(&self, sub: SubscriptionId) -> Option<SubStatus>

Stream status of subscription sub. None for an id the core does not know.

pub fn ingest_order(&mut self, os: &OrderState, now: Instant) -> OrderSnapshot

Maps one order echo and advances the local lifecycle of orders we placed.

Trait Implementations§

§

impl BrokerCore for UdCore

§

fn apply(&mut self, desired: &SubscriptionSet)

Order-state and portfolio subscriptions. Executions are registered with register because SubscriptionKind has no variant for them.

§

type Frame = UdFrame

The inbound frame type: for example String for WebSocket text, or a decoded message.
§

fn on_frame(&mut self, frame: UdFrame, now: Instant, out: &mut EventSink)

Handles one inbound transport frame received at now. Read more
§

fn poll_transmit(&mut self) -> Option<Outbound>

Takes the next outbound wire message, if any. Call it until it returns None.
§

fn poll_timeout(&self) -> Option<Instant>

When the core wants on_timeout to be called next, or None if it has no timer pending. Read more
§

fn on_timeout(&mut self, _now: Instant, _out: &mut EventSink)

Handles a timer that fired. now is the time the timer was due.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more