rulemorph 0.3.3

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
use serde_json::json;

use crate::{TransformErrorKind, run_err, run_ok};

#[test]
fn v2_zip_with_uses_all_arrays_and_last_arg_as_expression() {
    let yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "rows"
    expr:
      - "@input.left"
      - zip_with:
          - "@input.right"
          - "@input.extra"
          - "@item"
  - target: "indexes"
    expr:
      - "@input.left"
      - zip_with:
          - "@input.right"
          - "@item.index"
"#;
    let input = r#"[{
        "left": [1, 2, 3],
        "right": ["a", "b"],
        "extra": [true, false, true]
    }]"#;

    assert_eq!(
        run_ok(yaml, input),
        json!([{
            "rows": [[1, "a", true], [2, "b", false]],
            "indexes": [0, 1]
        }])
    );
}

#[test]
fn v2_zip_with_rejects_non_array_argument_with_arg_path() {
    let yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "rows"
    expr:
      - "@input.left"
      - zip_with:
          - "@input.not_array"
          - "@item"
"#;
    let err = run_err(yaml, r#"[{"left":[1], "not_array": "x"}]"#);

    assert_eq!(err.kind, TransformErrorKind::ExprError);
    assert_eq!(err.path.as_deref(), Some("mappings[0].expr[1].args[0]"));
    assert_eq!(err.message, "expr arg must be an array");
}