use crate::models::{is_public_key, Request};
use crate::paths::*;
use crate::BuildQueryParametersExt;
#[derive(Default)]
pub struct FindPaymentsPathRequest<
DAs = NoDestinationAsset,
DAm = NoDestinationAmount,
S = NoSourceAccount,
> {
pub destination_asset: DAs,
pub destination_amount: DAm,
pub destination_account: Option<String>,
pub source_account: S,
}
impl FindPaymentsPathRequest<NoDestinationAsset, NoDestinationAmount, NoSourceAccount> {
pub fn new() -> Self {
FindPaymentsPathRequest {
destination_asset: NoDestinationAsset,
destination_amount: NoDestinationAmount,
destination_account: None,
source_account: NoSourceAccount,
}
}
}
impl<DAs, DAm, S> FindPaymentsPathRequest<DAs, DAm, S> {
pub fn set_destination_asset(
self,
destination_asset_type: AssetType,
) -> Result<FindPaymentsPathRequest<DestinationAsset, DAm, S>, String> {
Ok(FindPaymentsPathRequest {
destination_asset: DestinationAsset(destination_asset_type),
destination_amount: self.destination_amount,
destination_account: self.destination_account,
source_account: self.source_account,
})
}
pub fn set_destination_amount(
self,
destination_amount: impl Into<String>,
) -> Result<FindPaymentsPathRequest<DAs, DestinationAmount, S>, String> {
Ok(FindPaymentsPathRequest {
destination_asset: self.destination_asset,
destination_amount: DestinationAmount(destination_amount.into()),
destination_account: self.destination_account,
source_account: self.source_account,
})
}
pub fn set_source_account(
self,
source_account: impl Into<String>,
) -> Result<FindPaymentsPathRequest<DAs, DAm, SourceAccount>, String> {
let source_account = source_account.into();
if let Err(e) = is_public_key(&source_account) {
return Err(e.to_string());
}
Ok(FindPaymentsPathRequest {
destination_asset: self.destination_asset,
destination_amount: self.destination_amount,
destination_account: self.destination_account,
source_account: SourceAccount(source_account),
})
}
}
impl FindPaymentsPathRequest<DestinationAsset, DestinationAmount, SourceAccount> {
pub fn set_destination_account(
self,
destination_account: impl Into<String>,
) -> Result<FindPaymentsPathRequest<DestinationAsset, DestinationAmount, SourceAccount>, String>
{
let destination_account = destination_account.into();
if let Err(e) = is_public_key(&destination_account) {
return Err(e.to_string());
}
Ok(FindPaymentsPathRequest {
destination_asset: self.destination_asset,
destination_amount: self.destination_amount,
destination_account: Some(destination_account),
source_account: self.source_account,
})
}
}
impl Request for FindPaymentsPathRequest<DestinationAsset, DestinationAmount, SourceAccount> {
fn get_query_parameters(&self) -> String {
let asset_type_prefix = "destination_asset_type=";
let asset_code_prefix = "&destination_asset_code=";
let asset_issuer_prefix = "&destination_asset_issuer=";
let parameters = match &self.destination_asset {
DestinationAsset(AssetType::Native) => format!("{}native", asset_type_prefix),
DestinationAsset(AssetType::Alphanumeric4(asset_data))
| DestinationAsset(AssetType::Alphanumeric12(asset_data)) => {
let asset_type = match self.destination_asset {
DestinationAsset(AssetType::Alphanumeric4(_)) => "credit_alphanum4",
DestinationAsset(AssetType::Alphanumeric12(_)) => "credit_alphanum12",
_ => "", };
format!(
"{}{}{}{}{}{}",
asset_type_prefix,
asset_type,
asset_code_prefix,
asset_data.asset_code,
asset_issuer_prefix,
asset_data.asset_issuer
)
}
};
vec![
Some(parameters),
Some(format!("destination_amount={}", self.destination_amount.0)),
self.destination_account
.as_ref()
.map(|d| format!("destination_account={}", d)),
Some(format!("source_account={}", self.source_account.0)),
]
.build_query_parameters()
}
fn build_url(&self, base_url: &str) -> String {
format!(
"{}/{}{}",
base_url,
super::PATHS_PATH,
self.get_query_parameters()
)
}
}