use mempill::{open_default_in_memory, recall, remember, RememberOptions};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let engine = open_default_in_memory()?;
let agent = "my-agent";
remember(
&engine,
agent,
"user",
"city",
"Berlin",
RememberOptions::new()
.valid_from("2020-01-01")
.valid_until("2025-01-01"),
)
.await?;
remember(
&engine,
agent,
"user",
"city",
"Munich",
RememberOptions::new().valid_from("2025-01-01"),
)
.await?;
let result = recall(&engine, agent, "user", "city").await?;
assert_eq!(result.as_str(), Some("Munich"), "expected Munich to be the live value");
assert!(!result.is_contested(), "expected Resolved, not Contested");
println!("city = {:?} (is_contested={})", result.as_str(), result.is_contested());
remember(&engine, agent, "acme", "ceo", "Alice", RememberOptions::new()).await?;
remember(&engine, agent, "acme", "ceo", "Bob", RememberOptions::new()).await?;
let ceo = recall(&engine, agent, "acme", "ceo").await?;
assert!(ceo.is_contested(), "expected Contested after two timeless conflicting facts");
assert_eq!(ceo.candidates.len(), 2, "both Alice and Bob must surface as candidates");
assert!(ceo.value.is_none(), "Contested: value is None — use candidates, not value");
println!(
"acme/ceo: is_contested={}, value={:?}, candidates={:?}",
ceo.is_contested(),
ceo.value,
ceo.candidates.iter().map(|c| &c.value).collect::<Vec<_>>(),
);
println!("quickstart passed");
Ok(())
}