use super::{Option, OptionGreeks};
use std::panic::{catch_unwind, AssertUnwindSafe};
#[derive(Debug)]
pub struct Greeks {
pub delta: f64,
pub vega: f64,
pub theta: f64,
pub rho: f64,
pub lambda: f64,
pub epsilon: f64,
pub gamma: f64,
pub vanna: f64,
pub charm: f64,
pub vomma: f64,
pub veta: f64,
pub vera: f64,
pub speed: f64,
pub zomma: f64,
pub color: f64,
pub ultima: f64,
pub parmicharma: f64,
}
impl Greeks {
#[rustfmt::skip]
pub fn calculate<T: OptionGreeks, S: Option>(model: &T, option: &S) -> Self {
Greeks {
delta: catch_unwind(AssertUnwindSafe(|| model.delta(option))).unwrap_or_default(),
vega: catch_unwind(AssertUnwindSafe(|| model.vega(option))).unwrap_or_default(),
theta: catch_unwind(AssertUnwindSafe(|| model.theta(option))).unwrap_or_default(),
rho: catch_unwind(AssertUnwindSafe(|| model.rho(option))).unwrap_or_default(),
lambda: catch_unwind(AssertUnwindSafe(|| model.lambda(option))).unwrap_or_default(),
epsilon: catch_unwind(AssertUnwindSafe(|| model.epsilon(option))).unwrap_or_default(),
gamma: catch_unwind(AssertUnwindSafe(|| model.gamma(option))).unwrap_or_default(),
vanna: catch_unwind(AssertUnwindSafe(|| model.vanna(option))).unwrap_or_default(),
charm: catch_unwind(AssertUnwindSafe(|| model.charm(option))).unwrap_or_default(),
vomma: catch_unwind(AssertUnwindSafe(|| model.vomma(option))).unwrap_or_default(),
veta: catch_unwind(AssertUnwindSafe(|| model.veta(option))).unwrap_or_default(),
vera: catch_unwind(AssertUnwindSafe(|| model.vera(option))).unwrap_or_default(),
speed: catch_unwind(AssertUnwindSafe(|| model.speed(option))).unwrap_or_default(),
zomma: catch_unwind(AssertUnwindSafe(|| model.zomma(option))).unwrap_or_default(),
color: catch_unwind(AssertUnwindSafe(|| model.color(option))).unwrap_or_default(),
ultima: catch_unwind(AssertUnwindSafe(|| model.ultima(option))).unwrap_or_default(),
parmicharma: catch_unwind(AssertUnwindSafe(|| model.parmicharma(option))).unwrap_or_default(),
}
}
}