use std::collections::{BTreeMap, HashMap};
use crate::{
core::marketdatahandling::{
constructedelementrequest::ConstructedElementRequest,
constructedelementstore::ConstructedElementStore, fixingrequest::FixingRequest,
fxrequest::FxRequest,
},
indices::marketindex::MarketIndex,
quotes::fxstore::FxStore,
time::date::Date,
utils::errors::Result,
};
#[derive(Default)]
#[allow(clippy::struct_field_names)]
pub struct MarketDataRequest {
constructed_elements_request: Option<Vec<ConstructedElementRequest>>,
fixings_request: Option<Vec<FixingRequest>>,
fx_request: Option<Vec<FxRequest>>,
}
impl MarketDataRequest {
#[must_use]
pub const fn new(
constructed_elements_request: Option<Vec<ConstructedElementRequest>>,
fixings_request: Option<Vec<FixingRequest>>,
fx_request: Option<Vec<FxRequest>>,
) -> Self {
Self {
constructed_elements_request,
fixings_request,
fx_request,
}
}
#[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 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 fx_request(&self) -> Option<&Vec<FxRequest>> {
self.fx_request.as_ref()
}
#[must_use]
pub fn with_fx_request(mut self, request: Vec<FxRequest>) -> Self {
self.fx_request = Some(request);
self
}
}
#[derive(Clone, Default)]
pub struct MarketData {
fixings: HashMap<MarketIndex, BTreeMap<Date, f64>>,
fx_store: Option<FxStore>,
constructed_elements: ConstructedElementStore,
}
impl MarketData {
#[must_use]
pub const fn new(
fixings: HashMap<MarketIndex, BTreeMap<Date, f64>>,
constructed_elements: ConstructedElementStore,
) -> Self {
Self {
fixings,
constructed_elements,
fx_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 const fn fx_store(&self) -> Option<&FxStore> {
self.fx_store.as_ref()
}
#[must_use]
pub const fn fx_store_mut(&mut self) -> Option<&mut FxStore> {
self.fx_store.as_mut()
}
#[must_use]
pub fn with_fx_store(mut self, store: FxStore) -> Self {
self.fx_store = Some(store);
self
}
}
pub trait MarketDataProvider {
fn handle_request(&self, request: &MarketDataRequest) -> Result<MarketData>;
fn evaluation_date(&self) -> Date;
}