cli: templates check: allow rendering to --out-dir

This commit is contained in:
Olivier 'reivilibre
2025-10-24 15:43:17 +01:00
parent cabc005ad4
commit 0013101623

View File

@@ -6,6 +6,8 @@
use std::process::ExitCode;
use anyhow::{Context as _, bail};
use camino::Utf8PathBuf;
use clap::Parser;
use figment::Figment;
use mas_config::{
@@ -27,14 +29,19 @@ pub(super) struct Options {
#[derive(Parser, Debug)]
enum Subcommand {
/// Check that the templates specified in the config are valid
Check,
Check {
/// If set, templates will be rendered to this directory.
/// The directory must either not exist or be empty.
#[arg(long = "out-dir")]
out_dir: Option<Utf8PathBuf>,
},
}
impl Options {
pub async fn run(self, figment: &Figment) -> anyhow::Result<ExitCode> {
use Subcommand as SC;
match self.subcommand {
SC::Check => {
SC::Check { out_dir } => {
let _span = info_span!("cli.templates.check").entered();
let template_config = TemplatesConfig::extract_or_default(figment)
@@ -67,7 +74,39 @@ impl Options {
)?;
let templates =
templates_from_config(&template_config, &site_config, &url_builder).await?;
templates.check_render(clock.now(), &mut rng)?;
let all_renders = templates.check_render(clock.now(), &mut rng)?;
if let Some(out_dir) = out_dir {
// Save renders to disk.
if out_dir.exists() {
let mut read_dir =
tokio::fs::read_dir(&out_dir).await.with_context(|| {
format!("could not read {out_dir} to check it's empty")
})?;
while let Some(x) = read_dir.next_entry().await? {
bail!("Render directory {out_dir} is not empty, refusing to write.");
}
} else {
tokio::fs::create_dir(&out_dir)
.await
.with_context(|| format!("could not create {out_dir}"))?;
}
for (template, template_renders) in &all_renders {
let template_filename_base =
template.trim_end_matches(".html").replace('/', "_");
for (idx, render) in template_renders.iter().enumerate() {
let render_path =
out_dir.join(format!("{template_filename_base}-sample{idx}.html"));
tokio::fs::write(&render_path, render.as_bytes())
.await
.with_context(|| {
format!("could not write render to {render_path}")
})?;
}
}
}
Ok(ExitCode::SUCCESS)
}