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}