fracturedjson 0.1.1

Rust port of FracturedJsonJs: human-friendly JSON formatter with optional comment support.
Documentation
use fracturedjson::{Formatter, NumberListAlignment};
use serde::Serialize;
use serde_json::json;
use std::fs;
use std::path::Path;

#[test]
fn matches_native_stringify_when_minimized() {
    let simple_cases: Vec<serde_json::Value> = vec![
        serde_json::Value::Null,
        json!("shoehorn with teeth"),
        json!(18),
        json!([]),
        json!({}),
        json!(true),
        json!(""),
        json!({ "a": "foo", "b": false, "c": 0 }),
        json!([[1, 2, null], [4, null, 6], {"x":7, "y":8, "z":9}]),
    ];

    for element in simple_cases {
        let native_minified = serde_json::to_string(&element).unwrap();
        let mut formatter = Formatter::new();
        formatter.options.number_list_alignment = NumberListAlignment::Left;
        let nicely_formatted = formatter.serialize_value(&element, 0, 100).unwrap();

        let fj_minified = formatter.minify(&nicely_formatted).unwrap();
        assert_eq!(fj_minified, native_minified);
    }
}

#[test]
fn throws_if_recursion_limit_exceeded() {
    let mut value = json!([]);
    for _ in 0..10 {
        value = json!([value]);
    }

    let mut formatter = Formatter::new();
    let result = formatter.serialize_value(&value, 0, 5);
    assert!(result.is_err());
}

#[test]
fn handles_sparse_arrays() {
    #[derive(Serialize)]
    struct Sparse<'a>(Vec<Option<&'a str>>);

    let arr = Sparse(vec![Some("val1"), None, None, Some("val2")]);

    let mut formatter = Formatter::new();
    let nice = formatter.serialize(&arr.0, 0, 100).unwrap();
    assert_eq!(nice, "[\"val1\", null, null, \"val2\"]\n");
}

#[test]
fn file_data_matches_native_stringify_when_minimized() {
    let base_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("../test/StandardJsonFiles");
    let mut files: Vec<_> = fs::read_dir(base_dir)
        .unwrap()
        .filter_map(|entry| entry.ok())
        .map(|entry| entry.path())
        .collect();
    files.sort();

    for path in files {
        let file_data = fs::read_to_string(&path).unwrap();
        let element: serde_json::Value = serde_json::from_str(&file_data).unwrap();
        let native_minified = serde_json::to_string(&element).unwrap();

        let mut formatter = Formatter::new();
        formatter.options.number_list_alignment = NumberListAlignment::Left;
        formatter.options.max_table_row_complexity = -1;

        let nicely_formatted = formatter.serialize_value(&element, 0, 100).unwrap();
        let fj_minified = formatter.minify(&nicely_formatted).unwrap();
        assert_eq!(fj_minified, native_minified);
    }
}