use nusy_arrow_core::{Namespace, Triple, YLayer};
use nusy_arrow_git::{CommitsTable, GitObjectStore, checkout, create_commit, diff};
fn make_triple(subject: &str, predicate: &str, object: &str) -> Triple {
Triple {
subject: subject.to_string(),
predicate: predicate.to_string(),
object: object.to_string(),
graph: None,
confidence: Some(1.0),
source_document: None,
source_chunk_id: None,
extracted_by: None,
caused_by: None,
derived_from: None,
consolidated_at: None,
certifiability_class: None,
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let tmp = tempfile::tempdir()?;
let mut obj = GitObjectStore::with_snapshot_dir(tmp.path().join("snapshots"));
let mut commits = CommitsTable::new();
obj.store.add_triple(
&make_triple("alice", "knows", "bob"),
Namespace::World,
YLayer::Semantic,
)?;
obj.store.add_triple(
&make_triple("alice", "role", "engineer"),
Namespace::World,
YLayer::Semantic,
)?;
let c1 = create_commit(
&obj,
&mut commits,
vec![],
"Add alice's relationships",
"example",
)?;
println!("Commit 1: {} — '{}'", &c1.commit_id[..8], c1.message);
println!(" Store has {} triples", obj.store.len());
obj.store.add_triple(
&make_triple("bob", "knows", "carol"),
Namespace::World,
YLayer::Semantic,
)?;
obj.store.add_triple(
&make_triple("bob", "role", "designer"),
Namespace::World,
YLayer::Semantic,
)?;
let c2 = create_commit(
&obj,
&mut commits,
vec![c1.commit_id.clone()],
"Add bob's relationships",
"example",
)?;
println!("Commit 2: {} — '{}'", &c2.commit_id[..8], c2.message);
println!(" Store has {} triples", obj.store.len());
let changes = diff(&mut obj, &commits, &c1.commit_id, &c2.commit_id)?;
println!("\nDiff (commit 1 → commit 2):");
println!(" Added: {} triples", changes.added.len());
for entry in &changes.added {
println!(
" + {} → {} → {}",
entry.subject, entry.predicate, entry.object
);
}
println!(" Removed: {} triples", changes.removed.len());
checkout(&mut obj, &commits, &c1.commit_id)?;
println!("\nAfter checkout to commit 1:");
println!(
" Store has {} triples (bob's data is gone)",
obj.store.len()
);
checkout(&mut obj, &commits, &c2.commit_id)?;
println!("\nAfter checkout to commit 2:");
println!(
" Store has {} triples (everything restored)",
obj.store.len()
);
let history = nusy_arrow_git::log(&commits, &c2.commit_id, 0);
println!("\nCommit history (newest first):");
for commit in &history {
println!(
" {} — {} (by {})",
&commit.commit_id[..8],
commit.message,
commit.author
);
}
println!("\nDone!");
Ok(())
}