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.
This commit is contained in:
Rahix 2025-12-09 15:44:29 +01:00
parent 6d6fffcb4a
commit 3d73094192

View file

@ -16,9 +16,19 @@ impl SuccessExt for Command {
} }
pub struct RenderedTree { pub struct RenderedTree {
repo_dir: std::path::PathBuf, pub repo_dir: std::path::PathBuf,
dot_file: std::path::PathBuf, pub dot_file_name: std::ffi::OsString,
svg_file: std::path::PathBuf, 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( pub async fn render(
@ -27,33 +37,33 @@ pub async fn render(
) -> anyhow::Result<RenderedTree> { ) -> anyhow::Result<RenderedTree> {
let repo_dir = std::path::PathBuf::from("render-git"); let repo_dir = std::path::PathBuf::from("render-git");
if repo_dir.is_dir() { let info = RenderedTree {
log::info!("Found old {repo_dir:?} repository, removing..."); repo_dir,
std::fs::remove_dir_all(&repo_dir).context("Failed to remove stale render repository")?; 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")?; std::fs::create_dir(&info.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");
let dot_source = tree.to_dot(); 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")?; .context("Failed to write `dot` source file")?;
Command::new("dot") Command::new("dot")
.args(["-T", "svg"]) .args(["-T", "svg"])
.arg("-o") .arg("-o")
.arg(&svg_file) .arg(&info.svg_file())
.arg(&dot_file) .arg(&info.dot_file())
.success() .success()
.context("Failed to generate svg graph from dot source")?; .context("Failed to generate svg graph from dot source")?;
Ok(RenderedTree { Ok(info)
repo_dir,
dot_file,
svg_file,
})
} }
pub async fn publish(ctx: &crate::Context, rendered: &RenderedTree) -> anyhow::Result<()> { 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("-C")
.arg(&rendered.repo_dir) .arg(&rendered.repo_dir)
.arg("add") .arg("add")
.arg( .arg(&rendered.dot_file_name)
rendered .arg(&rendered.svg_file_name)
.dot_file
.strip_prefix(&rendered.repo_dir)
.expect("TODO"),
)
.arg(
rendered
.svg_file
.strip_prefix(&rendered.repo_dir)
.expect("TODO"),
)
.success() .success()
.context("Failed to add generated graph files to git index")?; .context("Failed to add generated graph files to git index")?;