reed-compiler 0.2.0

A compiler for the GraphQL query language.
Documentation
use reed_compiler::Schema;

#[test]
fn parses_and_validates_a_schema() {
    Schema::parse_and_validate("type Query { value: String }", "schema.graphql").unwrap();
}

#[test]
fn rejects_cyclic_defaults_without_aborting() {
    const CHILD_ENV: &str = "REED_COMPILER_CYCLIC_DEFAULT_TEST_CASE";
    let cases = [
        "input R { next: R = {} } type Query { value(input: R): String }",
        "input R { next: R = {} } type Query { value(input: R = {}): String }",
        "input A { bs: [B] = [{}] } input B { a: A = {} } type Query { value(input: A): String }",
    ];

    if let Ok(index) = std::env::var(CHILD_ENV) {
        let errors =
            Schema::parse_and_validate(cases[index.parse::<usize>().unwrap()], "schema.graphql")
                .expect_err("cyclic defaults must fail schema validation");
        assert!(errors.errors.iter().any(|diagnostic| {
            diagnostic
                .to_json()
                .message
                .contains("defaults contain a cycle")
        }));
        return;
    }

    for (index, _) in cases.iter().enumerate() {
        let output = std::process::Command::new(std::env::current_exe().unwrap())
            .args([
                "--exact",
                "rejects_cyclic_defaults_without_aborting",
                "--nocapture",
            ])
            .env(CHILD_ENV, index.to_string())
            .output()
            .unwrap();
        assert!(
            output.status.success(),
            "cyclic default validation failed ({})\nstdout:\n{}\nstderr:\n{}",
            output.status,
            String::from_utf8_lossy(&output.stdout),
            String::from_utf8_lossy(&output.stderr)
        );
    }
}