use std::path::PathBuf;
use cadforge::{CadScraper, Config};
use crate::cli::CadArchiveArgs;
use crate::error::{Result, ThesaError};
pub(crate) fn run_cadforge_archive_command(args: &CadArchiveArgs, dry_run: bool) -> Result<()> {
if dry_run || args.dry_run {
println!("CadForge dry run");
println!("Pages: {}", args.pages.join(", "));
println!("Output: {}", args.archive_root.display());
println!("Batch size: {}", args.batch_size.max(1));
return Ok(());
}
let batch_size = args.batch_size.max(1);
let pages = args.pages.clone();
let output = args.archive_root.clone();
let runtime = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.map_err(|error| ThesaError::Message(format!("failed to start CadForge runtime: {error}")))?;
runtime.block_on(async move { archive_pages(pages, output, batch_size).await })
}
async fn archive_pages(pages: Vec<String>, output: PathBuf, batch_size: usize) -> Result<()> {
let scraper = CadScraper::new(Config { batch_size, ..Config::default() })
.map_err(|error| ThesaError::Message(error.to_string()))?;
let files = scraper
.scrape_pages(pages.iter().map(String::as_str))
.await
.map_err(|error| ThesaError::Message(error.to_string()))?;
let paths = scraper
.save_batch(&output, &files)
.map_err(|error| ThesaError::Message(error.to_string()))?;
println!("CadForge archived {} STEP files to {}", paths.len(), output.display());
for path in paths {
println!(" {}", path.display());
}
Ok(())
}