use serde::{Deserialize, Serialize};
use crate::{
currencies::currency::Currency,
indices::marketindex::MarketIndex,
math::interpolation::interpolator::Interpolator,
time::{daycounter::DayCounter, enums::Frequency},
};
const fn default_day_counter() -> DayCounter {
DayCounter::Actual360
}
const fn default_premium_frequency() -> Frequency {
Frequency::Quarterly
}
const fn default_interpolator() -> Interpolator {
Interpolator::LogLinear
}
const fn default_enable_extrapolation() -> bool {
true
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreditCurveConfiguration {
market_index: MarketIndex,
currency: Currency,
discount_index: MarketIndex,
recovery: f64,
#[serde(default = "default_day_counter")]
day_counter: DayCounter,
#[serde(default = "default_premium_frequency")]
premium_frequency: Frequency,
#[serde(default = "default_interpolator")]
interpolator: Interpolator,
#[serde(default = "default_enable_extrapolation")]
enable_extrapolation: bool,
#[serde(default)]
quotes: Vec<String>,
}
impl CreditCurveConfiguration {
#[must_use]
pub const fn new(
market_index: MarketIndex,
currency: Currency,
discount_index: MarketIndex,
recovery: f64,
quotes: Vec<String>,
) -> Self {
Self {
market_index,
currency,
discount_index,
recovery,
day_counter: default_day_counter(),
premium_frequency: default_premium_frequency(),
interpolator: default_interpolator(),
enable_extrapolation: default_enable_extrapolation(),
quotes,
}
}
#[must_use]
pub const fn with_day_counter(mut self, day_counter: DayCounter) -> Self {
self.day_counter = day_counter;
self
}
#[must_use]
pub const fn with_premium_frequency(mut self, frequency: Frequency) -> Self {
self.premium_frequency = frequency;
self
}
#[must_use]
pub const fn market_index(&self) -> &MarketIndex {
&self.market_index
}
#[must_use]
pub const fn currency(&self) -> Currency {
self.currency
}
#[must_use]
pub const fn discount_index(&self) -> &MarketIndex {
&self.discount_index
}
#[must_use]
pub const fn recovery(&self) -> f64 {
self.recovery
}
#[must_use]
pub const fn day_counter(&self) -> DayCounter {
self.day_counter
}
#[must_use]
pub const fn premium_frequency(&self) -> Frequency {
self.premium_frequency
}
#[must_use]
pub const fn interpolator(&self) -> Interpolator {
self.interpolator
}
#[must_use]
pub const fn enable_extrapolation(&self) -> bool {
self.enable_extrapolation
}
#[must_use]
pub fn quotes(&self) -> &[String] {
&self.quotes
}
}