1- use crate :: { LatestRate , LiquidUsdt , Rate } ;
1+ use crate :: { LatestRate , LiquidUsdt , Rate , RateSubscription } ;
22use anyhow:: { anyhow, bail, Result } ;
3- use async_trait:: async_trait;
4- use futures:: { Future , SinkExt , Stream , StreamExt } ;
3+ use futures:: { SinkExt , StreamExt } ;
54use reqwest:: Url ;
65use serde:: { Deserialize , Serialize } ;
76use serde_json:: Value ;
@@ -22,38 +21,17 @@ const SUBSCRIBE_XBT_USD_TICKER_PAYLOAD: &str = r#"
2221#[ derive( Clone ) ]
2322pub struct RateService {
2423 receiver : Receiver < Rate > ,
25- latest_rate : Rate ,
2624}
2725
28- impl Future for RateService {
29- type Output = Rate ;
30-
31- fn poll (
32- mut self : std:: pin:: Pin < & mut Self > ,
33- cx : & mut std:: task:: Context < ' _ > ,
34- ) -> std:: task:: Poll < Self :: Output > {
35- match self . receiver . poll_next_unpin ( cx) {
36- std:: task:: Poll :: Ready ( Some ( rate) ) => {
37- self . latest_rate = rate;
38- self . poll ( cx)
39- }
40- std:: task:: Poll :: Ready ( None ) | std:: task:: Poll :: Pending => {
41- std:: task:: Poll :: from ( self . latest_rate )
42- }
43- }
44- }
45- }
46-
47- #[ async_trait]
4826impl LatestRate for RateService {
49- async fn latest_rate ( & mut self ) -> anyhow :: Result < Rate > {
50- Ok ( self . await )
27+ fn latest_rate ( & mut self ) -> Rate {
28+ * self . receiver . borrow ( )
5129 }
5230}
5331
5432impl RateService {
5533 pub async fn new ( ) -> Result < Self > {
56- let ( tx, mut rx) = watch:: channel ( Rate :: ZERO ) ;
34+ let ( tx, rx) = watch:: channel ( Rate :: ZERO ) ;
5735
5836 let ( ws, _response) =
5937 tokio_tungstenite:: connect_async ( Url :: parse ( KRAKEN_WS_URL ) . expect ( "valid url" ) ) . await ?;
@@ -84,25 +62,17 @@ impl RateService {
8462 }
8563 } ;
8664
87- let _ = tx. broadcast ( rate) ;
65+ let _ = tx. send ( rate) ;
8866 }
8967 } ) ;
9068
9169 write. send ( SUBSCRIBE_XBT_USD_TICKER_PAYLOAD . into ( ) ) . await ?;
9270
93- let latest_rate = rx
94- . next ( )
95- . await
96- . ok_or_else ( || anyhow ! ( "latest rate stream has ended" ) ) ?;
97-
98- Ok ( Self {
99- receiver : rx,
100- latest_rate,
101- } )
71+ Ok ( Self { receiver : rx } )
10272 }
10373
104- pub fn subscribe ( & self ) -> impl Stream < Item = Rate > + Clone {
105- self . receiver . clone ( )
74+ pub fn subscribe ( & self ) -> RateSubscription {
75+ RateSubscription :: from ( self . receiver . clone ( ) )
10676 }
10777}
10878
@@ -172,26 +142,4 @@ mod tests {
172142
173143 let _ = serde_json:: from_str :: < TickerUpdate > ( sample_response) . unwrap ( ) ;
174144 }
175-
176- #[ tokio:: test]
177- async fn latest_rate_does_not_wait_for_next_value ( ) {
178- let ( write, read) = watch:: channel ( Rate :: ZERO ) ;
179-
180- let latest_rate = Rate {
181- ask : LiquidUsdt :: from_str_in_dollar ( "20000.0" ) . unwrap ( ) ,
182- bid : LiquidUsdt :: from_str_in_dollar ( "19000.0" ) . unwrap ( ) ,
183- } ;
184- let _ = write. broadcast ( latest_rate) . unwrap ( ) ;
185-
186- let mut service = RateService {
187- receiver : read,
188- latest_rate : Rate :: ZERO ,
189- } ;
190-
191- let rate = service. latest_rate ( ) . await . unwrap ( ) ;
192- assert_eq ! ( rate, latest_rate) ;
193-
194- let rate = service. latest_rate ( ) . await . unwrap ( ) ;
195- assert_eq ! ( rate, latest_rate) ;
196- }
197145}
0 commit comments