diff options
author | Lars Wirzenius <liw@liw.fi> | 2024-02-19 17:04:55 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2024-02-19 17:04:55 +0000 |
commit | 9f9ec1f5e39db4590e36aed8e4e76c269f94e377 (patch) | |
tree | 56b28315771432b020d80c2730913bfb5d222641 /src/main.rs | |
parent | 40b18e023ae93874a81a1a385ffa0277b4f5f1cc (diff) | |
parent | 46645cc0c19010acf398f00d4b395554f2254bc8 (diff) | |
download | roadmap-main.tar.gz |
feat: add a program to produce an SVG from a roadmap
See merge request larswirzenius/roadmap!23
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 45 |
1 files changed, 45 insertions, 0 deletions
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, +} |