bitbank_api/stream/
depth_whole.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 asks: Vec<RawLimitOrder>,
10 bids: Vec<RawLimitOrder>,
11 #[serde_as(as = "TimestampMilliSeconds")]
12 timestamp: NaiveDateTime,
13 #[serde_as(as = "DisplayFromStr")]
14 sequenceId: u64,
15}
16
17#[derive(TypedBuilder)]
18pub struct Params {
19 pair: Pair,
20}
21
22#[derive(Debug)]
23pub struct DepthWhole {
24 pub asks: Vec<LimitOrder>,
25 pub bids: Vec<LimitOrder>,
26 pub timestamp: NaiveDateTime,
27 pub sequence_id: u64,
28}
29
30pub async fn connect(
31 params: Params,
32) -> anyhow::Result<impl tokio_stream::Stream<Item = DepthWhole>> {
33 use tokio_stream::StreamExt;
34
35 let pair = params.pair;
36 let room_id = format!("depth_whole_{pair}");
37 let raw = do_connect::<RawResponse>(&room_id).await?;
38 let st = raw.map(|x| DepthWhole {
39 asks: x.asks.into_iter().map(LimitOrder::new).collect(),
40 bids: x.bids.into_iter().map(LimitOrder::new).collect(),
41 timestamp: x.timestamp,
42 sequence_id: x.sequenceId,
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}