rulemorph 0.3.2

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
include!("operator_inventory/fixtures.rs");

#[test]
fn trace_v2_operator_fixture_table_covers_valid_inventory_representatives() {
    assert_eq!(
        OPERATOR_CASES
            .iter()
            .map(|(op, _)| *op)
            .collect::<std::collections::BTreeSet<_>>(),
        EXPECTED_INVENTORY
            .iter()
            .copied()
            .collect::<std::collections::BTreeSet<_>>(),
        "trace fixture table must drift with valid v2 operator inventory"
    );

    for (operator, expr) in OPERATOR_CASES {
        let yaml = format!(
            r#"
version: 2
input:
  format: json
mappings:
  - target: "out"
    expr: {expr}
"#
        );
        let rule = parse_rule_file(&yaml).unwrap_or_else(|err| panic!("{operator} parse: {err:?}"));
        let normal = transform(&rule, OPERATOR_INPUT, None)
            .unwrap_or_else(|err| panic!("{operator} normal transform: {err:?}"));
        let traced = transform_input_with_trace(
            &rule,
            InputData::Text(OPERATOR_INPUT),
            None,
            &TransformTraceOptions::raw(),
        )
        .unwrap_or_else(|err| panic!("{operator} traced transform: {err:?}"));

        assert_eq!(traced.output, normal, "{operator}");
        let events = iter_trace_events(&traced.trace);
        assert!(
            events.iter().any(|event| {
                event.kind == TraceEventKind::OpStart && event.operator.as_deref() == Some(operator)
            }),
            "{operator} missing op_start"
        );
        assert!(
            events.iter().any(|event| {
                event.kind == TraceEventKind::OpEnd && event.operator.as_deref() == Some(operator)
            }),
            "{operator} missing op_end"
        );
        assert_trace_shape(&traced.trace);
    }
}