use candid::CandidType;
use serde::{Deserialize, Serialize};
use crate::database::types::{Document, QueryResponse};
pub trait Database<T>
where
T: CandidType + Serialize + for<'de> Deserialize<'de> + Clone,
{
type Error;
fn insert(
&self,
partition_key: String,
sort_key: Option<String>,
data: T,
) -> Result<Document<T>, Self::Error>;
fn get(
&self,
partition_key: &str,
sort_key: Option<String>,
) -> Result<Option<Document<T>>, Self::Error>;
fn query(
&self,
partition_key: Option<&str>,
page_size: usize,
page_number: usize,
) -> Result<QueryResponse<T>, Self::Error>;
}
pub trait Query<T> {
type Error;
fn filter_by_partition_key(self, key: &str) -> Self;
fn page_size(self, size: usize) -> Self;
fn page_number(self, number: usize) -> Self;
fn execute(self) -> Result<QueryResponse<T>, Self::Error>;
}