use std::error::Error;
use epoch_db::DB;
use tempfile::tempdir;
fn main() -> Result<(), Box<dyn Error>> {
let temp_dir = tempdir()?;
let db = DB::new(temp_dir.path())?;
println!("Database created successfully.");
db.set("user:alice", "100", None)?;
db.set("user:bob", "50", None)?;
println!("Initial state:");
println!(" - Alice's balance: {}", db.get("user:alice")?.unwrap());
println!(" - Bob's balance: {}", db.get("user:bob")?.unwrap());
println!("\nAttempting to transfer 20 from Alice to Bob...");
let transaction_result = db.transaction(|tx| {
let alice_balance_str = tx.get("user:alice")?.unwrap();
let bob_balance_str = tx.get("user:bob")?.unwrap();
let mut alice_balance: u64 = alice_balance_str.parse()?;
let mut bob_balance: u64 = bob_balance_str.parse()?;
let transfer_amount = 20;
if alice_balance < transfer_amount {
return Err(Box::from("Alice has insufficient funds!"));
}
alice_balance -= transfer_amount;
bob_balance += transfer_amount;
tx.set("user:alice", &alice_balance.to_string(), None)?;
tx.set("user:bob", &bob_balance.to_string(), None)?;
Ok(())
});
if let Err(e) = transaction_result {
println!("\nTransaction failed: {}", e);
} else {
println!("\nTransaction successful!");
}
println!("\nFinal state:");
println!(" - Alice's balance: {}", db.get("user:alice")?.unwrap());
println!(" - Bob's balance: {}", db.get("user:bob")?.unwrap());
assert_eq!(db.get("user:alice")?.unwrap(), "80");
assert_eq!(db.get("user:bob")?.unwrap(), "70");
Ok(())
}