use crate::prelude::StateMutationResult;
use crate::prelude::StateQueryResult;
use holo_hash::AgentPubKey;
use holochain_types::prelude::CellId;
use holochain_types::prelude::DnaDef;
#[derive(Clone)]
pub struct DnaDefStore<Db = holochain_data::DbWrite<holochain_data::kind::Wasm>> {
db: Db,
}
pub type DnaDefStoreRead = DnaDefStore<holochain_data::DbRead<holochain_data::kind::Wasm>>;
impl<Db> DnaDefStore<Db> {
pub fn new(db: Db) -> Self {
Self { db }
}
}
impl DnaDefStore<holochain_data::DbRead<holochain_data::kind::Wasm>> {
pub async fn get(&self, cell_id: &CellId) -> StateQueryResult<Option<(CellId, DnaDef)>> {
match self.db.get_dna_def(cell_id).await? {
Some(dna_def) => Ok(Some((cell_id.clone(), dna_def))),
None => Ok(None),
}
}
}
impl DnaDefStore<holochain_data::DbWrite<holochain_data::kind::Wasm>> {
pub async fn put(&self, agent: &AgentPubKey, dna_def: &DnaDef) -> StateMutationResult<()> {
self.db.put_dna_def(agent, dna_def).await?;
Ok(())
}
pub fn as_read(&self) -> DnaDefStoreRead {
DnaDefStore::new(self.db.as_ref().clone())
}
pub fn into_read(self) -> DnaDefStoreRead {
DnaDefStore::new(self.db.into())
}
}
impl From<DnaDefStore<holochain_data::DbWrite<holochain_data::kind::Wasm>>> for DnaDefStoreRead {
fn from(store: DnaDefStore<holochain_data::DbWrite<holochain_data::kind::Wasm>>) -> Self {
store.into_read()
}
}
#[cfg(feature = "test_utils")]
impl<Db> DnaDefStore<Db>
where
Db: AsRef<holochain_data::DbRead<holochain_data::kind::Wasm>>,
{
pub fn raw_db_read(&self) -> &holochain_data::DbRead<holochain_data::kind::Wasm> {
self.db.as_ref()
}
}