sheeter-engine 0.12.0

A CLI tool for converting data files between formats. v0.1.0 supports CSV <-> JSON.
Documentation
use assert_cmd::Command;
use std::fs;
use tempfile::tempdir;

fn run(from: &str, to: &str, input: &str, in_ext: &str, out_ext: &str) -> Result<String, String> {
    let dir = tempdir().unwrap();
    let inp = dir.path().join(format!("in.{in_ext}"));
    let out = dir.path().join(format!("out.{out_ext}"));
    fs::write(&inp, input).unwrap();
    let result = Command::cargo_bin("sheeter")
        .unwrap()
        .args([
            "convert",
            "--from",
            from,
            "--to",
            to,
            inp.to_str().unwrap(),
            out.to_str().unwrap(),
        ])
        .output()
        .unwrap();
    if !result.status.success() {
        return Err(String::from_utf8_lossy(&result.stderr).to_string());
    }
    Ok(fs::read_to_string(out).unwrap())
}

#[test]
fn xml_roundtrips_via_json() {
    let json = run("xml", "json", "<r><a>1</a><a>2</a></r>", "xml", "json").unwrap();
    assert_eq!(json, r#"{"r":{"a":["1","2"]}}"#);
}

#[test]
fn csv_to_xml_wraps_in_root() {
    let xml = run("csv", "xml", "name\nAlice", "csv", "xml").unwrap();
    assert!(xml.contains("<root>"));
    assert!(xml.contains("<item>"));
    assert!(xml.contains("<name>Alice</name>"));
}

#[test]
fn xml_to_csv_extracts_tabular() {
    let csv = run(
        "xml",
        "csv",
        "<root><item><name>Alice</name><age>30</age></item></root>",
        "xml",
        "csv",
    )
    .unwrap();
    assert_eq!(csv, "name,age\nAlice,30\n");
}

#[test]
fn yaml_to_xml_via_hub() {
    let xml = run("yaml", "xml", "- name: Alice\n  age: 30\n", "yaml", "xml").unwrap();
    assert!(xml.contains("<name>Alice</name>"));
}

#[test]
fn xml_attributes_preserved() {
    let json = run(
        "xml",
        "json",
        "<r><item id=\"1\">Alice</item></r>",
        "xml",
        "json",
    )
    .unwrap();
    assert!(json.contains("\"@id\":\"1\""));
    assert!(json.contains("\"#text\":\"Alice\""));
}

#[test]
fn xml_scalar_root_is_single_row() {
    let csv = run("xml", "csv", "<r>just text</r>", "xml", "csv").unwrap();
    assert_eq!(csv, "r\njust text\n");
}

#[test]
fn xml_nested_single_record_is_one_row() {
    let csv = run("xml", "csv", "<r><a><b>1</b></a></r>", "xml", "csv").unwrap();
    assert_eq!(csv, "b\n1\n");
}