crux_cli 0.3.0

Command line tool for crux_core
Documentation
use anyhow::Result;
use pretty_assertions::assert_eq;
use rstest::rstest;
use rustdoc_types::Crate;

use crate::codegen::Registry;

fn load_rustdoc(name: &str) -> Result<Crate> {
    Ok(match name {
        "counter" => serde_json::from_slice(include_bytes!("fixtures/counter/rustdoc.json"))?,
        "counter_http" => {
            serde_json::from_slice(include_bytes!("fixtures/counter_http/rustdoc.json"))?
        }
        "notes" => serde_json::from_slice(include_bytes!("fixtures/notes/rustdoc.json"))?,
        "crux_core" => serde_json::from_slice(include_bytes!("fixtures/crux_core.json"))?,
        "crux_http" => serde_json::from_slice(include_bytes!("fixtures/crux_http.json"))?,
        "crux_kv" => serde_json::from_slice(include_bytes!("fixtures/crux_kv.json"))?,
        "crux_platform" => serde_json::from_slice(include_bytes!("fixtures/crux_platform.json"))?,
        "crux_time" => serde_json::from_slice(include_bytes!("fixtures/crux_time.json"))?,
        _ => panic!("unknown crate {name}"),
    })
}

fn load_expected(name: &str) -> Result<Registry> {
    Ok(match name {
        "counter" => serde_json::from_slice(include_bytes!("fixtures/counter/expected.json"))?,
        "counter_http" => {
            serde_json::from_slice(include_bytes!("fixtures/counter_http/expected.json"))?
        }
        "notes" => serde_json::from_slice(include_bytes!("fixtures/notes/expected.json"))?,
        _ => panic!("unknown example {name}"),
    })
}

#[rstest]
#[case::counter("counter")]
#[case::counter_http("counter_http")]
#[case::notes("notes")]
fn full(#[case] example: &str) {
    let actual = super::run(example, load_rustdoc).unwrap();
    let expected: Registry = load_expected(example).expect("should deserialize");

    assert_eq!(actual, expected);
}