From 8143f75a5a45770c8fec3e66086ac4eaea7ff4c8 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 19 Feb 2024 19:01:10 +0200 Subject: feat: add a program to produce an SVG from a roadmap Signed-off-by: Lars Wirzenius Sponsored-by: author --- src/main.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main.rs (limited to 'src') diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f4b3c33 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,45 @@ +use std::{ + fs::{read, write}, + path::PathBuf, + process::Command, +}; + +use clap::Parser; +use tempfile::tempdir; + +use roadmap::from_yaml; + +fn main() -> anyhow::Result<()> { + let args = Args::parse(); + + let data = read(&args.filename)?; + let yaml = String::from_utf8(data)?; + let roadmap = from_yaml(&yaml)?; + let graph = roadmap.format_as_dot(args.label_width)?; + + let tmp = tempdir()?; + let filename = tmp.path().join("dot"); + write(&filename, graph)?; + + let output = Command::new("dot").arg("-Tsvg").arg(filename).output()?; + if output.status.success() { + let dot = String::from_utf8(output.stdout)?; + println!("{}", dot); + } else { + let stderr = String::from_utf8_lossy(&output.stderr); + eprintln!("ERROR: dot failed:\n{stderr}"); + std::process::exit(output.status.code().unwrap()); + } + + Ok(()) +} + +#[derive(Parser)] +struct Args { + /// Width of labels in the graph in characters. + #[clap(short, long, default_value = "20")] + label_width: usize, + + /// Input filename. + filename: PathBuf, +} -- cgit v1.2.1