glsl-lang 0.8.1

GLSL 4.6 language LALR parser and AST
Documentation
use expect_test::{expect, Expect};
use glsl_lang::{
    lexer::full::fs::PreprocessorExt,
    parse::{IntoParseBuilderExt, ParseOptions},
};
use lang_util::FileId;

fn check<E: std::error::Error>(src: E, expected: Expect) {
    let actual = src.to_string();
    expected.assert_eq(&actual);
}

#[test]
fn file_pos_error() {
    let mut processor = glsl_lang_pp::processor::fs::StdProcessor::new();
    let tu: Result<glsl_lang::ast::TranslationUnit, _> = processor
        .open("data/tests/pos_error_a.glsl")
        .expect("failed to open file")
        .builder()
        .parse()
        .map(|(tu, _, _)| tu);

    check(
        tu.unwrap_err(),
        expect![[
            r##"data/tests/pos_error_b.glsl:1:1: '#error' : This error should be in pos_error_b.glsl"##
        ]],
    );
}

#[test]
fn str_pos_error() {
    let tu: Result<glsl_lang::ast::TranslationUnit, _> =
        include_str!("../data/tests/pos_error_b.glsl")
            .builder()
            .opts(&ParseOptions {
                source_id: FileId::new(10),
                ..Default::default()
            })
            .parse()
            .map(|(tu, _, _)| tu);

    check(
        tu.unwrap_err(),
        expect![[r##"10:1:1: '#error' : This error should be in pos_error_b.glsl"##]],
    );
}