use crate::models::prelude::AssetType;
use crate::models::*;
use stellar_rust_sdk_derive::pagination;
#[derive(PartialEq, Debug)]
pub struct TradeAsset(AssetType);
#[pagination]
#[derive(PartialEq, Default)]
pub struct AllTradesRequest {
pub base_asset: Option<TradeAsset>,
pub counter_asset: Option<TradeAsset>,
pub offer_id: Option<String>,
}
impl AllTradesRequest {
pub fn new() -> Self {
AllTradesRequest::default()
}
pub fn set_base_asset(self, base_asset: AssetType) -> Result<AllTradesRequest, String> {
Ok(AllTradesRequest {
base_asset: Some(TradeAsset(base_asset)),
..self
})
}
pub fn set_counter_asset(self, counter_asset: AssetType) -> Result<AllTradesRequest, String> {
Ok(AllTradesRequest {
counter_asset: Some(TradeAsset(counter_asset)),
..self
})
}
}
impl Request for AllTradesRequest {
fn get_query_parameters(&self) -> String {
let mut query: Vec<String> = Vec::new();
if let Some(base_asset) = &self.base_asset {
match &base_asset.0 {
AssetType::Native => {
query.push(format!("base_asset_type=native"));
}
AssetType::Alphanumeric4(asset) => {
query.push(format!("base_asset_type=credit_alphanum4"));
query.push(format!("&base_asset_code={}", asset.asset_code));
query.push(format!("&base_asset_issuer={}", asset.asset_issuer));
}
AssetType::Alphanumeric12(asset) => {
query.push(format!("base_asset_type=credit_alphanum12"));
query.push(format!("&base_asset_code={}", asset.asset_code));
query.push(format!("&base_asset_issuer={}", asset.asset_issuer));
}
}
}
if let Some(counter_asset) = &self.counter_asset {
match &counter_asset.0 {
AssetType::Native => {
query.push(format!("&counter_asset_type=native"));
}
AssetType::Alphanumeric4(asset) => {
query.push(format!("&counter_asset_type=credit_alphanum4"));
query.push(format!("&counter_asset_code={}", asset.asset_code));
query.push(format!("&counter_asset_issuer={}", asset.asset_issuer));
}
AssetType::Alphanumeric12(asset) => {
query.push(format!("&counter_asset_type=credit_alphanum12"));
query.push(format!("&counter_asset_code={}", asset.asset_code));
query.push(format!("&counter_asset_issuer={}", asset.asset_issuer));
}
}
}
query.join("")
}
fn build_url(&self, base_url: &str) -> String {
format!(
"{}/{}?{}",
base_url,
super::TRADES_PATH,
self.get_query_parameters()
)
}
}