diff options
author | Lars Wirzenius <liw@liw.fi> | 2024-02-19 19:01:10 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2024-02-19 19:01:10 +0200 |
commit | 8143f75a5a45770c8fec3e66086ac4eaea7ff4c8 (patch) | |
tree | 12d4993cd5600e06bb17ac58980f3fedcac79926 /src/main.rs | |
parent | 40b18e023ae93874a81a1a385ffa0277b4f5f1cc (diff) | |
download | roadmap-8143f75a5a45770c8fec3e66086ac4eaea7ff4c8.tar.gz |
feat: add a program to produce an SVG from a roadmap
Signed-off-by: Lars Wirzenius <liw@liw.fi>
Sponsored-by: author
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, +} |