use crate::{models::*, BuildQueryParametersExt};
use stellar_rust_sdk_derive::pagination;
#[pagination]
#[derive(Default)]
pub struct AllClaimableBalancesRequest {
sponsor: Option<String>,
asset: Option<Asset<IssuedAsset>>,
claimant: Option<String>,
}
impl Request for AllClaimableBalancesRequest {
fn get_query_parameters(&self) -> String {
vec![
self.sponsor.as_ref().map(|s| format!("sponsor={}", s)),
self.asset.as_ref().map(|a| format!("asset={}", a)),
self.claimant.as_ref().map(|c| format!("claimant={}", c)),
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::CLAIMABLE_BALANCES_PATH,
self.get_query_parameters()
)
}
}
impl AllClaimableBalancesRequest {
pub fn new() -> Self {
AllClaimableBalancesRequest::default()
}
pub fn set_sponsor(self, sponsor: impl Into<String>) -> Result<AllClaimableBalancesRequest, String> {
let sponsor = sponsor.into();
if let Err(e) = is_public_key(&sponsor) {
return Err(e.to_string());
}
Ok(AllClaimableBalancesRequest {
sponsor: Some(sponsor),
..self
})
}
pub fn set_asset(self, asset: Asset<IssuedAsset>) -> AllClaimableBalancesRequest {
AllClaimableBalancesRequest {
asset: Some(asset),
..self
}
}
pub fn set_claimant(self, claimant: impl Into<String>) -> Result<AllClaimableBalancesRequest, String> {
let claimant = claimant.into();
if let Err(e) = is_public_key(&claimant) {
return Err(e.to_string());
}
Ok(AllClaimableBalancesRequest {
claimant: Some(claimant),
..self
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_set_cursor_valid() {
let request = AllClaimableBalancesRequest::new()
.set_cursor(12345)
.unwrap();
assert_eq!(request.cursor.unwrap(), 12345);
}
#[test]
fn test_set_cursor_invalid() {
let request = AllClaimableBalancesRequest::new().set_cursor(0);
assert_eq!(
request.err().unwrap(),
"Cursor must be greater than or equal to 1.".to_string()
);
}
#[test]
fn test_set_limit_valid() {
let request = AllClaimableBalancesRequest::new().set_limit(20).unwrap();
assert_eq!(request.limit.unwrap(), 20);
}
#[test]
fn test_set_limit_invalid_low() {
let request = AllClaimableBalancesRequest::new().set_limit(0);
assert_eq!(
request.err().unwrap(),
"Limit must be between 1 and 200.".to_string()
);
}
#[test]
fn test_set_limit_invalid_high() {
let request = AllClaimableBalancesRequest::new().set_limit(201);
assert_eq!(
request.err().unwrap(),
"Limit must be between 1 and 200.".to_string()
);
}
}