pub mod montecarlo;
pub mod selfpricer;
use pricers::montecarlo::MonteCarloPricerFactory;
use pricers::selfpricer::SelfPricerFactory;
use core::qm;
use core::factories::{TypeId, Qrc, Registry};
use instruments::RcInstrument;
use data::fixings::RcFixingTable;
use risk::marketdata::RcMarketData;
use risk::Pricer;
use erased_serde as esd;
use serde as sd;
use serde_tagged as sdt;
use serde_tagged::de::BoxFnSeed;
use std::fmt::Debug;
pub trait PricerFactory : esd::Serialize + TypeId + Sync + Send + Debug {
fn new(&self, instrument: RcInstrument, fixings: RcFixingTable,
market_data: RcMarketData) -> Result<Box<Pricer>, qm::Error>;
}
pub type TypeRegistry = Registry<BoxFnSeed<Qrc<PricerFactory>>>;
impl<'de> sd::Deserialize<'de> for Qrc<PricerFactory> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: sd::Deserializer<'de>
{
sdt::de::external::deserialize(deserializer, get_registry())
}
}
pub fn get_registry() -> &'static TypeRegistry {
lazy_static! {
static ref REG: TypeRegistry = {
let mut reg = TypeRegistry::new();
reg.insert("MonteCarloPricerFactory", BoxFnSeed::new(MonteCarloPricerFactory::from_serial));
reg.insert("SelfPricerFactory", BoxFnSeed::new(SelfPricerFactory::from_serial));
reg
};
}
®
}
pub type RcPricerFactory = Qrc<PricerFactory>;