use crate::{
core::trade::Side,
currencies::currency::Currency,
indices::marketindex::MarketIndex,
instruments::equity::equityforward::EquityForward,
time::{date::Date, daycounter::DayCounter},
utils::errors::{QSError, Result},
};
#[derive(Default)]
pub struct MakeEquityForward {
identifier: Option<String>,
market_index: Option<MarketIndex>,
delivery_date: Option<Date>,
strike: Option<f64>,
currency: Option<Currency>,
day_counter: Option<DayCounter>,
side: Option<Side>,
}
impl MakeEquityForward {
#[must_use]
pub fn with_identifier(mut self, identifier: String) -> Self {
self.identifier = Some(identifier);
self
}
#[must_use]
pub fn with_market_index(mut self, market_index: MarketIndex) -> Self {
self.market_index = Some(market_index);
self
}
#[must_use]
pub const fn with_delivery_date(mut self, date: Date) -> Self {
self.delivery_date = Some(date);
self
}
#[must_use]
pub const fn with_strike(mut self, strike: f64) -> Self {
self.strike = Some(strike);
self
}
#[must_use]
pub const fn with_currency(mut self, currency: Currency) -> Self {
self.currency = Some(currency);
self
}
#[must_use]
pub const fn with_day_counter(mut self, dc: DayCounter) -> Self {
self.day_counter = Some(dc);
self
}
#[must_use]
pub const fn with_side(mut self, side: Side) -> Self {
self.side = Some(side);
self
}
pub fn build(self) -> Result<EquityForward> {
let identifier = self
.identifier
.ok_or_else(|| QSError::ValueNotSetErr("Identifier".into()))?;
let market_index = self
.market_index
.ok_or_else(|| QSError::ValueNotSetErr("Market index".into()))?;
let delivery_date = self
.delivery_date
.ok_or_else(|| QSError::ValueNotSetErr("Delivery date".into()))?;
let strike = self
.strike
.ok_or_else(|| QSError::ValueNotSetErr("Strike".into()))?;
let currency = self
.currency
.ok_or_else(|| QSError::ValueNotSetErr("Currency".into()))?;
let day_counter = self.day_counter.unwrap_or(DayCounter::Actual360);
Ok(EquityForward::new(
identifier,
market_index,
delivery_date,
strike,
currency,
day_counter,
))
}
}