main.rs
2.4 kB · rust · 83 lines
1mod cli;2mod disk;3mod js;4mod model;5mod parse;6mod py;7mod report;8mod resolve;9#[cfg(test)]10mod tests;11mod version;1213use model::{Manifest, Result};14use std::path::{Path, PathBuf};1516type Backend = fn(&Manifest, &Path) -> Result<()>;1718const BACKENDS: &[(&str, Backend)] = &[19 ("cli", cli::write),20 ("py", py::write),21 ("js", js::write),22 ("version", version::write),23];2425fn main() {26 let home = PathBuf::from(env!("CARGO_MANIFEST_DIR"));27 let root = home.ancestors().nth(2).expect("bridge sits in pkgs");28 let args: Vec<String> = std::env::args().skip(1).collect();29 let done = match args.iter().map(String::as_str).collect::<Vec<_>>()[..] {30 [] => run(root),31 ["check"] => check(root),32 ["bump"] => version::bump(root),33 _ => Err("usage: bridge [check|bump]".to_string()),34 };35 if let Err(error) = done {36 eprintln!("{error}");37 std::process::exit(1);38 }39}4041fn check(root: &Path) -> Result<()> {42 disk::watch();43 let done = run(root);44 let mut lines: Vec<String> = disk::stale()45 .iter()46 .map(|path| path.strip_prefix(root).unwrap_or(path))47 .map(|path| format!("stale: {}", path.display()))48 .collect();49 if !lines.is_empty() {50 lines.push("the bridge is stale: run scripts/bridge.sh".to_string());51 }52 lines.extend(done.err());53 if lines.is_empty() {54 Ok(())55 } else {56 Err(lines.join("\n"))57 }58}5960fn run(root: &Path) -> Result<()> {61 let src = root.join("pkgs/mrlyrs/src");62 let files = parse::load(&src)?;63 let version = version::read(root)?;64 let built = resolve::build(&files, &version)?;65 let json = serde_json::to_string_pretty(&built.manifest).map_err(|e| e.to_string())?;66 disk::save(&root.join(version::MANIFEST), &(json + "\n"))?;67 for line in report::skip_lines(&built.manifest) {68 println!("{line}");69 }70 for line in report::summary(&built.manifest, built.macro_body_fns) {71 println!("{line}");72 }73 let skip_txt = std::fs::read_to_string(root.join("pkgs/bridge/skip.txt")).unwrap_or_default();74 let mut errors = built.collisions;75 errors.extend(report::check_skip(&built.manifest, &skip_txt));76 if !errors.is_empty() {77 return Err(errors.join("\n"));78 }79 for (name, write) in BACKENDS {80 write(&built.manifest, root).map_err(|e| format!("{name}: {e}"))?;81 }82 Ok(())83}