use crate::error::PricingError;
use optionstratlib_core::model::Positive;
use optionstratlib_core::model::{Options, Position};
use rust_decimal::Decimal;
use tracing::trace;
pub trait Profit {
fn calculate_profit_at(&self, price: &Positive) -> Result<Decimal, PricingError>;
fn get_point_at_price(&self, _price: &Positive) -> Result<(Decimal, Decimal), PricingError> {
let profit = self.calculate_profit_at(_price)?;
let price: Decimal = _price.into();
let point = (price, profit);
trace!("get_point_at_price - point: {:?}", point);
Ok(point)
}
}
impl Profit for Options {
fn calculate_profit_at(&self, price: &Positive) -> Result<Decimal, PricingError> {
Ok(self.payoff_at_price(price)?)
}
}
impl Profit for Position {
fn calculate_profit_at(&self, price: &Positive) -> Result<Decimal, PricingError> {
Ok(self.pnl_at_expiration(&Some(price))?)
}
}