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}