1- use crate :: datapoint_source:: assets_exchange_rate:: AssetsExchangeRate ;
2- use crate :: datapoint_source:: assets_exchange_rate:: NanoErg ;
3- use crate :: datapoint_source:: DataPointSourceError ;
4-
51use super :: ada_usd:: Lovelace ;
62use super :: assets_exchange_rate:: Btc ;
73use super :: assets_exchange_rate:: Usd ;
8- use super :: erg_xau:: KgAu ;
94use super :: erg_xag:: KgAg ;
5+ use super :: erg_xau:: KgAu ;
6+ use crate :: datapoint_source:: assets_exchange_rate:: AssetsExchangeRate ;
7+ use crate :: datapoint_source:: assets_exchange_rate:: NanoErg ;
8+ use crate :: datapoint_source:: rsn_xag:: Rsn ;
9+ use crate :: datapoint_source:: DataPointSourceError ;
1010
1111#[ cfg( not( test) ) ]
1212pub async fn get_kgau_nanoerg ( ) -> Result < AssetsExchangeRate < KgAu , NanoErg > , DataPointSourceError > {
@@ -180,6 +180,46 @@ pub async fn get_btc_nanoerg() -> Result<AssetsExchangeRate<Btc, NanoErg>, DataP
180180 Ok ( rate)
181181}
182182
183+ pub async fn get_kgag_rsn ( ) -> Result < AssetsExchangeRate < KgAg , Rsn > , DataPointSourceError > {
184+ let url = "https://api.coingecko.com/api/v3/simple/price?ids=rosen-bridge&vs_currencies=XAG" ;
185+ let resp = reqwest:: get ( url) . await ?;
186+ let price_json = json:: parse ( & resp. text ( ) . await ?) ?;
187+ if let Some ( p) = price_json[ "rosen-bridge" ] [ "xag" ] . as_f64 ( ) {
188+ // Convert from price RSN/XAG
189+ let rsn_per_ag = KgAg :: from_troy_ounce ( 1.0 / p) ;
190+ let rate = AssetsExchangeRate {
191+ per1 : KgAg { } ,
192+ get : Rsn { } ,
193+ rate : rsn_per_ag,
194+ } ;
195+ Ok ( rate)
196+ } else {
197+ Err ( DataPointSourceError :: JsonMissingField {
198+ field : "rsn.xag as f64" . to_string ( ) ,
199+ json : price_json. dump ( ) ,
200+ } )
201+ }
202+ }
203+
204+ pub async fn get_rsn_usd ( ) -> Result < AssetsExchangeRate < Usd , Rsn > , DataPointSourceError > {
205+ let url = "https://api.coingecko.com/api/v3/simple/price?ids=rosen-bridge&vs_currencies=USD" ;
206+ let resp = reqwest:: get ( url) . await ?;
207+ let price_json = json:: parse ( & resp. text ( ) . await ?) ?;
208+ if let Some ( p) = price_json[ "rosen-bridge" ] [ "usd" ] . as_f64 ( ) {
209+ let rate = AssetsExchangeRate {
210+ per1 : Usd { } ,
211+ get : Rsn { } ,
212+ rate : 1.0 / p,
213+ } ;
214+ Ok ( rate)
215+ } else {
216+ Err ( DataPointSourceError :: JsonMissingField {
217+ field : "rsn.usd as f64" . to_string ( ) ,
218+ json : price_json. dump ( ) ,
219+ } )
220+ }
221+ }
222+
183223#[ cfg( test) ]
184224mod tests {
185225 use super :: * ;
@@ -190,10 +230,10 @@ mod tests {
190230 tokio_test:: block_on ( get_kgau_nanoerg ( ) ) . unwrap ( ) ;
191231 assert ! ( pair. rate > 0.0 ) ;
192232 }
193-
233+
194234 #[ test]
195235 fn test_erg_xag_price ( ) {
196- let pair: AssetsExchangeRate < KgAg , NanoErg > =
236+ let pair: AssetsExchangeRate < KgAg , NanoErg > =
197237 tokio_test:: block_on ( get_kgag_nanoerg ( ) ) . unwrap ( ) ;
198238 assert ! ( pair. rate > 0.0 ) ;
199239 }
@@ -217,4 +257,16 @@ mod tests {
217257 tokio_test:: block_on ( get_btc_nanoerg ( ) ) . unwrap ( ) ;
218258 assert ! ( pair. rate > 0.0 ) ;
219259 }
260+
261+ #[ test]
262+ fn test_rsn_xag_price ( ) {
263+ let pair: AssetsExchangeRate < KgAg , Rsn > = tokio_test:: block_on ( get_kgag_rsn ( ) ) . unwrap ( ) ;
264+ assert ! ( pair. rate > 0.0 ) ;
265+ }
266+
267+ #[ test]
268+ fn test_rsn_usd_price ( ) {
269+ let pair: AssetsExchangeRate < Usd , Rsn > = tokio_test:: block_on ( get_rsn_usd ( ) ) . unwrap ( ) ;
270+ assert ! ( pair. rate > 0.0 ) ;
271+ }
220272}
0 commit comments