summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2024-02-19 19:01:10 +0200
committerLars Wirzenius <liw@liw.fi>2024-02-19 19:01:10 +0200
commit8143f75a5a45770c8fec3e66086ac4eaea7ff4c8 (patch)
tree12d4993cd5600e06bb17ac58980f3fedcac79926 /src
parent40b18e023ae93874a81a1a385ffa0277b4f5f1cc (diff)
downloadroadmap-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')
-rw-r--r--src/main.rs45
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,
+}