use crate::chain::ChainId;
use crate::proto::v2;
#[derive(Debug, Clone)]
pub struct AssetAmount {
pub asset: String,
pub amount: String,
}
pub trait SchemeServer: super::SchemeId + Send + Sync {
fn parse_price(
&self,
price: &str,
network: &ChainId,
) -> Result<AssetAmount, Box<dyn std::error::Error>>;
fn enhance_requirements(
&self,
requirements: v2::PaymentRequirements,
) -> v2::PaymentRequirements {
requirements
}
fn build_requirements(
&self,
price: &str,
network: &ChainId,
pay_to: &str,
max_timeout_seconds: u64,
) -> Result<v2::PaymentRequirements, Box<dyn std::error::Error>> {
let asset_amount = self.parse_price(price, network)?;
let base = v2::PaymentRequirements {
scheme: self.scheme().to_owned(),
network: network.clone(),
amount: asset_amount.amount,
pay_to: pay_to.to_owned(),
max_timeout_seconds,
asset: asset_amount.asset,
extra: None,
};
Ok(self.enhance_requirements(base))
}
}