refactor: extract Store methods, clean up shell-outs

- Add Store::upsert() — generic create-or-update, used by cmd_write
- Add Store::insert_node() — for pre-constructed nodes (journal entries)
- Add Store::delete_node() — soft-delete with version bump
- Simplify cmd_write (20 → 8 lines), cmd_node_delete (16 → 7 lines),
  cmd_journal_write (removes manual append/insert/save boilerplate)
- Replace generate_cookie shell-out to head/urandom with direct
  /dev/urandom read + const alphabet table

main.rs: 1137 → 1109 lines.
This commit is contained in:
ProofOfConcept 2026-02-28 23:49:43 -05:00
parent 29d5ed47a1
commit 0ea86b8d54
3 changed files with 62 additions and 55 deletions

View file

@ -793,24 +793,10 @@ fn cmd_node_delete(args: &[String]) -> Result<(), String> {
let key = args.join(" ");
let mut store = capnp_store::Store::load()?;
let resolved = store.resolve_key(&key)?;
let updated = if let Some(node) = store.nodes.get_mut(&resolved) {
node.deleted = true;
node.version += 1;
Some(node.clone())
} else {
None
};
if let Some(node) = updated {
store.append_nodes(&[node])?;
store.nodes.remove(&resolved);
store.save()?;
println!("Deleted '{}'", resolved);
Ok(())
} else {
Err(format!("No node '{}'", resolved))
}
store.delete_node(&resolved)?;
store.save()?;
println!("Deleted '{}'", resolved);
Ok(())
}
fn cmd_load_context() -> Result<(), String> {
@ -923,27 +909,15 @@ fn cmd_write(args: &[String]) -> Result<(), String> {
}
let mut store = capnp_store::Store::load()?;
if let Some(existing) = store.nodes.get(&key) {
if existing.content == content {
println!("No change: '{}'", key);
return Ok(());
}
let mut node = existing.clone();
node.content = content;
node.version += 1;
store.append_nodes(std::slice::from_ref(&node))?;
store.nodes.insert(key.clone(), node);
println!("Updated '{}' (v{})", key, store.nodes[&key].version);
} else {
let node = capnp_store::Store::new_node(&key, &content);
store.append_nodes(std::slice::from_ref(&node))?;
store.uuid_to_key.insert(node.uuid, node.key.clone());
store.nodes.insert(key.clone(), node);
println!("Created '{}'", key);
let result = store.upsert(&key, &content)?;
match result {
"unchanged" => println!("No change: '{}'", key),
"updated" => println!("Updated '{}' (v{})", key, store.nodes[&key].version),
_ => println!("Created '{}'", key),
}
if result != "unchanged" {
store.save()?;
}
store.save()?;
Ok(())
}
@ -1055,13 +1029,11 @@ fn cmd_journal_write(args: &[String]) -> Result<(), String> {
let mut node = capnp_store::Store::new_node(&key, &content);
node.node_type = capnp_store::NodeType::EpisodicSession;
node.provenance = capnp_store::Provenance::Journal;
if let Some(ref src) = source_ref {
node.source_ref = src.clone();
if let Some(src) = source_ref {
node.source_ref = src;
}
store.append_nodes(&[node.clone()])?;
store.uuid_to_key.insert(node.uuid, node.key.clone());
store.nodes.insert(key.clone(), node);
store.insert_node(node)?;
store.save()?;
let word_count = text.split_whitespace().count();