use crate::{models::*, BuildQueryParametersExt};
use stellar_rust_sdk_derive::pagination;
#[pagination]
#[derive(Default)]
pub struct AllAssetsRequest {
asset_code: Option<String>,
asset_issuer: Option<String>,
}
impl Request for AllAssetsRequest {
fn get_query_parameters(&self) -> String {
vec![
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)),
self.asset_code
.as_ref()
.map(|ac| format!("asset_code={}", ac)),
self.asset_issuer
.as_ref()
.map(|ac| format!("asset_issuer={}", ac)),
]
.build_query_parameters()
}
fn build_url(&self, base_url: &str) -> String {
format!(
"{}/{}{}",
base_url,
super::ASSET_PATH,
self.get_query_parameters()
)
}
}
impl AllAssetsRequest {
pub fn new() -> AllAssetsRequest {
AllAssetsRequest::default()
}
pub fn set_asset_code(self, asset_code: &str) -> Result<AllAssetsRequest, String> {
if asset_code.len() > 12 {
return Err("asset_code must be 12 characters or less".to_string());
}
Ok(AllAssetsRequest {
asset_code: Some(asset_code.to_string()),
..self
})
}
pub fn set_asset_issuer(self, asset_issuer: &str) -> Result<AllAssetsRequest, String> {
if asset_issuer.len() != 56 {
return Err("asset_issuer must be 56 characters".to_string());
}
Ok(AllAssetsRequest {
asset_issuer: Some(asset_issuer.to_string()),
..self
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_set_asset_code_valid() {
let request = AllAssetsRequest::new().set_asset_code("XLM").unwrap();
assert_eq!(request.asset_code.unwrap(), "XLM");
}
#[test]
fn test_set_asset_code_invalid() {
let request = AllAssetsRequest::new().set_asset_code("XLM123456789012");
assert_eq!(
request.err().unwrap(),
"asset_code must be 12 characters or less"
);
}
#[test]
fn test_set_asset_issuer_valid() {
let request = AllAssetsRequest::new()
.set_asset_issuer("Baseflow_TechnologyInnovationAndSoftwareDevelopment_2023")
.unwrap();
assert_eq!(
request.asset_issuer.unwrap(),
"Baseflow_TechnologyInnovationAndSoftwareDevelopment_2023"
);
}
#[test]
fn test_set_asset_issuer_invalid() {
let request = AllAssetsRequest::new()
.set_asset_issuer("BaseflowSoftwareDevelopmentPowerhouse_InnovativeSolutions2023");
assert_eq!(
request.err().unwrap(),
"asset_issuer must be 56 characters".to_string()
);
}
#[test]
fn test_set_cursor_valid() {
let request = AllAssetsRequest::new().set_cursor(12345).unwrap();
assert_eq!(request.cursor.unwrap(), 12345);
}
#[test]
fn test_set_cursor_invalid() {
let request = AllAssetsRequest::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 = AllAssetsRequest::new().set_limit(20).unwrap();
assert_eq!(request.limit.unwrap(), 20);
}
#[test]
fn test_set_limit_invalid_low() {
let request = AllAssetsRequest::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 = AllAssetsRequest::new().set_limit(201);
assert_eq!(
request.err().unwrap(),
"Limit must be between 1 and 200.".to_string()
);
}
}