use crate::{models::*, BuildQueryParametersExt};
use stellar_rust_sdk_derive::pagination;
#[pagination]
#[derive(Default)]
pub struct AllOffersRequest {
sponsor: Option<String>,
seller: Option<String>,
selling: Option<Asset<IssuedAsset>>,
buying: Option<Asset<IssuedAsset>>,
}
impl Request for AllOffersRequest {
fn get_query_parameters(&self) -> String {
vec![
self.sponsor.as_ref().map(|s| format!("sponsor={}", s)),
self.seller.as_ref().map(|s| format!("seller={}", s)),
self.selling.as_ref().map(|s| format!("selling={}", s)),
self.buying.as_ref().map(|b| format!("buying={}", b)),
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::OFFERS_PATH,
self.get_query_parameters()
)
}
}
impl AllOffersRequest {
pub fn new() -> Self {
AllOffersRequest::default()
}
pub fn set_sponsor(self, sponsor: impl Into<String>) -> Result<AllOffersRequest, String> {
let sponsor = sponsor.into();
if let Err(e) = is_public_key(&sponsor) {
return Err(e.to_string());
}
Ok(AllOffersRequest {
sponsor: Some(sponsor),
..self
})
}
pub fn set_seller(self, seller: impl Into<String>) -> Result<AllOffersRequest, String> {
let seller = seller.into();
if let Err(e) = is_public_key(&seller) {
return Err(e.to_string());
}
Ok(AllOffersRequest {
seller: Some(seller),
..self
})
}
pub fn set_selling(self, selling: Asset<IssuedAsset>) -> AllOffersRequest {
AllOffersRequest {
selling: Some(selling),
..self
}
}
pub fn set_buying(self, buying: Asset<IssuedAsset>) -> AllOffersRequest {
AllOffersRequest {
buying: Some(buying),
..self
}
}
}