use std::collections::{BTreeMap, HashMap};
use crate::{
core::marketdatahandling::{
constructedelementrequest::ConstructedElementRequest,
constructedelementstore::ConstructedElementStore, fixingrequest::FixingRequest,
},
currencies::exchangeratestore::ExchangeRateStore,
indices::marketindex::MarketIndex,
models::ModelParameters,
time::date::Date,
utils::errors::Result,
};
#[derive(Default)]
pub struct MarketDataRequest {
constructed_elements_request: Option<Vec<ConstructedElementRequest>>,
fixings_request: Option<Vec<FixingRequest>>,
models: Vec<ModelParameters>,
needs_exchange_rates: bool,
}
impl MarketDataRequest {
#[must_use]
pub const fn new(
constructed_elements_request: Option<Vec<ConstructedElementRequest>>,
fixings_request: Option<Vec<FixingRequest>>,
) -> Self {
Self {
constructed_elements_request,
fixings_request,
models: Vec::new(),
needs_exchange_rates: false,
}
}
#[must_use]
pub const fn constructed_elements_request(&self) -> Option<&Vec<ConstructedElementRequest>> {
self.constructed_elements_request.as_ref()
}
#[must_use]
pub const fn fixings_request(&self) -> Option<&Vec<FixingRequest>> {
self.fixings_request.as_ref()
}
#[must_use]
pub fn models(&self) -> &[ModelParameters] {
&self.models
}
#[must_use]
pub fn with_constructed_elements_request(
mut self,
request: Vec<ConstructedElementRequest>,
) -> Self {
self.constructed_elements_request = Some(request);
self
}
#[must_use]
pub fn with_fixings_request(mut self, request: Vec<FixingRequest>) -> Self {
self.fixings_request = Some(request);
self
}
#[must_use]
pub const fn needs_exchange_rates(&self) -> bool {
self.needs_exchange_rates
}
#[must_use]
pub const fn with_exchange_rates(mut self) -> Self {
self.needs_exchange_rates = true;
self
}
#[must_use]
pub fn with_models(mut self, models: &[ModelParameters]) -> Self {
models.clone_into(&mut self.models);
self
}
}
#[derive(Clone, Default)]
pub struct MarketData {
fixings: HashMap<MarketIndex, BTreeMap<Date, f64>>,
constructed_elements: ConstructedElementStore,
models: Vec<ModelParameters>,
exchange_rate_store: Option<ExchangeRateStore>,
}
impl MarketData {
#[must_use]
pub fn new(
fixings: HashMap<MarketIndex, BTreeMap<Date, f64>>,
constructed_elements: ConstructedElementStore,
models: &[ModelParameters],
) -> Self {
Self {
fixings,
constructed_elements,
models: models.to_owned(),
exchange_rate_store: None,
}
}
#[must_use]
pub const fn fixings(&self) -> &HashMap<MarketIndex, BTreeMap<Date, f64>> {
&self.fixings
}
#[must_use]
pub const fn constructed_elements(&self) -> &ConstructedElementStore {
&self.constructed_elements
}
#[must_use]
pub const fn constructed_elements_mut(&mut self) -> &mut ConstructedElementStore {
&mut self.constructed_elements
}
#[must_use]
pub fn models(&self) -> &[ModelParameters] {
&self.models
}
#[must_use]
pub fn with_models(mut self, models: &[ModelParameters]) -> Self {
models.clone_into(&mut self.models);
self
}
#[must_use]
pub const fn exchange_rate_store(&self) -> Option<&ExchangeRateStore> {
self.exchange_rate_store.as_ref()
}
#[must_use]
pub const fn exchange_rate_store_mut(&mut self) -> Option<&mut ExchangeRateStore> {
self.exchange_rate_store.as_mut()
}
#[must_use]
pub fn with_exchange_rate_store(mut self, store: ExchangeRateStore) -> Self {
self.exchange_rate_store = Some(store);
self
}
}
pub trait MarketDataProvider {
fn handle_request(&self, request: &MarketDataRequest) -> Result<MarketData>;
fn evaluation_date(&self) -> Date;
}