use crate::conventions::{round_cents, Sat, TaxDate, Usd, SATS_PER_BTC};
pub trait PriceProvider {
fn usd_per_btc(&self, date: TaxDate) -> Option<Usd>;
}
pub fn fmv_of(prices: &dyn PriceProvider, date: TaxDate, sat: Sat) -> Option<Usd> {
let px = prices.usd_per_btc(date)?;
px.checked_mul(Usd::from(sat))
.and_then(|x| x.checked_div(Usd::from(SATS_PER_BTC)))
.map(round_cents)
}
#[derive(Debug, Default, Clone)]
pub struct StaticPrices(pub std::collections::BTreeMap<TaxDate, Usd>);
impl PriceProvider for StaticPrices {
fn usd_per_btc(&self, date: TaxDate) -> Option<Usd> {
self.0.get(&date).copied()
}
}