From 3d73094192f6cd995b5e44857fa2ca7e34472145 Mon Sep 17 00:00:00 2001 From: Rahix Date: Tue, 9 Dec 2025 15:44:29 +0100 Subject: [PATCH] Refactor rendering code to prevent illegal states Store the rendered tree information such that it is impossible to represent a set of data that is incorrect. --- techtree-manager/src/render.rs | 60 +++++++++++++++++----------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/techtree-manager/src/render.rs b/techtree-manager/src/render.rs index 09f0e4b..f18bebb 100644 --- a/techtree-manager/src/render.rs +++ b/techtree-manager/src/render.rs @@ -16,9 +16,19 @@ impl SuccessExt for Command { } pub struct RenderedTree { - repo_dir: std::path::PathBuf, - dot_file: std::path::PathBuf, - svg_file: std::path::PathBuf, + pub repo_dir: std::path::PathBuf, + pub dot_file_name: std::ffi::OsString, + pub svg_file_name: std::ffi::OsString, +} + +impl RenderedTree { + pub fn dot_file(&self) -> std::path::PathBuf { + self.repo_dir.join(&self.dot_file_name) + } + + pub fn svg_file(&self) -> std::path::PathBuf { + self.repo_dir.join(&self.svg_file_name) + } } pub async fn render( @@ -27,33 +37,33 @@ pub async fn render( ) -> anyhow::Result { let repo_dir = std::path::PathBuf::from("render-git"); - if repo_dir.is_dir() { - log::info!("Found old {repo_dir:?} repository, removing..."); - std::fs::remove_dir_all(&repo_dir).context("Failed to remove stale render repository")?; + let info = RenderedTree { + repo_dir, + dot_file_name: "techtree.dot".into(), + svg_file_name: "techtree.svg".into(), + }; + + if info.repo_dir.is_dir() { + log::info!("Found old {:?} repository, removing...", info.repo_dir); + std::fs::remove_dir_all(&info.repo_dir) + .context("Failed to remove stale render repository")?; } - std::fs::create_dir(&repo_dir).context("Failed creating directory for rendered graph")?; - - let dot_file = repo_dir.join("techtree.dot"); - let svg_file = repo_dir.join("techtree.svg"); + std::fs::create_dir(&info.repo_dir).context("Failed creating directory for rendered graph")?; let dot_source = tree.to_dot(); - std::fs::write(&dot_file, dot_source.as_bytes()) + std::fs::write(&info.dot_file(), dot_source.as_bytes()) .context("Failed to write `dot` source file")?; Command::new("dot") .args(["-T", "svg"]) .arg("-o") - .arg(&svg_file) - .arg(&dot_file) + .arg(&info.svg_file()) + .arg(&info.dot_file()) .success() .context("Failed to generate svg graph from dot source")?; - Ok(RenderedTree { - repo_dir, - dot_file, - svg_file, - }) + Ok(info) } pub async fn publish(ctx: &crate::Context, rendered: &RenderedTree) -> anyhow::Result<()> { @@ -84,18 +94,8 @@ pub async fn publish(ctx: &crate::Context, rendered: &RenderedTree) -> anyhow::R .arg("-C") .arg(&rendered.repo_dir) .arg("add") - .arg( - rendered - .dot_file - .strip_prefix(&rendered.repo_dir) - .expect("TODO"), - ) - .arg( - rendered - .svg_file - .strip_prefix(&rendered.repo_dir) - .expect("TODO"), - ) + .arg(&rendered.dot_file_name) + .arg(&rendered.svg_file_name) .success() .context("Failed to add generated graph files to git index")?;