use anyhow::Result;
use chrono::Utc;
use rand_chacha::ChaCha12Rng;
use rand_core::{CryptoRngCore, SeedableRng};
use wnfs::{
common::{BlockStore, MemoryBlockStore},
nameaccumulator::AccumulatorSetup,
private::{
AccessKey, PrivateDirectory, PrivateNode,
forest::{hamt::HamtForest, traits::PrivateForest},
},
};
use wnfs_common::{Cid, Storable, utils::CondSend};
#[async_std::main]
async fn main() -> Result<()> {
let store = &MemoryBlockStore::default();
let rng = &mut ChaCha12Rng::from_entropy();
let (forest_cid, access_key) = create_forest_and_add_directory(store, rng).await?;
let forest = HamtForest::load(&forest_cid, store).await?;
let dir = PrivateNode::load(&access_key, &forest, store, None).await?;
println!("{:#?}", dir);
Ok(())
}
async fn create_forest_and_add_directory(
store: &impl BlockStore,
rng: &mut (impl CryptoRngCore + CondSend),
) -> Result<(Cid, AccessKey)> {
let setup = AccumulatorSetup::trusted(rng);
let forest = &mut HamtForest::new_rc(setup);
let dir = &mut PrivateDirectory::new_rc(&forest.empty_name(), Utc::now(), rng);
dir.mkdir(
&["pictures".into(), "cats".into()],
true,
Utc::now(),
forest,
store,
rng,
)
.await?;
let access_key = dir.as_node().store(forest, store, rng).await?;
let forest_cid = forest.store(store).await?;
Ok((forest_cid, access_key))
}