only-semantic 0.0.4

Semantic analysis for the only task language.
Documentation
use only_semantic::compile_document;

#[test]
fn reports_validation_errors_for_dependencies_and_variables() {
    let compiled = compile_document("deploy() & build:\n    echo {{target}}\n");
    let messages: Vec<_> = compiled
        .diagnostics
        .iter()
        .map(|diagnostic| diagnostic.message.as_str())
        .collect();

    assert!(
        messages
            .iter()
            .any(|message| message.contains("undefined dependency 'build'"))
    );
    assert!(
        messages
            .iter()
            .any(|message| message.contains("undefined variable 'target'"))
    );
}

#[test]
fn reports_duplicate_preview_directives() {
    let compiled = compile_document("!preview false\n!preview true\n");
    let messages: Vec<_> = compiled
        .diagnostics
        .iter()
        .map(|diagnostic| diagnostic.message.as_str())
        .collect();

    assert!(messages.contains(&"duplicate directive '!preview'"));
}

#[test]
fn reports_duplicate_directives() {
    let compiled = compile_document(
        "!echo false\n!echo true\n!label false\n!label true\n!shell bash\n!shell deno\n",
    );
    let messages: Vec<_> = compiled
        .diagnostics
        .iter()
        .map(|diagnostic| diagnostic.message.as_str())
        .collect();

    assert!(messages.contains(&"duplicate directive '!echo'"));
    assert!(messages.contains(&"duplicate directive '!label'"));
    assert!(messages.contains(&"duplicate directive '!shell'"));
}