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:
parent
6d6fffcb4a
commit
3d73094192
1 changed files with 30 additions and 30 deletions
|
|
@ -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")?;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue