use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::path::Path;
use crate::error::EngineResult;
pub mod error;
pub mod fs;
pub type DataSource = fs::FsDataEngine;
pub type MetaSource = fs::FsMetaEngine;
#[derive(Serialize, Deserialize, Default, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct BucketMeta {
pub name: String,
#[serde(alias = "createdAt")]
pub created_at: DateTime<Utc>,
#[serde(alias = "updatedAt")]
pub updated_at: DateTime<Utc>,
pub user_meta: serde_json::Value,
}
#[derive(Serialize, Deserialize, Default, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct ObjectMeta {
pub object_name: String,
pub bucket_name: String,
pub size: u64,
pub content_type: String,
pub etag: String,
#[serde(alias = "createdAt")]
pub created_at: DateTime<Utc>,
#[serde(alias = "updatedAt")]
pub updated_at: DateTime<Utc>,
pub user_meta: serde_json::Value,
}
pub trait DataEngine: Sized {
fn new<P: AsRef<Path>>(base_dir: P) -> EngineResult<Self>;
fn create_bucket(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn delete_bucket(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn create_object(
&self,
bucket_name: &str,
object_name: &str,
data: &[u8],
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn read_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl std::future::Future<Output = EngineResult<Vec<u8>>> + Send;
fn delete_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
}
pub trait MetaEngine: Sized {
fn new<P: AsRef<Path>>(base_dir: P) -> EngineResult<Self>;
fn create_bucket_meta(
&self,
meta: &BucketMeta,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn read_bucket_meta(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<BucketMeta>> + Send;
fn delete_bucket_meta(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn list_buckets_meta(
&self,
) -> impl std::future::Future<Output = EngineResult<Vec<BucketMeta>>> + Send;
fn touch_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn create_object_meta(
&self,
meta: &ObjectMeta,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn read_object_meta(
&self,
bucket_name: &str,
object_name: &str,
) -> impl std::future::Future<Output = EngineResult<ObjectMeta>> + Send;
fn delete_object_meta(
&self,
bucket_name: &str,
object_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
fn list_objects_meta(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<Vec<ObjectMeta>>> + Send;
fn touch_bucket(
&self,
bucket_name: &str,
) -> impl std::future::Future<Output = EngineResult<()>> + Send;
}