fix(cli): deduplicate formats, pre-validate before writing
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user