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 From 46645cc0c19010acf398f00d4b395554f2254bc8 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 19 Feb 2024 19:03:21 +0200 Subject: chore: fix problems found by clippy Signed-off-by: Lars Wirzenius Sponsored-by: author --- src/map.rs | 4 ++-- src/parser.rs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/map.rs b/src/map.rs index 3fe1e12..00b680f 100644 --- a/src/map.rs +++ b/src/map.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use textwrap::fill; -pub use crate::from_yaml; pub use crate::RoadmapError; pub use crate::Status; pub use crate::Step; @@ -220,7 +219,8 @@ impl Roadmap { #[cfg(test)] mod tests { - use super::{from_yaml, Roadmap, Status, Step}; + use super::{Roadmap, Status, Step}; + use crate::from_yaml; #[test] fn new_roadmap() { diff --git a/src/parser.rs b/src/parser.rs index 8c7a9c1..6b7d845 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,9 +1,7 @@ use std::collections::HashMap; pub use crate::Roadmap; -pub use crate::RoadmapError; pub use crate::RoadmapResult; -pub use crate::Status; pub use crate::Step; /// Create a new roadmap from a textual YAML representation. -- cgit v1.2.1