use crate::errors::QlResult;
use crate::instruments::Bond;
use crate::require;
use crate::settings::Settings;
use crate::shared::Shared;
use crate::time::businessdayconvention::BusinessDayConvention;
use crate::time::calendar::Calendar;
use crate::time::date::Date;
use crate::types::{Natural, Real};
pub struct ZeroCouponBond {
bond: Bond,
}
impl ZeroCouponBond {
#[allow(clippy::too_many_arguments)]
pub fn new(
settlement_days: Natural,
calendar: Calendar,
face_amount: Real,
maturity_date: Date,
payment_convention: BusinessDayConvention,
redemption: Real,
issue_date: Option<Date>,
settings: Shared<Settings<Date>>,
) -> QlResult<Self> {
require!(face_amount.is_finite(), "face amount must be finite");
require!(redemption.is_finite(), "redemption must be finite");
require!(
(face_amount * redemption / 100.0).is_finite(),
"redemption amount must be finite"
);
require!(maturity_date != Date::null(), "null maturity date");
let payment_date = calendar.adjust(maturity_date, payment_convention);
let mut bond = Bond::new(settlement_days, calendar, issue_date, Vec::new(), settings)?;
bond.set_single_redemption(face_amount, redemption, payment_date)?;
bond.set_maturity_date(maturity_date);
Ok(Self { bond })
}
pub fn bond(&self) -> &Bond {
&self.bond
}
pub fn bond_mut(&mut self) -> &mut Bond {
&mut self.bond
}
pub fn into_bond(self) -> Bond {
self.bond
}
}