stellar-rs 1.0.0

A Rust SDK for the Stellar network.
Documentation
use crate::models::{Order, Request};
use crate::BuildQueryParametersExt;
use stellar_rust_sdk_derive::pagination;

/// Represents the request to fetch effects for a specific liquidity pool from the Horizon API.

/// `EffectsForLiquidityPoolRequest` is a struct used to construct queries for retrieving information about effects
/// from the Horizon server. It includes parameters that allow for pagination control and sorting
/// of the effect records.

/// # Usage
/// Instances of `EffectsForLiquidityPoolRequest` are created and optionally configured using the builder pattern.
/// Once the desired parameters are set, the request can be passed to the Horizon client to fetch
/// effect data.
///
/// # Fields
/// * `liquidity_pool_id` - The liquidity pool id.
/// * `cursor` - A pointer to a specific location in a collection of responses, derived from the
///   `paging_token` value of a record. Used for pagination control in the API response.
/// * `limit` - Specifies the maximum number of records to be returned in a single response.
///
/// # Example
/// ```rust
/// # use stellar_rs::effects::effects_for_liquidity_pools_request::EffectsForLiquidityPoolRequest;
/// # use stellar_rs::models::*;
///
/// let request = EffectsForLiquidityPoolRequest::new()
///     .set_liquidity_pool_id("01c58ab8fb283c8b083a26bf2fe06b7b6c6304c13f9d29d956cdf15a48bea72d")
///     .set_cursor(1234).unwrap()
///     .set_limit(20).unwrap()
///     .set_order(Order::Desc);
///
/// // The request can now be used with a Horizon client to fetch effects.
/// ```
///
#[pagination]
#[derive(Default)]
pub struct EffectsForLiquidityPoolRequest {
    /// The liquidity pool id
    liquidity_pool_id: Option<String>,
}

impl EffectsForLiquidityPoolRequest {
    /// Creates a new `EffectsForLiquidityPoolsRequest` with default parameters.
    pub fn new() -> Self {
        EffectsForLiquidityPoolRequest::default()
    }

    /// Sets the liquidity pool id for the request.
    ///
    /// # Arguments
    /// * `liquidity_pool_id` - A `String` value representing the liquidity pool id.
    ///
    pub fn set_liquidity_pool_id(
        self,
        liquidity_pool_id: impl Into<String>,
    ) -> EffectsForLiquidityPoolRequest {
        EffectsForLiquidityPoolRequest {
            liquidity_pool_id: Some(liquidity_pool_id.into()),
            ..self
        }
    }
}

impl Request for EffectsForLiquidityPoolRequest {
    //TODO research different url buildig methods
    fn get_query_parameters(&self) -> String {
        vec![
            self.liquidity_pool_id
                .as_ref()
                .map(|l| format!("liquidity_pool_id={}", l)),
            self.cursor.as_ref().map(|c| format!("cursor={}", c)),
            self.limit.as_ref().map(|l| format!("limit={}", l)),
            self.order.as_ref().map(|o| format!("order={}", o)),
        ]
        .build_query_parameters()
    }

    fn build_url(&self, base_url: &str) -> String {
        format!(
            "{}/{}{}",
            base_url,
            super::EFFECTS_PATH,
            self.get_query_parameters()
        )
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::BuildQueryParametersExt;

    #[test]
    fn test_effects_for_liquidity_pools_request() {
        let request = EffectsForLiquidityPoolRequest::new()
            .set_liquidity_pool_id("liquidity_pool_id")
            .set_cursor(1)
            .unwrap()
            .set_limit(10)
            .unwrap()
            .set_order(Order::Asc)
            .unwrap();

        let url = request.build_url("https://horizon-testnet.stellar.org");
        let query_parameters = vec![
            Some("liquidity_pool_id=liquidity_pool_id".to_string()),
            Some("cursor=1".to_string()),
            Some("limit=10".to_string()),
            Some("order=asc".to_string()),
        ]
        .build_query_parameters();

        assert_eq!(
            url,
            "https://horizon-testnet.stellar.org/effects?liquidity_pool_id=liquidity_pool_id&cursor=1&limit=10&order=asc"
        );
        assert_eq!(
            query_parameters,
            "?liquidity_pool_id=liquidity_pool_id&cursor=1&limit=10&order=asc"
        );
    }
}