rulemorph 0.3.2

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
#[test]
fn transform_stream_yields_outputs_and_warnings() {
    let yaml = r#"
version: 1
input:
  format: json
record_when:
  ref: "input.keep"
mappings:
  - target: "name"
    source: "name"
"#;
    let rule = parse_rule_file(yaml).expect("parse rule");
    let input = r#"[{"keep":true,"name":"alice"},{"keep":"not-bool","name":"bob"}]"#;

    let (normal_output, normal_warnings) =
        transform_with_warnings(&rule, input, None).expect("normal transform");
    let stream = transform_stream(&rule, input, None).expect("stream transform");
    let items = stream.collect::<Result<Vec<_>, _>>().expect("stream items");

    assert_eq!(normal_output, json!([{ "name": "alice" }]));
    assert_eq!(normal_warnings.len(), 1);
    assert_eq!(items.len(), 2);
    assert_eq!(items[0].output, Some(json!({ "name": "alice" })));
    assert!(items[0].warnings.is_empty());
    assert_eq!(items[1].output, None);
    assert_eq!(items[1].warnings, normal_warnings);
}

#[test]
fn transform_stream_rejects_finalize_with_stable_error() {
    let yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "name"
    source: "name"
finalize:
  limit: 1
"#;
    let rule = parse_rule_file(yaml).expect("parse rule");
    let err = match transform_stream(&rule, r#"[{"name":"alice"}]"#, None) {
        Ok(_) => panic!("expected error"),
        Err(err) => err,
    };

    assert_eq!(err.kind, TransformErrorKind::InvalidInput);
    assert_eq!(err.message, "finalize is not supported in stream mode");
    assert_eq!(err.path, None);
}