use std::sync::Arc;
use async_trait::async_trait;
use tracing::warn;
use crate::error::{MutationError, RetrievalError};
use ankurah_proto::{Attested, CollectionId, EntityId, EntityState, Event, EventId};
pub fn state_name(name: &str) -> String { format!("{}_state", name) }
pub fn event_name(name: &str) -> String { format!("{}_event", name) }
#[async_trait]
pub trait StorageEngine: Send + Sync {
type Value;
async fn collection(&self, id: &CollectionId) -> Result<Arc<dyn StorageCollection>, RetrievalError>;
async fn delete_all_collections(&self) -> Result<bool, MutationError>;
}
#[async_trait]
pub trait StorageCollection: Send + Sync {
async fn set_state(&self, state: Attested<EntityState>) -> Result<bool, MutationError>;
async fn get_state(&self, id: EntityId) -> Result<Attested<EntityState>, RetrievalError>;
async fn fetch_states(&self, predicate: &ankql::ast::Predicate) -> Result<Vec<Attested<EntityState>>, RetrievalError>;
async fn set_states(&self, states: Vec<Attested<EntityState>>) -> Result<(), MutationError> {
for state in states {
self.set_state(state).await?;
}
Ok(())
}
async fn get_states(&self, ids: Vec<EntityId>) -> Result<Vec<Attested<EntityState>>, RetrievalError> {
let mut states = Vec::new();
for id in ids {
match self.get_state(id).await {
Ok(state) => states.push(state),
Err(RetrievalError::EntityNotFound(_)) => {
warn!("Entity not found: {:?}", id);
}
Err(e) => return Err(e),
}
}
Ok(states)
}
async fn add_event(&self, entity_event: &Attested<Event>) -> Result<bool, MutationError>;
async fn get_events(&self, event_ids: Vec<EventId>) -> Result<Vec<Attested<Event>>, RetrievalError>;
async fn dump_entity_events(&self, id: EntityId) -> Result<Vec<Attested<Event>>, RetrievalError>;
}
#[derive(Clone)]
pub struct StorageCollectionWrapper(pub(crate) Arc<dyn StorageCollection>);
impl StorageCollectionWrapper {
pub fn new(bucket: Arc<dyn StorageCollection>) -> Self { Self(bucket) }
}
impl std::ops::Deref for StorageCollectionWrapper {
type Target = Arc<dyn StorageCollection>;
fn deref(&self) -> &Self::Target { &self.0 }
}