harn-cli 0.7.43

CLI for the Harn programming language — run, test, REPL, format, and lint
use std::path::Path;

use crate::cli::CrystallizeArgs;

pub(crate) fn run(args: CrystallizeArgs) -> Result<(), String> {
    let traces =
        harn_vm::orchestration::load_crystallization_traces_from_dir(Path::new(&args.from))
            .map_err(|error| error.to_string())?;
    let artifacts = harn_vm::orchestration::crystallize_traces(
        traces,
        harn_vm::orchestration::CrystallizeOptions {
            min_examples: args.min_examples,
            workflow_name: args.workflow_name.clone(),
            package_name: args.package_name.clone(),
            author: args.author.clone(),
            approver: args.approver.clone(),
            eval_pack_link: args.eval_pack.clone(),
        },
    )
    .map_err(|error| error.to_string())?;

    let report = harn_vm::orchestration::write_crystallization_artifacts(
        artifacts,
        Path::new(&args.out),
        Path::new(&args.report),
        args.eval_pack.as_deref().map(Path::new),
    )
    .map_err(|error| error.to_string())?;

    let selected = report.selected_candidate_id.as_deref().unwrap_or("none");
    println!(
        "Crystallization: selected={selected} candidates={} rejected={} traces={}",
        report.candidates.len(),
        report.rejected_candidates.len(),
        report.source_trace_count
    );
    println!("Workflow: {}", args.out);
    println!("Report: {}", args.report);
    if let Some(path) = args.eval_pack.as_deref() {
        println!("Eval pack: {path}");
    }

    if report.selected_candidate_id.is_none() {
        return Err("no safe crystallization candidate was proposed".to_string());
    }

    Ok(())
}