stellar_rs/effects/
effects_for_liquidity_pools_request.rs

1use crate::models::{Order, Request};
2use crate::BuildQueryParametersExt;
3use stellar_rust_sdk_derive::pagination;
4
5/// Represents the request to fetch effects for a specific liquidity pool from the Horizon API.
6
7/// `EffectsForLiquidityPoolRequest` is a struct used to construct queries for retrieving information about effects
8/// from the Horizon server. It includes parameters that allow for pagination control and sorting
9/// of the effect records.
10
11/// # Usage
12/// Instances of `EffectsForLiquidityPoolRequest` are created and optionally configured using the builder pattern.
13/// Once the desired parameters are set, the request can be passed to the Horizon client to fetch
14/// effect data.
15///
16/// # Fields
17/// * `liquidity_pool_id` - The liquidity pool id.
18/// * `cursor` - A pointer to a specific location in a collection of responses, derived from the
19///   `paging_token` value of a record. Used for pagination control in the API response.
20/// * `limit` - Specifies the maximum number of records to be returned in a single response.
21///
22/// # Example
23/// ```rust
24/// # use stellar_rs::effects::effects_for_liquidity_pools_request::EffectsForLiquidityPoolRequest;
25/// # use stellar_rs::models::*;
26///
27/// let request = EffectsForLiquidityPoolRequest::new()
28///     .set_liquidity_pool_id("01c58ab8fb283c8b083a26bf2fe06b7b6c6304c13f9d29d956cdf15a48bea72d")
29///     .set_cursor(1234).unwrap()
30///     .set_limit(20).unwrap()
31///     .set_order(Order::Desc);
32///
33/// // The request can now be used with a Horizon client to fetch effects.
34/// ```
35///
36#[pagination]
37#[derive(Default)]
38pub struct EffectsForLiquidityPoolRequest {
39    /// The liquidity pool id
40    liquidity_pool_id: Option<String>,
41}
42
43impl EffectsForLiquidityPoolRequest {
44    /// Creates a new `EffectsForLiquidityPoolsRequest` with default parameters.
45    pub fn new() -> Self {
46        EffectsForLiquidityPoolRequest::default()
47    }
48
49    /// Sets the liquidity pool id for the request.
50    ///
51    /// # Arguments
52    /// * `liquidity_pool_id` - A `String` value representing the liquidity pool id.
53    ///
54    pub fn set_liquidity_pool_id(
55        self,
56        liquidity_pool_id: impl Into<String>,
57    ) -> EffectsForLiquidityPoolRequest {
58        EffectsForLiquidityPoolRequest {
59            liquidity_pool_id: Some(liquidity_pool_id.into()),
60            ..self
61        }
62    }
63}
64
65impl Request for EffectsForLiquidityPoolRequest {
66    //TODO research different url buildig methods
67    fn get_query_parameters(&self) -> String {
68        vec![
69            self.liquidity_pool_id
70                .as_ref()
71                .map(|l| format!("liquidity_pool_id={}", l)),
72            self.cursor.as_ref().map(|c| format!("cursor={}", c)),
73            self.limit.as_ref().map(|l| format!("limit={}", l)),
74            self.order.as_ref().map(|o| format!("order={}", o)),
75        ]
76        .build_query_parameters()
77    }
78
79    fn build_url(&self, base_url: &str) -> String {
80        format!(
81            "{}/{}{}",
82            base_url,
83            super::EFFECTS_PATH,
84            self.get_query_parameters()
85        )
86    }
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92    use crate::BuildQueryParametersExt;
93
94    #[test]
95    fn test_effects_for_liquidity_pools_request() {
96        let request = EffectsForLiquidityPoolRequest::new()
97            .set_liquidity_pool_id("liquidity_pool_id")
98            .set_cursor(1)
99            .unwrap()
100            .set_limit(10)
101            .unwrap()
102            .set_order(Order::Asc)
103            .unwrap();
104
105        let url = request.build_url("https://horizon-testnet.stellar.org");
106        let query_parameters = vec![
107            Some("liquidity_pool_id=liquidity_pool_id".to_string()),
108            Some("cursor=1".to_string()),
109            Some("limit=10".to_string()),
110            Some("order=asc".to_string()),
111        ]
112        .build_query_parameters();
113
114        assert_eq!(
115            url,
116            "https://horizon-testnet.stellar.org/effects?liquidity_pool_id=liquidity_pool_id&cursor=1&limit=10&order=asc"
117        );
118        assert_eq!(
119            query_parameters,
120            "?liquidity_pool_id=liquidity_pool_id&cursor=1&limit=10&order=asc"
121        );
122    }
123}