fix(cli): deduplicate formats, pre-validate before writing

This commit is contained in:
2026-03-23 01:50:50 +01:00
parent 9525a2586b
commit c05584561b

View File

@@ -1,7 +1,6 @@
use std::{fs, path::PathBuf};
use clap::Parser;
use exporters;
use lib::{BlockPalette, OutlineMode, TextBuilder, TtfFont};
#[derive(Parser, Debug)]
@@ -144,18 +143,32 @@ pub fn run() -> anyhow::Result<()> {
grid.depth
);
let format_names: Vec<&str> = if cli.format.is_empty() {
let all_names = exporters::available_names();
let raw_formats: Vec<&str> = if cli.format.is_empty() {
vec!["mcfunction"]
} else if cli.format.iter().any(|f| f == "all") {
exporters::available_names()
all_names.clone()
} else {
cli.format.iter().map(String::as_str).collect()
};
for name in format_names {
let exporter = exporters::build(name, &palette)
.ok_or_else(|| anyhow::anyhow!("unknown format '{}'. Available: {}", name, exporters::available_names().join(", ")))?;
// Deduplicate while preserving order
let mut seen = std::collections::HashSet::new();
let format_names: Vec<&str> = raw_formats
.into_iter()
.filter(|&name| seen.insert(name))
.collect();
// Pre-validate all names before writing anything
for name in &format_names {
if exporters::build(name, &palette).is_none() {
anyhow::bail!("unknown format '{}'. Available: {}", name, all_names.join(", "));
}
}
for name in format_names {
let exporter = exporters::build(name, &palette).unwrap(); // safe: pre-validated
let output_bytes = exporter.export(&grid)?;
let mut out_path = cli.out.clone();
out_path.set_extension(exporter.file_extension());