crisp-resolve 1.6.1

Name resolution, imports, sealed-crate lockfile (spec §12)
Documentation
use crisp_resolve::Resolver;
use std::path::PathBuf;

fn server_root() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../examples/server")
}

fn normalize_paths(mut resolved: crisp_resolve::ResolvedCrate) -> crisp_resolve::ResolvedCrate {
    resolved.crate_root = ".".to_string();
    for module in &mut resolved.modules {
        if let Some(name) = module.file.rsplit("/src/").next() {
            module.file = format!("./src/{name}");
        }
    }
    resolved
}

#[test]
fn resolve_server_multifile() {
    let root = server_root();
    let resolved = normalize_paths(Resolver::resolve_crate(&root).expect("resolve server example"));
    assert_eq!(resolved.modules.len(), 3);
    insta::assert_debug_snapshot!(resolved);
}

#[test]
fn resolve_server_main_imports_config_and_greet() {
    let root = server_root();
    let resolved = Resolver::resolve_crate(&root).expect("resolve server");
    let main = resolved
        .modules
        .iter()
        .find(|m| m.module_path == "main")
        .expect("main module");
    assert!(main.scope.iter().any(|s| s == "Config"));
    assert!(main.scope.iter().any(|s| s == "greet"));
    assert!(main.scope.iter().any(|s| s == "log"));
}