use crate::protocol::orderflow::{OrderId, OrderState};
use anyhow::Result;
use enumflags2::BitFlags;
use std::{future::Future, pin::Pin};
use tokio::sync::watch;
pub type Outcome = Pin<
Box<
dyn Future<Output = Result<(OrderId, BitFlags<OrderState>)>>
+ Send
+ Sync
+ 'static,
>,
>;
pub struct ManagedOrder {
order_id: OrderId,
order_state: watch::Sender<BitFlags<OrderState>>,
}
impl ManagedOrder {
pub(crate) fn new(order_id: OrderId) -> Self {
let (order_state, _) = watch::channel(BitFlags::empty());
Self { order_id, order_state }
}
pub(crate) fn set_order_state(&self, state: BitFlags<OrderState>) {
self.order_state.send_replace(state);
}
pub fn id(&self) -> OrderId {
self.order_id
}
pub fn wait_filled_or_out(&self) -> Outcome {
let mut rx = self.order_state.subscribe();
let id = self.order_id;
Box::pin(async move {
let mut state = *rx.borrow();
while state.is_empty() || state.contains(OrderState::Open) {
rx.changed().await?;
state = *rx.borrow();
}
Ok((id, state))
})
}
}