use compact_str::CompactString;
use crate::chain::ChainId;
use crate::scheme::sealed::Sealed;
use crate::wire::PaymentRequirements;
#[derive(Debug, Clone)]
pub struct AssetAmount {
pub asset: CompactString,
pub amount: CompactString,
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum SchemeServerError {
#[error("invalid price: {0}")]
InvalidPrice(String),
#[error("unsupported chain or asset: {0}")]
UnsupportedChain(String),
#[error("{0}")]
Other(String),
}
pub trait SchemeServer: super::SchemeId + Sealed + Send + Sync {
fn parse_price(&self, price: &str, network: &ChainId)
-> Result<AssetAmount, SchemeServerError>;
fn enhance_requirements(&self, requirements: PaymentRequirements) -> PaymentRequirements {
requirements
}
fn build_requirements(
&self,
price: &str,
network: &ChainId,
pay_to: &str,
max_timeout_seconds: u64,
) -> Result<PaymentRequirements, SchemeServerError> {
let AssetAmount { asset, amount } = self.parse_price(price, network)?;
let base = PaymentRequirements {
scheme: CompactString::from(self.scheme()),
network: network.clone(),
amount,
pay_to: CompactString::from(pay_to),
max_timeout_seconds,
asset,
extra: None,
};
Ok(self.enhance_requirements(base))
}
}