use anyhow::Result;
use engula_client::{Any, Blob, List, Map, Universe, I64};
#[tokio::main]
async fn main() -> Result<()> {
let url = "http://localhost:21716";
let uv = Universe::connect(url).await?;
let db = uv.create_database("db").await?;
let c1 = db.create_collection::<Any>("c1").await?;
let c2 = db.create_collection::<I64>("c2").await?;
let c3 = db.create_collection::<Blob>("c3").await?;
let c4 = db.create_collection::<List<Any>>("c4").await?;
let c5 = db.create_collection::<List<I64>>("c5").await?;
let c6 = db.create_collection::<List<Blob>>("c6").await?;
let c7 = db.create_collection::<Map<Any>>("c7").await?;
let c8 = db.create_collection::<Map<I64>>("c8").await?;
let c9 = db.create_collection::<Map<Blob>>("c9").await?;
{
c1.set("o", 1).await?;
c1.set("o", vec![1u8, 2u8]).await?;
c1.set("o", vec![1i64, 2i64]).await?;
println!("c1.o = {:?}", c1.get("o").await?);
c1.delete("o").await?;
c2.set("o", 1).await?;
println!("c2.o = {:?}", c2.get("o").await?);
c3.set("o", vec![1, 2]).await?;
println!("c3.o = {:?}", c3.get("o").await?);
c4.set("o", vec![1.into(), 2.into()]).await?;
println!("c4.o = {:?}", c4.get("o").await?);
c5.set("o", vec![1, 2]).await?;
println!("c5.o = {:?}", c5.get("o").await?);
c6.set("o", vec![vec![1], vec![2]]).await?;
println!("c6.o = {:?}", c6.get("o").await?);
c7.set("o", [(vec![1], 1.into()), (vec![2], vec![2u8].into())])
.await?;
println!("c7.o = {:?}", c7.get("o").await?);
c8.set("o", [(vec![1], 1), (vec![2], 2)]).await?;
println!("c8.o = {:?}", c8.get("o").await?);
c9.set("o", [(vec![1], vec![1]), (vec![2], vec![2])])
.await?;
println!("c9.o = {:?}", c9.get("o").await?);
}
{
c1.set("o", 1).await?;
c1.object("o").add(1).await?;
println!("c1.o = {:?}", c1.get("o").await?);
c2.object("o").add(2).await?;
println!("c2.o = {:?}", c2.get("o").await?);
c3.object("o").append(vec![3u8, 4u8]).await?;
println!("c3.o = {:?}", c3.get("o").await?);
println!("c3.o.len = {:?}", c3.object("o").len().await?);
c5.object("o").push_back(3).await?;
c5.object("o").push_front(0).await?;
println!("c5.o = {:?}", c5.get("o").await?);
println!("c5.o.len = {:?}", c5.object("o").len().await?);
c9.object("o").set(vec![3], vec![3]).await?;
c9.object("o").delete(vec![1]).await?;
println!("c9.o = {:?}", c9.get("o").await?);
println!("c9.o.len = {:?}", c9.object("o").len().await?);
println!("c9.o.[3] = {:?}", c9.object("o").get(vec![3]).await?);
}
{
let mut txn = c5.object("txn").begin();
txn.push_back(1).push_front(0);
txn.commit().await?;
println!("c5.txn = {:?}", c5.get("txn").await?);
let mut txn = c9.object("txn").begin();
txn.set(vec![1], vec![1])
.set(vec![2], vec![2])
.delete(vec![3]);
txn.commit().await?;
println!("c9.txn = {:?}", c9.get("txn").await?);
}
{
let mut txn = c2.begin();
txn.set("a", 1);
txn.object("b").add(1).sub(2);
txn.commit().await?;
let mut txn = c5.begin();
txn.set("a", vec![1, 2]);
txn.object("b").push_back(3).push_front(0);
txn.commit().await?;
}
{
let txn = db.begin();
{
let mut t = c5.begin_with(txn.clone());
t.set("a", vec![1, 2]);
t.object("b").push_back(3);
t.commit().await?;
}
{
let mut t = c9.begin_with(txn.clone());
t.set("a", [(vec![1], vec![1]), (vec![2], vec![2])]);
t.object("b").set(vec![3], vec![3]);
t.commit().await?;
}
txn.commit().await?;
}
Ok(())
}