use anyhow::Result;
use embeddenator_fs::embrfs::EmbrFS;
use embeddenator_vsa::ReversibleVSAConfig;
use std::path::PathBuf;
pub fn handle_update_add(
engram: PathBuf,
manifest: PathBuf,
file: PathBuf,
logical_path: Option<String>,
verbose: bool,
) -> Result<()> {
if verbose {
println!(
"Embeddenator v{} - Incremental Add",
env!("CARGO_PKG_VERSION")
);
println!("===================================");
}
if !engram.exists() {
anyhow::bail!("Engram file not found: {}", engram.display());
}
if !manifest.exists() {
anyhow::bail!("Manifest file not found: {}", manifest.display());
}
if !file.exists() {
anyhow::bail!("Input file not found: {}", file.display());
}
let mut fs = EmbrFS::load(&engram, &manifest)?;
let config = ReversibleVSAConfig::default();
let logical = logical_path.unwrap_or_else(|| {
file.file_name()
.and_then(|s| s.to_str())
.unwrap_or("unnamed")
.to_string()
});
if verbose {
println!("Adding file: {} -> {}", file.display(), logical);
}
fs.add_file(&file, logical.clone(), verbose, &config)?;
fs.save_engram(&engram)?;
fs.save_manifest(&manifest)?;
if verbose {
println!("\nAdd complete!");
println!(" File added: {}", logical);
println!(
" Total files: {}",
fs.manifest.files.iter().filter(|f| !f.deleted).count()
);
}
Ok(())
}
pub fn handle_update_remove(
engram: PathBuf,
manifest: PathBuf,
path: String,
verbose: bool,
) -> Result<()> {
if verbose {
println!(
"Embeddenator v{} - Incremental Remove",
env!("CARGO_PKG_VERSION")
);
println!("======================================");
}
if !engram.exists() {
anyhow::bail!("Engram file not found: {}", engram.display());
}
if !manifest.exists() {
anyhow::bail!("Manifest file not found: {}", manifest.display());
}
let mut fs = EmbrFS::load(&engram, &manifest)?;
if verbose {
println!("Removing file: {}", path);
}
fs.remove_file(&path, verbose)?;
fs.save_manifest(&manifest)?;
if verbose {
println!("\nRemove complete!");
println!(" File removed: {}", path);
println!(" Note: Use 'update compact' to reclaim space from deleted files");
}
Ok(())
}
pub fn handle_update_modify(
engram: PathBuf,
manifest: PathBuf,
file: PathBuf,
logical_path: Option<String>,
verbose: bool,
) -> Result<()> {
if verbose {
println!(
"Embeddenator v{} - Incremental Modify",
env!("CARGO_PKG_VERSION")
);
println!("======================================");
}
if !engram.exists() {
anyhow::bail!("Engram file not found: {}", engram.display());
}
if !manifest.exists() {
anyhow::bail!("Manifest file not found: {}", manifest.display());
}
if !file.exists() {
anyhow::bail!("Input file not found: {}", file.display());
}
let mut fs = EmbrFS::load(&engram, &manifest)?;
let config = ReversibleVSAConfig::default();
let logical = logical_path.unwrap_or_else(|| {
file.file_name()
.and_then(|s| s.to_str())
.unwrap_or("unnamed")
.to_string()
});
if verbose {
println!("Modifying file: {} -> {}", file.display(), logical);
}
fs.modify_file(&file, logical.clone(), verbose, &config)?;
fs.save_engram(&engram)?;
fs.save_manifest(&manifest)?;
if verbose {
println!("\nModify complete!");
println!(" File updated: {}", logical);
println!(" Note: Use 'update compact' to reclaim space from old versions");
}
Ok(())
}
pub fn handle_update_compact(engram: PathBuf, manifest: PathBuf, verbose: bool) -> Result<()> {
if verbose {
println!(
"Embeddenator v{} - Compact Engram",
env!("CARGO_PKG_VERSION")
);
println!("===================================");
}
if !engram.exists() {
anyhow::bail!("Engram file not found: {}", engram.display());
}
if !manifest.exists() {
anyhow::bail!("Manifest file not found: {}", manifest.display());
}
let mut fs = EmbrFS::load(&engram, &manifest)?;
let deleted_count = fs.manifest.files.iter().filter(|f| f.deleted).count();
if deleted_count == 0 {
if verbose {
println!("No deleted files to compact. Engram is already optimal.");
}
return Ok(());
}
let config = ReversibleVSAConfig::default();
if verbose {
println!("Found {} deleted file(s) to remove", deleted_count);
println!("Rebuilding engram...");
}
fs.compact(verbose, &config)?;
fs.save_engram(&engram)?;
fs.save_manifest(&manifest)?;
if verbose {
println!("\nCompact complete!");
println!(" Removed {} deleted file(s)", deleted_count);
println!(
" Active files: {}",
fs.manifest.files.iter().filter(|f| !f.deleted).count()
);
}
Ok(())
}