bitbank_api/stream/
depth_diff.rs1use super::*;
2
3pub use crate::public::depth::LimitOrder;
4use crate::public::depth::RawLimitOrder;
5
6#[serde_as]
7#[derive(Deserialize, Debug)]
8struct RawResponse {
9 a: Vec<RawLimitOrder>,
10 b: Vec<RawLimitOrder>,
11 #[serde_as(as = "TimestampMilliSeconds")]
12 t: NaiveDateTime,
13 #[serde_as(as = "DisplayFromStr")]
14 s: u64,
15}
16
17#[derive(Debug)]
18pub struct DepthDiff {
19 pub asks: Vec<LimitOrder>,
20 pub bids: Vec<LimitOrder>,
21 pub timestamp: NaiveDateTime,
22 pub sequence_id: u64,
23}
24
25#[derive(TypedBuilder)]
26pub struct Params {
27 pair: Pair,
28}
29
30pub async fn connect(
31 params: Params,
32) -> anyhow::Result<impl tokio_stream::Stream<Item = DepthDiff>> {
33 use tokio_stream::StreamExt;
34
35 let pair = params.pair;
36 let room_id = format!("depth_diff_{pair}");
37 let raw = do_connect::<RawResponse>(&room_id).await?;
38 let st = raw.map(|x| DepthDiff {
39 asks: x.a.into_iter().map(LimitOrder::new).collect(),
40 bids: x.b.into_iter().map(LimitOrder::new).collect(),
41 timestamp: x.t,
42 sequence_id: x.s,
43 });
44 Ok(st)
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[tokio::test]
52 async fn test() -> anyhow::Result<()> {
53 use futures_util::{pin_mut, StreamExt};
54
55 let params = Params::builder().pair(Pair(XRP, JPY)).build();
56 let st = connect(params).await?;
57 pin_mut!(st);
58 while let Some(x) = st.next().await {
59 dbg!(&x);
60 break;
61 }
62 Ok(())
63 }
64}