use crate::{
ad::adreal::IsReal,
indices::marketindex::MarketIndex,
time::{date::Date, enums::TimeUnit, period::Period},
utils::errors::{QSError, Result},
volatility::volatilityindexing::{SmileType, VolatilityType},
};
pub trait VolatilitySurface<T: IsReal> {
fn volatility_from_date(&self, expiry: Date, key: f64) -> Result<T> {
let today = self.reference_date();
let days = expiry - today;
let period = Period::new(
i32::try_from(days).map_err(|_| {
QSError::InvalidValueErr("Unable to transform days into i32.".into())
})?,
TimeUnit::Days,
);
self.volatility_from_period(period, key)
}
fn volatility_from_period(&self, expirty: Period, key: f64) -> Result<T>;
#[must_use]
fn volatility_type(&self) -> VolatilityType;
#[must_use]
fn market_index(&self) -> &MarketIndex;
#[must_use]
fn reference_date(&self) -> Date;
#[must_use]
fn smile_type(&self) -> SmileType;
}