use std::thread;
use std::time::Duration;
use emdb::{Emdb, Ttl};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = Emdb::builder()
.default_ttl(Duration::from_secs(3600))
.build()?;
db.insert("session:alice", "active")?;
db.insert("session:bob", "active")?;
db.insert_with_ttl("blip", "ghost", Ttl::After(Duration::from_millis(50)))?;
db.insert_with_ttl("forever", "never-expires", Ttl::Never)?;
println!("inserted 4 records, len = {}", db.len()?);
assert!(db.get("blip")?.is_some());
thread::sleep(Duration::from_millis(80));
assert!(db.get("blip")?.is_none(), "blip should be expired");
println!("after 80 ms wait, 'blip' returns None via lazy expiry");
println!("len() before sweep = {}", db.len()?);
let swept = db.sweep_expired();
println!("sweep_expired removed {swept} record(s)");
println!("len() after sweep = {}", db.len()?);
assert_eq!(
db.get("forever")?.as_deref(),
Some(b"never-expires".as_slice())
);
if let Some(remaining) = db.ttl("session:alice")? {
println!("session:alice has {} s remaining", remaining.as_secs());
}
let stripped = db.persist("session:alice")?;
println!("persist('session:alice') = {stripped}");
assert!(db.ttl("session:alice")?.is_none());
Ok(())
}