#![allow(dead_code)]
use std::collections::HashMap;
use std::pin::Pin;
use axum::async_trait;
use futures::Stream;
use tokio::io::{AsyncRead, AsyncWrite};
mod fs_storage;
pub use fs_storage::{FSError, FSStorage};
mod database;
pub use database::DatabaseInfo;
mod element;
pub use element::ElementInfo;
#[async_trait]
pub trait BackendStorage: Send + Sync {
type Error: std::error::Error + Send + Sync;
async fn new_database(
&self,
name: &str,
) -> Result<DatabaseInfo, Self::Error>;
async fn database_metadata(
&self,
name: &str,
) -> Result<Option<DatabaseInfo>, Self::Error>;
async fn list_element_in_database(
&self,
db: &str,
start_after: Option<&str>,
) -> Result<
Pin<Box<dyn Stream<Item = Result<ElementInfo, Self::Error>> + Send>>,
Self::Error,
>;
async fn get_element_in_database<T: AsyncWrite + Send + Unpin>(
&self,
db: &str,
key: &str,
writer: &mut T,
) -> Result<u64, Self::Error>;
async fn get_element_metadata_in_database(
&self,
db: &str,
key: &str,
) -> Result<Option<ElementInfo>, Self::Error>;
async fn insert_element_in_database<R: AsyncRead + Unpin + Send>(
&self,
db: &str,
name_elt: &str,
metadatas: HashMap<String, String>,
content: &mut R,
) -> Result<ElementInfo, Self::Error>;
async fn delete_element_in_database(
&self,
db: &str,
name_elt: &str,
) -> Result<(), Self::Error>;
}