use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
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,
pub user_meta: Value,
#[serde(alias = "createdAt")]
pub created_at: DateTime<Utc>,
#[serde(alias = "updatedAt")]
pub updated_at: DateTime<Utc>,
}
#[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,
pub user_meta: Value,
#[serde(alias = "createdAt")]
pub created_at: DateTime<Utc>,
#[serde(alias = "updatedAt")]
pub updated_at: DateTime<Utc>,
}
pub trait DataEngine: Sized {
type Uri: ?Sized;
fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
fn create_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
fn delete_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
fn create_object(
&self,
bucket_name: &str,
object_name: &str,
data: &[u8],
) -> impl Future<Output = EngineResult<()>> + Send;
fn read_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl Future<Output = EngineResult<Vec<u8>>> + Send;
fn delete_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl Future<Output = EngineResult<()>> + Send;
}
pub trait MetaEngine: Sized {
type Uri: ?Sized;
fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
fn create_bucket_meta(
&self,
meta: &BucketMeta,
) -> impl Future<Output = EngineResult<()>> + Send;
fn read_bucket_meta(
&self,
bucket_name: &str,
) -> impl Future<Output = EngineResult<BucketMeta>> + Send;
fn delete_bucket_meta(
&self,
bucket_name: &str,
) -> impl Future<Output = EngineResult<()>> + Send;
fn list_buckets_meta(&self) -> impl Future<Output = EngineResult<Vec<BucketMeta>>> + Send;
fn touch_object(
&self,
bucket_name: &str,
object_name: &str,
) -> impl Future<Output = EngineResult<()>> + Send;
fn create_object_meta(
&self,
meta: &ObjectMeta,
) -> impl Future<Output = EngineResult<()>> + Send;
fn read_object_meta(
&self,
bucket_name: &str,
object_name: &str,
) -> impl Future<Output = EngineResult<ObjectMeta>> + Send;
fn delete_object_meta(
&self,
bucket_name: &str,
object_name: &str,
) -> impl Future<Output = EngineResult<()>> + Send;
fn list_objects_meta(
&self,
bucket_name: &str,
) -> impl Future<Output = EngineResult<Vec<ObjectMeta>>> + Send;
fn touch_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
}
impl ObjectMeta {
pub fn update_with(self, mut rhs: ObjectMeta) -> ObjectMeta {
rhs.created_at = self.created_at;
rhs
}
}
impl BucketMeta {
pub fn new(name: String, user_meta: Value) -> Self {
Self {
name,
user_meta,
created_at: Utc::now(),
updated_at: Utc::now(),
}
}
pub fn update_with(self, mut rhs: BucketMeta) -> BucketMeta {
rhs.created_at = self.created_at;
rhs
}
}