diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index c821809..48d1255 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -1,7 +1,7 @@ use std::collections::{BTreeMap, BTreeSet}; use chrono::{Datelike, Duration, NaiveDate, NaiveTime, Timelike}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use thiserror::Error; use crate::broker::{BrokerExecutionReport, BrokerSimulator, MatchingType}; @@ -71,7 +71,7 @@ impl Default for FuturesValidationConfig { } } -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct DailyEquityPoint { #[serde(with = "date_format")] pub date: NaiveDate, @@ -4217,7 +4217,7 @@ fn futures_cancel_report( mod date_format { use chrono::NaiveDate; - use serde::Serializer; + use serde::{Deserialize, Deserializer, Serializer}; const FORMAT: &str = "%Y-%m-%d"; @@ -4227,6 +4227,14 @@ mod date_format { { serializer.serialize_str(&date.format(FORMAT).to_string()) } + + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + NaiveDate::parse_from_str(&value, FORMAT).map_err(serde::de::Error::custom) + } } #[cfg(test)] diff --git a/crates/fidc-core/src/portfolio.rs b/crates/fidc-core/src/portfolio.rs index 803d512..e867b99 100644 --- a/crates/fidc-core/src/portfolio.rs +++ b/crates/fidc-core/src/portfolio.rs @@ -1,6 +1,6 @@ use chrono::NaiveDate; use indexmap::IndexMap; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, BTreeSet}; use crate::data::{DataSet, DataSetError, PriceField}; @@ -1692,7 +1692,7 @@ mod tests { } } -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct HoldingSummary { #[serde(with = "date_format")] pub date: NaiveDate, @@ -1730,7 +1730,7 @@ pub struct CashReceivable { mod date_format { use chrono::NaiveDate; - use serde::Serializer; + use serde::{Deserialize, Deserializer, Serializer}; const FORMAT: &str = "%Y-%m-%d"; @@ -1740,6 +1740,14 @@ mod date_format { { serializer.serialize_str(&date.format(FORMAT).to_string()) } + + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + NaiveDate::parse_from_str(&value, FORMAT).map_err(serde::de::Error::custom) + } } fn round_half_up_u32(value: f64) -> u32 {