main.rs

1.9 kB · rust · 59 lines

1mod cli;2mod js;3mod model;4mod parse;5mod py;6mod report;7mod resolve;8#[cfg(test)]9mod tests;1011use model::{Manifest, Result};12use std::path::{Path, PathBuf};1314type Backend = fn(&Manifest, &Path) -> Result<()>;1516const BACKENDS: &[(&str, Backend)] = &[("cli", cli::write), ("py", py::write), ("js", js::write)];1718fn main() {19    let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));20    let root = root.parent().expect("bridge sits in the workspace");21    if let Err(error) = run(root) {22        eprintln!("{error}");23        std::process::exit(1);24    }25}2627fn run(root: &Path) -> Result<()> {28    let src = root.join("pkgs/mrlyrs/src");29    let files = parse::load(&src)?;30    let version = version(&root.join("pkgs/mrlyrs/Cargo.toml"))?;31    let built = resolve::build(&files, &version)?;32    let json = serde_json::to_string_pretty(&built.manifest).map_err(|e| e.to_string())?;33    std::fs::write(root.join("bridge/manifest.json"), json + "\n").map_err(|e| e.to_string())?;34    for line in report::skip_lines(&built.manifest) {35        println!("{line}");36    }37    for line in report::summary(&built.manifest, built.macro_body_fns) {38        println!("{line}");39    }40    let skip_txt = std::fs::read_to_string(root.join("bridge/skip.txt")).unwrap_or_default();41    let mut errors = built.collisions;42    errors.extend(report::check_skip(&built.manifest, &skip_txt));43    if !errors.is_empty() {44        return Err(errors.join("\n"));45    }46    for (name, write) in BACKENDS {47        write(&built.manifest, root).map_err(|e| format!("{name}: {e}"))?;48    }49    Ok(())50}5152fn version(cargo_toml: &Path) -> Result<String> {53    let text = std::fs::read_to_string(cargo_toml).map_err(|e| e.to_string())?;54    text.lines()55        .find_map(|l| l.strip_prefix("version = \""))56        .and_then(|l| l.strip_suffix('"'))57        .map(str::to_string)58        .ok_or_else(|| format!("no version in {}", cargo_toml.display()))59}