use crate::{
core::{
collateral::HasCurrency,
instrument::{AssetClass, Instrument},
request::LegsProvider,
trade::{Side, Trade},
},
currencies::currency::Currency,
indices::marketindex::MarketIndex,
instruments::cashflows::leg::Leg,
time::date::Date,
};
pub struct FixedRateDeposit {
identifier: String,
units: f64,
leg: Leg,
market_index: MarketIndex,
currency: Currency,
}
impl FixedRateDeposit {
#[must_use]
pub const fn new(
identifier: String,
units: f64,
leg: Leg,
market_index: MarketIndex,
currency: Currency,
) -> Self {
Self {
identifier,
units,
leg,
market_index,
currency,
}
}
#[must_use]
pub const fn units(&self) -> f64 {
self.units
}
#[must_use]
pub const fn leg(&self) -> &Leg {
&self.leg
}
#[must_use]
pub fn market_index(&self) -> MarketIndex {
self.market_index.clone()
}
}
impl HasCurrency for FixedRateDeposit {
fn currency(&self) -> Currency {
self.currency
}
}
impl Instrument for FixedRateDeposit {
fn identifier(&self) -> String {
self.identifier.clone()
}
fn asset_class(&self) -> AssetClass {
AssetClass::FixedIncome
}
}
impl LegsProvider for FixedRateDeposit {
fn legs(&self) -> &[Leg] {
std::slice::from_ref(&self.leg)
}
}
pub struct FixedRateDepositTrade {
instrument: FixedRateDeposit,
trade_date: Date,
notional: f64,
side: Side,
}
impl FixedRateDepositTrade {
#[must_use]
pub const fn new(
instrument: FixedRateDeposit,
trade_date: Date,
notional: f64,
side: Side,
) -> Self {
Self {
instrument,
trade_date,
notional,
side,
}
}
#[must_use]
pub const fn notional(&self) -> f64 {
self.notional
}
}
impl Trade<FixedRateDeposit> for FixedRateDepositTrade {
fn instrument(&self) -> &FixedRateDeposit {
&self.instrument
}
fn trade_date(&self) -> Date {
self.trade_date
}
fn side(&self) -> Side {
self.side
}
}
impl LegsProvider for FixedRateDepositTrade {
fn legs(&self) -> &[Leg] {
self.instrument.legs()
}
}