1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use crate::error::EngineResult;
6
7pub mod error;
8pub mod fs;
9
10pub type DataSource = fs::FsDataEngine;
11pub type MetaSource = fs::FsMetaEngine;
12
13#[derive(Serialize, Deserialize, Default, PartialEq, Debug)]
15#[serde(rename_all = "kebab-case")]
16pub struct BucketMeta {
17 pub name: String,
18 pub user_meta: Value,
19
20 #[serde(alias = "createdAt")]
21 pub created_at: DateTime<Utc>,
22
23 #[serde(alias = "updatedAt")]
24 pub updated_at: DateTime<Utc>,
25}
26
27#[derive(Serialize, Deserialize, Default, PartialEq, Debug)]
29#[serde(rename_all = "kebab-case")]
30pub struct ObjectMeta {
31 pub object_name: String,
32 pub bucket_name: String,
33 pub size: u64,
34 pub content_type: String,
35 pub etag: String,
36 pub user_meta: Value,
37
38 #[serde(alias = "createdAt")]
39 pub created_at: DateTime<Utc>,
40
41 #[serde(alias = "updatedAt")]
42 pub updated_at: DateTime<Utc>,
43}
44
45pub trait DataEngine: Sized {
47 type Uri: ?Sized;
48
49 fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
51
52 fn create_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
54
55 fn delete_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
57
58 fn create_object(
60 &self,
61 bucket_name: &str,
62 object_name: &str,
63 data: &[u8],
64 ) -> impl Future<Output = EngineResult<()>> + Send;
65
66 fn read_object(
68 &self,
69 bucket_name: &str,
70 object_name: &str,
71 ) -> impl Future<Output = EngineResult<Vec<u8>>> + Send;
72
73 fn delete_object(
75 &self,
76 bucket_name: &str,
77 object_name: &str,
78 ) -> impl Future<Output = EngineResult<()>> + Send;
79}
80
81pub trait MetaEngine: Sized {
83 type Uri: ?Sized;
84
85 fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
86
87 fn create_bucket_meta(
91 &self,
92 meta: &BucketMeta,
93 ) -> impl Future<Output = EngineResult<()>> + Send;
94
95 fn read_bucket_meta(
97 &self,
98 bucket_name: &str,
99 ) -> impl Future<Output = EngineResult<BucketMeta>> + Send;
100
101 fn delete_bucket_meta(
103 &self,
104 bucket_name: &str,
105 ) -> impl Future<Output = EngineResult<()>> + Send;
106
107 fn list_buckets_meta(&self) -> impl Future<Output = EngineResult<Vec<BucketMeta>>> + Send;
109
110 fn touch_object(
112 &self,
113 bucket_name: &str,
114 object_name: &str,
115 ) -> impl Future<Output = EngineResult<()>> + Send;
116
117 fn create_object_meta(
121 &self,
122 meta: &ObjectMeta,
123 ) -> impl Future<Output = EngineResult<()>> + Send;
124
125 fn read_object_meta(
127 &self,
128 bucket_name: &str,
129 object_name: &str,
130 ) -> impl Future<Output = EngineResult<ObjectMeta>> + Send;
131
132 fn delete_object_meta(
134 &self,
135 bucket_name: &str,
136 object_name: &str,
137 ) -> impl Future<Output = EngineResult<()>> + Send;
138
139 fn list_objects_meta(
141 &self,
142 bucket_name: &str,
143 ) -> impl Future<Output = EngineResult<Vec<ObjectMeta>>> + Send;
144
145 fn touch_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
147}
148
149impl ObjectMeta {
150 pub fn update_with(self, mut rhs: ObjectMeta) -> ObjectMeta {
151 rhs.created_at = self.created_at;
152 rhs
153 }
154}
155
156impl BucketMeta {
157 pub fn new(name: String, user_meta: Value) -> Self {
158 Self {
159 name,
160 user_meta,
161 created_at: Utc::now(),
162 updated_at: Utc::now(),
163 }
164 }
165
166 pub fn update_with(self, mut rhs: BucketMeta) -> BucketMeta {
167 rhs.created_at = self.created_at;
168 rhs
169 }
170}