use derive_more::Display;
use exc_service::{ExchangeError, Request};
use futures::stream::BoxStream;
use indicator::{Tick, TickValue, Tickable};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::Str;
pub type TradeStream = BoxStream<'static, Result<Trade, ExchangeError>>;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Display)]
#[display(fmt = "ts={ts} ({price}, {size}, {buy})")]
pub struct Trade {
#[serde(with = "time::serde::rfc3339")]
pub ts: OffsetDateTime,
pub price: Decimal,
pub size: Decimal,
pub buy: bool,
}
#[derive(Debug, Clone)]
pub struct SubscribeTrades {
pub instrument: Str,
}
impl SubscribeTrades {
pub fn new(inst: impl AsRef<str>) -> Self {
Self {
instrument: Str::new(inst),
}
}
}
impl Request for SubscribeTrades {
type Response = TradeStream;
}
impl Tickable for Trade {
type Value = Self;
fn tick(&self) -> Tick {
Tick::new(self.ts)
}
fn value(&self) -> &Self::Value {
self
}
fn into_tick_value(self) -> TickValue<Self::Value> {
TickValue::new(self.ts, self)
}
}