use intern_lang::Interner;
use module_lang::{ModuleGraph, ResolveError, Visibility};
use source_lang::SourceMap;
fn main() {
let mut names = Interner::new();
let mut sources = SourceMap::new();
let mut graph: ModuleGraph<&str> = ModuleGraph::new();
let app = graph.add_module(
names.intern("app"),
sources.add("app.lang", "").expect("fits"),
);
let service = graph.add_module(
names.intern("service"),
sources.add("service.lang", "").expect("fits"),
);
let db = graph.add_module(
names.intern("db"),
sources.add("db.lang", "").expect("fits"),
);
let util = graph.add_module(
names.intern("util"),
sources.add("util.lang", "").expect("fits"),
);
let connect = names.intern("connect");
let query = names.intern("query");
let escape = names.intern("escape");
let log = names.intern("log");
graph
.define(db, connect, Visibility::Public, "fn connect()")
.expect("unique");
graph
.define(db, query, Visibility::Public, "fn query()")
.expect("unique");
graph
.define(db, escape, Visibility::Private, "fn escape()")
.expect("unique");
graph
.define(util, log, Visibility::Public, "fn log()")
.expect("unique");
graph.import(service, db, query).expect("unique");
graph.import(service, util, log).expect("unique");
graph.import(app, service, query).expect("unique");
graph.import(app, service, log).expect("unique");
report("app::query", graph.resolve(app, query));
report("app::log", graph.resolve(app, log));
report("db::escape (from db)", graph.resolve(db, escape));
graph.import(app, db, escape).expect("unique");
report(
"app::escape (imported, private)",
graph.resolve(app, escape),
);
let missing = names.intern("nonexistent");
report("app::nonexistent", graph.resolve(app, missing));
println!("\n{} modules resolved.", graph.len());
}
fn report(label: &str, outcome: Result<&&str, ResolveError>) {
match outcome {
Ok(def) => println!(" {label:<34} -> {def}"),
Err(err) => println!(" {label:<34} -> error: {err}"),
}
}