Skip to main content

crab_vault_engine/
lib.rs

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/// Bucket 的元数据结构
14#[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/// Object 的元数据结构
28#[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
45/// 此 trait 定义了 object 从何处来,所有的操作,都是幂等的
46pub trait DataEngine: Sized {
47    type Uri: ?Sized;
48
49    /// 创建一个新的实现了 [`DataEngine`] 的实例
50    fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
51
52    /// 创建一个 bucket
53    fn create_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
54
55    /// 删除一个 bucket
56    fn delete_bucket(&self, bucket_name: &str) -> impl Future<Output = EngineResult<()>> + Send;
57
58    /// 创建一个 object
59    fn create_object(
60        &self,
61        bucket_name: &str,
62        object_name: &str,
63        data: &[u8],
64    ) -> impl Future<Output = EngineResult<()>> + Send;
65
66    /// 读取一个 object
67    fn read_object(
68        &self,
69        bucket_name: &str,
70        object_name: &str,
71    ) -> impl Future<Output = EngineResult<Vec<u8>>> + Send;
72
73    /// 删除一个 object
74    fn delete_object(
75        &self,
76        bucket_name: &str,
77        object_name: &str,
78    ) -> impl Future<Output = EngineResult<()>> + Send;
79}
80
81/// 此 trait 定义了 metadata 从何处来,所有的操作,都是幂等的
82pub trait MetaEngine: Sized {
83    type Uri: ?Sized;
84
85    fn new<T: AsRef<Self::Uri>>(base_dir: T) -> EngineResult<Self>;
86
87    // --- Bucket Operations ---
88
89    /// 创建一个新的 Bucket 元数据
90    fn create_bucket_meta(
91        &self,
92        meta: &BucketMeta,
93    ) -> impl Future<Output = EngineResult<()>> + Send;
94
95    /// 获取指定 Bucket 的元数据
96    fn read_bucket_meta(
97        &self,
98        bucket_name: &str,
99    ) -> impl Future<Output = EngineResult<BucketMeta>> + Send;
100
101    /// 删除一个 Bucket 元数据 (要求 Bucket 为空)
102    fn delete_bucket_meta(
103        &self,
104        bucket_name: &str,
105    ) -> impl Future<Output = EngineResult<()>> + Send;
106
107    /// 列出所有的 Bucket 的元数据
108    fn list_buckets_meta(&self) -> impl Future<Output = EngineResult<Vec<BucketMeta>>> + Send;
109
110    /// 更新一个 object 的 last_update 字段
111    fn touch_object(
112        &self,
113        bucket_name: &str,
114        object_name: &str,
115    ) -> impl Future<Output = EngineResult<()>> + Send;
116
117    // --- Object Operations ---
118
119    /// 存储(或更新)一个 Object 的元数据
120    fn create_object_meta(
121        &self,
122        meta: &ObjectMeta,
123    ) -> impl Future<Output = EngineResult<()>> + Send;
124
125    /// 获取指定 Object 的元数据
126    fn read_object_meta(
127        &self,
128        bucket_name: &str,
129        object_name: &str,
130    ) -> impl Future<Output = EngineResult<ObjectMeta>> + Send;
131
132    /// 删除一个 Object 的元数据
133    fn delete_object_meta(
134        &self,
135        bucket_name: &str,
136        object_name: &str,
137    ) -> impl Future<Output = EngineResult<()>> + Send;
138
139    /// 列出指定 Bucket 内的所有 Object 元数据
140    fn list_objects_meta(
141        &self,
142        bucket_name: &str,
143    ) -> impl Future<Output = EngineResult<Vec<ObjectMeta>>> + Send;
144
145    /// 更新一个 object 的 last_update 字段
146    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}