use crate::{
core::collateral::DiscountPolicy,
xva::{contigentclaim::ContingentClaim, csa::CsaTerms},
};
pub struct NettingSet {
claims: Vec<ContingentClaim>,
discount_policy: Box<dyn DiscountPolicy>,
csa_terms: Option<CsaTerms>,
}
impl NettingSet {
#[must_use]
pub fn new(claims: Vec<ContingentClaim>, discount_policy: Box<dyn DiscountPolicy>) -> Self {
Self {
claims,
discount_policy,
csa_terms: None,
}
}
#[must_use]
pub fn with_csa_terms(claims: Vec<ContingentClaim>, csa_terms: CsaTerms) -> Self {
let policy = csa_terms.discount_policy();
Self {
claims,
discount_policy: Box::new(policy),
csa_terms: Some(csa_terms),
}
}
#[must_use]
pub const fn csa_terms(&self) -> Option<&CsaTerms> {
self.csa_terms.as_ref()
}
#[must_use]
pub fn claims(&self) -> &[ContingentClaim] {
&self.claims
}
pub fn claims_mut(&mut self) -> &mut [ContingentClaim] {
&mut self.claims
}
pub(crate) const fn claims_vec_mut(&mut self) -> &mut Vec<ContingentClaim> {
&mut self.claims
}
#[must_use]
pub fn discount_policy(&self) -> &dyn DiscountPolicy {
&*self.discount_policy
}
pub fn discount_policy_and_claims_mut(
&mut self,
) -> (&dyn DiscountPolicy, &mut [ContingentClaim]) {
(&*self.discount_policy, &mut self.claims)
}
#[must_use]
pub fn into_claims(self) -> Vec<ContingentClaim> {
self.claims
}
#[must_use]
pub const fn len(&self) -> usize {
self.claims.len()
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.claims.is_empty()
}
}