midgard_rs/midgard/endpoints/
pools.rs

1use anyhow::Result;
2use chrono::Utc;
3
4use crate::{api_get_details_of_pool, api_get_pool_list, api_get_known_pool_list, api_get_statistics_of_pool, Midgard, KnownPoolList, Pool, PoolList, PoolStatus, PoolStatistics, TimePeriod};
5
6impl Midgard {
7	/// Returns an array containing details for a set of pools.
8	/// # Example
9	/// ```rust
10	/// use midgard_rs::Midgard;
11	/// use midgard_rs::PoolStatus;
12	/// use midgard_rs::TimePeriod;
13	/// # tokio_test::block_on(async {
14	/// let mut midgard = Midgard::new();
15	///
16	/// let pool_list = midgard.get_pool_list(None, None).await.unwrap();
17	/// assert!(!pool_list.get_pools().is_empty());
18	/// # });
19	/// ```
20        /// 
21        /// # Errors
22        /// todo
23	pub async fn get_pool_list(&mut self, status: Option<PoolStatus>, period: Option<TimePeriod>) -> Result<PoolList> {
24		// Wait for rate limit timer
25		self.sleep_until_ok_to_call().await;
26
27		self.set_last_call(Utc::now());
28		api_get_pool_list(self.get_config().get_base_url(), status, period).await
29	}
30
31	/// Returns details of the pool: depths, price, 24h volume, APY.
32	/// # Example
33	/// ```rust
34	/// use midgard_rs::Midgard;
35	/// use midgard_rs::TimePeriod;
36	/// use rand::prelude::*;
37	/// # tokio_test::block_on(async {
38	/// let mut midgard = Midgard::new();
39	///
40        /// // Get a random pool
41	/// let pool_list = midgard.get_pool_list(None, None).await.unwrap();
42	/// let random_usize = thread_rng().gen_range(0..pool_list.get_pools().len());
43	/// let pool = pool_list.get_pools()[random_usize].clone();
44	/// let pool = pool.get_asset().to_string();
45	///
46        /// // Get details of the pool
47	/// let details = midgard.get_details_of_pool(&pool, None).await.unwrap();
48	/// assert!(!details.get_annual_percentage_rate().is_zero());
49	/// # });
50	/// ```
51        /// 
52        /// # Errors
53        /// todo
54	pub async fn get_details_of_pool(&mut self, pool: &str, period: Option<TimePeriod>) -> Result<Pool> {
55		// Wait for rate limit timer
56		self.sleep_until_ok_to_call().await;
57
58		self.set_last_call(Utc::now());
59		api_get_details_of_pool(self.get_config().get_base_url(), pool, period).await
60	}
61
62        /// Returns an object with known pools and their statuses.
63        /// # Example
64        /// ```rust
65        /// use midgard_rs::Midgard;
66        /// use midgard_rs::PoolStatus;
67        /// # tokio_test::block_on(async {
68        /// let mut midgard = Midgard::new();
69        /// 
70        /// let known_pool_list = midgard.get_known_pool_list().await.unwrap();
71        /// assert!(!known_pool_list.into_iter().collect::<Vec<(String, PoolStatus)>>().is_empty());
72        /// # });
73        /// ```
74        /// 
75        /// # Errors
76        /// todo
77        pub async fn get_known_pool_list(&mut self) -> Result<KnownPoolList> {
78                // Wait for rate limit timer
79                self.sleep_until_ok_to_call().await;
80
81                self.set_last_call(Utc::now());
82                api_get_known_pool_list(self.get_config().get_base_url()).await
83        }
84
85        /// Statistics about the pool. The description of the fields have pointers about the corresponding v2/history location. Visit the history endpoint for drilldowns.
86        /// # Example
87        /// ```rust
88        /// use midgard_rs::Midgard;
89        /// use midgard_rs::TimePeriod;
90        /// use rand::prelude::*;
91        /// # tokio_test::block_on(async {
92        /// let mut midgard = Midgard::new();
93        /// 
94        /// // Get a random pool
95        /// let pool_list = midgard.get_pool_list(None, None).await.unwrap();
96        /// let random_usize = thread_rng().gen_range(0..pool_list.get_pools().len());
97        /// let pool = pool_list.get_pools()[random_usize].clone();
98        /// let pool = pool.get_asset().to_string();
99        /// 
100        /// // Get statistics of the pool
101        /// let pool_statistics = midgard.get_statistics_of_pool(&pool, None).await.unwrap();
102        /// assert!(!pool_statistics.get_asset().is_empty());
103        /// # });
104        /// ```
105        /// 
106        /// # Errors
107        /// todo
108        pub async fn get_statistics_of_pool(&mut self, pool: &str, period: Option<TimePeriod>) -> Result<PoolStatistics> {
109                // Wait for rate limit timer
110                self.sleep_until_ok_to_call().await;
111
112                self.set_last_call(Utc::now());
113                api_get_statistics_of_pool(self.get_config().get_base_url(), pool, period).await
114        }
115
116}
117
118#[cfg(test)]
119mod tests {
120	use rand::prelude::*;
121	use serde_json::json;
122
123	use super::*;
124
125	#[tokio::test]
126	async fn test_get_pool_list() {
127		let mut midgard = Midgard::new();
128
129		let pool_list = midgard.get_pool_list(None, None).await.unwrap();
130		println!("{}", json!(pool_list.get_pools()));
131		assert!(!pool_list.get_pools().is_empty());
132	}
133
134	#[tokio::test]
135	async fn test_get_simplified_assets() {
136		let mut midgard = Midgard::new();
137
138		let pool_list = midgard.get_pool_list(None, None).await.unwrap();
139		println!("{}", json!(pool_list.get_simplified_assets()));
140		assert!(!pool_list.get_simplified_assets().is_empty());
141	}
142
143	#[tokio::test]
144	async fn test_get_pool_list_with_status() {
145		let mut midgard = Midgard::new();
146
147		let status = Some(PoolStatus::Available);
148		let period = None;
149
150		let pool_list = midgard.get_pool_list(status, period).await.unwrap();
151		println!("{}", json!(pool_list.get_pools()));
152		assert!(!pool_list.get_pools().is_empty());
153	}
154
155	#[tokio::test]
156	async fn test_get_pool_list_with_period() {
157		let mut midgard = Midgard::new();
158
159		let status = None;
160		let period = Some(TimePeriod::SevenDays);
161
162		let pool_list = midgard.get_pool_list(status, period).await.unwrap();
163		println!("{}", json!(pool_list.get_pools()));
164		assert!(!pool_list.get_pools().is_empty());
165	}
166
167	#[tokio::test]
168	async fn test_get_pool_list_with_status_and_period() {
169		let mut midgard = Midgard::new();
170
171		let status = Some(PoolStatus::Available);
172		let period = Some(TimePeriod::FourteenDays);
173
174		let pool_list = midgard.get_pool_list(status, period).await.unwrap();
175		println!("{}", json!(pool_list.get_pools()));
176		assert!(!pool_list.get_pools().is_empty());
177	}
178
179	#[tokio::test]
180	async fn test_get_details_of_pool() {
181		let mut midgard = Midgard::new();
182
183		let pool_list = midgard.get_pool_list(None, None).await.unwrap();
184		let random_usize = thread_rng().gen_range(0..pool_list.get_pools().len());
185		let pool = pool_list.get_pools()[random_usize].clone();
186		let pool = pool.get_asset().to_string();
187		println!("pool: {}", &pool);
188
189		let details = midgard.get_details_of_pool(&pool, None).await.unwrap();
190		println!("{}", json!(details));
191		assert!(!details.get_annual_percentage_rate().is_zero());
192	}
193
194        #[tokio::test]
195        async fn test_get_known_pool_list() {
196                let mut midgard = Midgard::new();
197
198                let known_pool_list = midgard.get_known_pool_list().await.unwrap();
199                println!("{}", json!(known_pool_list));
200                assert!(!known_pool_list.into_iter().collect::<Vec<(String, PoolStatus)>>().is_empty());
201        }
202
203        #[tokio::test]
204        async fn test_get_statistics_of_pool() {
205                let mut midgard = Midgard::new();
206
207                // Get a random pool
208                let pool_list = midgard.get_pool_list(None, None).await.unwrap();
209                let random_usize = thread_rng().gen_range(0..pool_list.get_pools().len());
210                let pool = pool_list.get_pools()[random_usize].clone();
211                let pool = pool.get_asset().to_string();
212                println!("pool: {}", &pool);
213
214                // Get statistics of the pool
215                let pool_statistics = midgard.get_statistics_of_pool(&pool, None).await.unwrap();
216                println!("{}", json!(pool_statistics));
217                assert!(!pool_statistics.get_asset().is_empty());
218        }
219}