crisp-parser 1.7.1

Crisp parser — tokens to AST (spec Appendix A)
Documentation
use crisp_ast::item::Item;
use crisp_parser::Parser;

#[test]
fn parse_bare_use_crate_like_typescript() {
    let src = "use serde_json { from_str, to_string }\n";
    let file = Parser::new(src).unwrap().parse_file().unwrap();
    let Item::Use(u) = &file.items[0] else {
        panic!("expected use");
    };
    assert_eq!(
        u.path.iter().map(|p| p.name.as_str()).collect::<Vec<_>>(),
        ["serde_json"]
    );
    let imports = u.imports.as_ref().unwrap();
    assert_eq!(imports.len(), 2);
    assert_eq!(imports[0].name.name, "from_str");
    assert_eq!(imports[1].name.name, "to_string");
}

#[test]
fn parse_use_rust_dot_path() {
    let src = "use rust.serde_json { from_str, to_string }\n";
    let file = Parser::new(src).unwrap().parse_file().unwrap();
    let Item::Use(u) = &file.items[0] else {
        panic!("expected use");
    };
    assert_eq!(
        u.path.iter().map(|p| p.name.as_str()).collect::<Vec<_>>(),
        ["rust", "serde_json"]
    );
    let imports = u.imports.as_ref().unwrap();
    assert_eq!(imports.len(), 2);
    assert_eq!(imports[0].name.name, "from_str");
    assert_eq!(imports[1].name.name, "to_string");
}

#[test]
fn parse_use_rust_colon_colon_path() {
    let src = "use rust::serde_json { from_str }\n";
    let file = Parser::new(src).unwrap().parse_file().unwrap();
    let Item::Use(u) = &file.items[0] else {
        panic!("expected use");
    };
    assert_eq!(
        u.path.iter().map(|p| p.name.as_str()).collect::<Vec<_>>(),
        ["rust", "serde_json"]
    );
}

#[test]
fn parse_use_rust_with_alias() {
    let src = "use rust.serde_json { Value as JsonValue }\n";
    let file = Parser::new(src).unwrap().parse_file().unwrap();
    let Item::Use(u) = &file.items[0] else {
        panic!("expected use");
    };
    let imports = u.imports.as_ref().unwrap();
    assert_eq!(imports[0].name.name, "Value");
    assert_eq!(imports[0].alias.as_ref().unwrap().name, "JsonValue");
}

#[test]
fn parse_mixed_bare_and_prefixed_uses() {
    let src = r#"
use serde_json { from_str }
use rust::serde_json { to_string }
"#;
    let file = Parser::new(src).unwrap().parse_file().unwrap();
    assert_eq!(file.items.len(), 2);
    let Item::Use(bare) = &file.items[0] else {
        panic!("bare");
    };
    let Item::Use(prefixed) = &file.items[1] else {
        panic!("prefixed");
    };
    assert_eq!(bare.path.len(), 1);
    assert_eq!(prefixed.path.len(), 2);
    assert_eq!(prefixed.path[0].name, "rust");
}