use crate::{
core::{
instrument::{AssetClass, Instrument},
request::LegsProvider,
trade::{Side, Trade},
},
currencies::currency::Currency,
indices::marketindex::MarketIndex,
instruments::cashflows::leg::Leg,
time::date::Date,
};
pub struct CrossCurrencySwap {
identifier: String,
legs: Vec<Leg>,
domestic_currency: Currency,
foreign_currency: Currency,
domestic_market_index: MarketIndex,
foreign_market_index: MarketIndex,
}
impl CrossCurrencySwap {
#[must_use]
pub fn new(
identifier: String,
domestic_leg: Leg,
foreign_leg: Leg,
domestic_currency: Currency,
foreign_currency: Currency,
domestic_market_index: MarketIndex,
foreign_market_index: MarketIndex,
) -> Self {
Self {
identifier,
legs: vec![domestic_leg, foreign_leg],
domestic_currency,
foreign_currency,
domestic_market_index,
foreign_market_index,
}
}
#[must_use]
pub fn domestic_leg(&self) -> &Leg {
&self.legs[0]
}
#[must_use]
pub fn foreign_leg(&self) -> &Leg {
&self.legs[1]
}
#[must_use]
pub const fn domestic_currency(&self) -> Currency {
self.domestic_currency
}
#[must_use]
pub const fn foreign_currency(&self) -> Currency {
self.foreign_currency
}
#[must_use]
pub fn domestic_market_index(&self) -> MarketIndex {
self.domestic_market_index.clone()
}
#[must_use]
pub fn foreign_market_index(&self) -> MarketIndex {
self.foreign_market_index.clone()
}
}
impl Instrument for CrossCurrencySwap {
fn identifier(&self) -> String {
self.identifier.clone()
}
fn asset_class(&self) -> AssetClass {
AssetClass::Fx
}
}
impl LegsProvider for CrossCurrencySwap {
fn legs(&self) -> &[Leg] {
&self.legs
}
}
pub struct CrossCurrencySwapTrade {
instrument: CrossCurrencySwap,
trade_date: Date,
domestic_notional: f64,
foreign_notional: f64,
side: Side,
}
impl CrossCurrencySwapTrade {
#[must_use]
pub const fn new(
instrument: CrossCurrencySwap,
trade_date: Date,
domestic_notional: f64,
foreign_notional: f64,
side: Side,
) -> Self {
Self {
instrument,
trade_date,
domestic_notional,
foreign_notional,
side,
}
}
#[must_use]
pub const fn domestic_notional(&self) -> f64 {
self.domestic_notional
}
#[must_use]
pub const fn foreign_notional(&self) -> f64 {
self.foreign_notional
}
}
impl Trade<CrossCurrencySwap> for CrossCurrencySwapTrade {
fn instrument(&self) -> &CrossCurrencySwap {
&self.instrument
}
fn trade_date(&self) -> Date {
self.trade_date
}
fn side(&self) -> Side {
self.side
}
}
impl LegsProvider for CrossCurrencySwapTrade {
fn legs(&self) -> &[Leg] {
self.instrument.legs()
}
}