use std::sync::Arc;
use tempfile::tempdir;
use tokio::runtime::Handle;
use file_backed::fbstore::{BinCodec, FBStore, PreparedPath};
use file_backed::{BackingStore, FBPool};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cache_dir = tempdir()?;
let persist_dir = tempdir()?;
let cache_store_path = cache_dir.path().to_path_buf();
let persist_store_path = persist_dir.path().to_path_buf();
println!("Cache path: {}", cache_store_path.display());
println!("Persist path: {}", persist_store_path.display());
let persisted_key;
{
let prepared_cache_path = PreparedPath::new(cache_store_path.clone(), vec![]).await;
let prepared_persist_path = PreparedPath::new(persist_store_path.clone(), vec![]).await;
let fb_store = FBStore::new(BinCodec, prepared_cache_path);
let store = Arc::new(BackingStore::new(fb_store, Handle::current()));
let pool: Arc<FBPool<String, _>> = Arc::new(FBPool::new(store.clone(), 1));
let tracked_persist = Arc::new(store.track_path(prepared_persist_path).await?);
let item1 = pool.insert("Persisted Data".to_string());
persisted_key = item1.key();
item1.spawn_persist(&tracked_persist).await.await?;
println!("Persisted item with key: {}", persisted_key);
store.finished().await;
}
{
let prepared_cache_path = PreparedPath::new(cache_store_path, vec![]).await;
let prepared_persist_path = PreparedPath::new(persist_store_path, vec![]).await;
let fb_store = FBStore::new(BinCodec, prepared_cache_path);
let store = Arc::new(BackingStore::new(fb_store, Handle::current()));
let pool: Arc<FBPool<String, _>> = Arc::new(FBPool::new(store.clone(), 1));
let tracked_persist = Arc::new(store.track_path(prepared_persist_path).await?);
let registered_item = pool
.register(&tracked_persist, persisted_key)
.await
.expect("Failed to register item");
println!("Registered item with key: {}", persisted_key);
let guard = registered_item.load().await;
println!("Loaded registered data: {}", *guard);
assert_eq!(*guard, "Persisted Data");
drop(guard);
store.finished().await;
}
Ok(())
}