mod capfloortermvolsurface;
pub use capfloortermvolsurface::CapFloorTermVolSurface;
use crate::errors::QlResult;
use crate::termstructures::volatility::VolatilityTermStructure;
use crate::time::date::Date;
use crate::time::period::Period;
use crate::types::{Rate, Time, Volatility};
pub trait CapFloorTermVolatilityStructure: VolatilityTermStructure {
fn volatility_impl(&self, length: Time, strike: Rate) -> QlResult<Volatility>;
fn volatility_tenor(
&self,
length: Period,
strike: Rate,
extrapolate: bool,
) -> QlResult<Volatility> {
let end = self.option_date_from_tenor(length)?;
self.volatility_date(end, strike, extrapolate)
}
fn volatility_date(&self, end: Date, strike: Rate, extrapolate: bool) -> QlResult<Volatility> {
self.check_range_date(end, extrapolate)?;
let t = self.time_from_reference(end)?;
self.volatility_time(t, strike, extrapolate)
}
fn volatility_time(&self, t: Time, strike: Rate, extrapolate: bool) -> QlResult<Volatility> {
self.check_range_time(t, extrapolate)?;
self.check_strike(strike, extrapolate)?;
self.volatility_impl(t, strike)
}
}