1use std::{future::Future, pin::Pin};
2
3use thiserror::Error;
4
5pub type DataFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
6
7#[derive(Debug, Error)]
8pub enum DataError {
9 #[error("Connection failed: {0}")]
10 Connection(String),
11 #[error("Query failed: {0}")]
12 Query(String),
13 #[error("Serialization failed: {0}")]
14 Serialization(String),
15 #[error("Not found")]
16 NotFound,
17}
18
19pub trait DocumentRepo<T>: Send + Sync {
20 type Id: Send + Sync + Clone + 'static;
21 fn find_all(&self) -> DataFuture<'_, Result<Vec<T>, DataError>>;
22 fn find_by_id(&self, id: Self::Id) -> DataFuture<'_, Result<Option<T>, DataError>>;
23 fn insert(&self, doc: T) -> DataFuture<'_, Result<T, DataError>>;
24 fn update(&self, id: Self::Id, doc: T) -> DataFuture<'_, Result<T, DataError>>;
25 fn delete(&self, id: Self::Id) -> DataFuture<'_, Result<(), DataError>>;
26}
27
28pub trait CacheStore: Send + Sync {
29 fn get(&self, key: &str) -> DataFuture<'_, Result<Option<String>, DataError>>;
30 fn set(
31 &self,
32 key: &str,
33 value: &str,
34 ttl_seconds: Option<u64>,
35 ) -> DataFuture<'_, Result<(), DataError>>;
36 fn delete(&self, key: &str) -> DataFuture<'_, Result<(), DataError>>;
37}