diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index d06ceee..ccf1bd6 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -5851,7 +5851,10 @@ impl PlatformExprStrategy { '}' => brace_depth -= 1, '[' => bracket_depth += 1, ']' => bracket_depth -= 1, - ',' if paren_depth == 0 && brace_depth == 0 && bracket_depth == 0 => { + ',' if paren_depth == ternary_paren_depth + && brace_depth == 0 + && bracket_depth == 0 => + { start = idx + ch.len_utf8(); } _ => {} @@ -10432,6 +10435,33 @@ mod tests { assert!(!rewritten.contains('?')); } + #[test] + fn platform_expr_rewrites_multiple_nested_ternaries_inside_function_calls() { + let expr = r#"min( + rolling_mean_current("signal_close", 10) > rolling_mean_current("signal_close", 30) + ? 1.0 + : 0.3, + min( + rolling_return_stddev_current("signal_close", 20) >= 0.025 + ? 0.3 + : 1.0, + 1.0 - safe_div( + day_factor("signal_close"), + rolling_max_current("signal_close", 60) + ) >= 0.08 + ? 0.2 + : 1.0 + ) + )"#; + let rewritten = PlatformExprStrategy::normalize_expr(expr); + + assert!(!rewritten.contains('?'), "{rewritten}"); + PlatformExprStrategy::new(PlatformExprStrategyConfig::microcap_rotation()) + .engine + .compile(&rewritten) + .unwrap_or_else(|error| panic!("rewritten expression must compile: {error}\n{rewritten}")); + } + #[test] fn platform_expr_safe_div_supports_two_and_three_arg_forms() { let strategy = PlatformExprStrategy::new(PlatformExprStrategyConfig::microcap_rotation());