Skip to main content

embeddenator_cli/commands/
bundle_hier.rs

1//! Bundle hierarchical artifacts command implementation
2
3use anyhow::Result;
4use embeddenator_fs::embrfs::{save_hierarchical_manifest, save_sub_engrams_dir, EmbrFS};
5use embeddenator_vsa::ReversibleVSAConfig;
6use std::path::PathBuf;
7
8#[allow(clippy::too_many_arguments)]
9pub fn handle_bundle_hier(
10    engram: PathBuf,
11    manifest: PathBuf,
12    out_hierarchical_manifest: PathBuf,
13    out_sub_engrams_dir: PathBuf,
14    max_level_sparsity: usize,
15    max_chunks_per_node: Option<usize>,
16    embed_sub_engrams: bool,
17    verbose: bool,
18) -> Result<()> {
19    if verbose {
20        println!(
21            "Embeddenator v{} - Build Hierarchical Artifacts",
22            env!("CARGO_PKG_VERSION")
23        );
24        println!("=============================================");
25    }
26
27    let engram_data = EmbrFS::load_engram(&engram)?;
28    let manifest_data = EmbrFS::load_manifest(&manifest)?;
29
30    let mut fs = EmbrFS::new();
31    fs.engram = engram_data;
32    fs.manifest = manifest_data;
33
34    let config = ReversibleVSAConfig::default();
35    let mut hierarchical = fs.bundle_hierarchically_with_options(
36        max_level_sparsity,
37        max_chunks_per_node,
38        verbose,
39        &config,
40    )?;
41
42    // Always write the sub-engrams directory for store-backed retrieval.
43    save_sub_engrams_dir(&hierarchical.sub_engrams, &out_sub_engrams_dir)?;
44
45    if !embed_sub_engrams {
46        hierarchical.sub_engrams.clear();
47    }
48
49    save_hierarchical_manifest(&hierarchical, &out_hierarchical_manifest)?;
50
51    if verbose {
52        println!(
53            "Wrote hierarchical manifest: {}",
54            out_hierarchical_manifest.display()
55        );
56        println!("Wrote sub-engrams dir: {}", out_sub_engrams_dir.display());
57    }
58
59    Ok(())
60}