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:
parent
29d5ed47a1
commit
0ea86b8d54
3 changed files with 62 additions and 55 deletions
58
src/main.rs
58
src/main.rs
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue