zirium 0.4.0

Lossless textual MLIR syntax parsing and semantic processing
Documentation
use std::error::Error;

use zirium::{
    parser::{ApplyTextEditsError, ParseFileError, ResourceLimitError, TextEditError},
    printer::{PreserveError, PrintError},
    semantic::{EditError, SemanticVerificationError, ValidationError},
    source::TextRange,
};

#[test]
fn parser_errors_have_human_messages_and_sources() {
    let range = TextRange::new(3, 5).unwrap();
    let cause = TextEditError::Overlapping(range);
    assert_eq!(
        cause.to_string(),
        "text edit range 3..5 overlaps another edit"
    );

    let wrapper = ApplyTextEditsError::Edit(cause);
    assert!(wrapper.to_string().starts_with("invalid text edit:"));
    assert!(wrapper.source().is_some());

    let parse = ParseFileError::ResourceLimit(ResourceLimitError {
        limit: 4,
        actual: 9,
    });
    assert_eq!(parse.to_string(), "file size 9 exceeds limit 4");
    assert_eq!(
        parse.source().unwrap().to_string(),
        "file size 9 exceeds limit 4"
    );
}

#[test]
fn semantic_and_output_wrappers_expose_their_causes() {
    let semantic = SemanticVerificationError::Structural(ValidationError::InvalidRetention);
    assert_eq!(
        semantic.to_string(),
        "structural verification failed: invalid semantic document: retained source, syntax, or mappings are inconsistent"
    );
    assert!(semantic.source().is_some());

    let edit = EditError::Semantic(semantic);
    assert!(
        edit.to_string()
            .contains("edited document is semantically invalid")
    );
    assert!(edit.source().is_some());

    let print = PrintError::InvalidDocument(ValidationError::InvalidList);
    assert_eq!(
        print.to_string(),
        "cannot print invalid document: invalid semantic document: an arena list reference is invalid"
    );
    assert!(print.source().is_some());

    let preserve = PreserveError::InvalidDocument(ValidationError::InvalidRetention);
    assert!(
        preserve
            .to_string()
            .starts_with("cannot preserve invalid document:")
    );
    assert!(preserve.source().is_some());

    let unknown = PreserveError::UnknownCustomSyntax(TextRange::new(8, 13).unwrap());
    assert_eq!(
        unknown.to_string(),
        "dirty replacement at 8..13 contains unknown custom syntax"
    );
}