diff --git a/crates/fidc-core/src/factor_events.rs b/crates/fidc-core/src/factor_events.rs index 484f38f..f4c32ba 100644 --- a/crates/fidc-core/src/factor_events.rs +++ b/crates/fidc-core/src/factor_events.rs @@ -53,7 +53,7 @@ pub enum Expr { Operator { name: String, args: Vec, - #[serde(default)] + #[serde(default, skip_serializing_if = "Option::is_none")] window: Option, }, } diff --git a/crates/fidc-core/src/pattern_context.rs b/crates/fidc-core/src/pattern_context.rs index 6902045..9d6d7e1 100644 --- a/crates/fidc-core/src/pattern_context.rs +++ b/crates/fidc-core/src/pattern_context.rs @@ -248,6 +248,11 @@ mod tests { use super::*; use crate::{BenchmarkSnapshot, DailyFactorSnapshot, DailyMarketSnapshot, Instrument}; use serde_json::json; + #[test] + fn normalized_rule_does_not_turn_an_omitted_window_into_explicit_null() { + let expression:Expr=serde_json::from_value(json!({"kind":"operator","name":"GT","args":[{"kind":"field","name":"close"},{"kind":"number","value":1}]})).unwrap(); + assert!(serde_json::to_value(expression).unwrap().get("window").is_none()); + } fn data(future: bool, reference: bool) -> DataSet { let mut days = vec![ NaiveDate::from_ymd_opt(2026, 9, 4).unwrap(),