thesa 4.7.1

Archive repositories, models, datasets, websites, assets, audio, videos, scholarly papers, and technical reports
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(())
}