1use std::fmt;
2
3use serde::{Deserialize, Serialize};
4
5pub mod delete_multiple {
6 use serde::{Deserialize, Serialize};
7
8 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
9 pub struct Delete {
10 #[serde(rename = "Quiet")]
11 pub quiet: Option<bool>,
12 #[serde(rename = "Object")]
13 pub object: Vec<Object>,
14 }
15
16 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
17 pub struct Object {
18 #[serde(rename = "Key")]
19 pub key: String,
20 #[serde(rename = "VersionId", skip_serializing_if = "Option::is_none")]
21 pub version_id: Option<String>,
22 }
23
24 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
25 pub struct DeleteResult {
26 #[serde(rename = "Deleted")]
27 pub deleted: Vec<Deleted>,
28 #[serde(rename = "EncodingType")]
29 pub encoding_type: Option<String>,
30 }
31
32 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
33 pub struct Deleted {
34 #[serde(rename = "Key")]
35 pub key: String,
36 #[serde(rename = "VersionId")]
37 pub version_id: Option<String>,
38 #[serde(rename = "DeleteMarker")]
39 pub delete_marker: Option<String>,
40 #[serde(rename = "DeleteMarkerVersionId")]
41 pub delete_marker_version_id: Option<String>,
42 }
43}
44
45#[derive(Debug,Clone, Default, Serialize, Deserialize)]
46pub struct Object {
47 #[serde(rename = "Key")]
48 pub key: String,
49 #[serde(rename = "LastModified")]
50 pub last_modified: String,
51 #[serde(rename = "ETag")]
52 pub etag: String,
53 #[serde(rename = "Size")]
54 pub size: i32,
55 #[serde(rename = "StorageClass")]
56 pub storage_class: String,
57}
58
59#[derive(Debug, Serialize, Deserialize, Default, Clone)]
60pub enum Tier {
61 Expedited,
62 #[default]
63 Standard,
64 Bulk,
65}
66
67impl fmt::Display for Tier {
68 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
69 let value = match self {
70 Self::Expedited => "Expedited",
71 Self::Standard => "Standard",
72 Self::Bulk => "Bulk",
73 };
74 write!(f, "{}", value)
75 }
76}
77
78#[derive(Debug, Clone, Default, Serialize, Deserialize)]
79pub struct CopyObjectResult {
80 #[serde(rename = "etag")]
81 pub etag: Option<String>,
82 #[serde(rename = "LastModified")]
83 pub last_modified: String,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, Default)]
87pub struct JobParameters {
88 #[serde(rename = "Tier")]
89 pub tier: Tier,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, Default)]
93pub struct RestoreRequest {
94 #[serde(rename(deserialize = "Days"))]
95 pub days: u8,
96 #[serde(rename = "JobParameters", skip_serializing_if = "Option::is_none")]
97 pub job_parameters: Option<JobParameters>,
98}
99
100#[derive(Debug, Default, Clone, Serialize, Deserialize)]
101pub enum MetadataDirective {
102 #[default]
103 COPY,
104 REPLACE,
105}
106
107impl fmt::Display for MetadataDirective {
108 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 let value = match self {
110 Self::COPY => "COPY",
111 Self::REPLACE => "REPLACE",
112 };
113 write!(f, "{}", value)
114 }
115}
116
117#[derive(Debug, Clone,Serialize, Deserialize, Default)]
118pub enum TaggingDirective {
119 #[default]
120 COPY,
121 REPLACE,
122}
123
124impl fmt::Display for TaggingDirective {
125 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
126 let value = match self {
127 Self::COPY => "COPY",
128 Self::REPLACE => "REPLACE",
129 };
130 write!(f, "{}", value)
131 }
132}
133
134#[cfg(test)]
135pub mod tests {
136 use crate::oss::entities::object::RestoreRequest;
137
138 use super::{
139 delete_multiple::{Delete, DeleteResult},
140 JobParameters, Tier,
141 };
142
143 #[test]
144 fn restore_request_1() {
145 let xml_content = r#"<RestoreRequest>
146 <Days>2</Days>
147 <JobParameters>
148 <Tier>Standard</Tier>
149 </JobParameters>
150</RestoreRequest>"#;
151
152 let entry: RestoreRequest = quick_xml::de::from_str(&xml_content).unwrap();
153 let left = "Standard";
154 let right = entry.job_parameters.unwrap().tier.to_string();
155 assert_eq!(left, right);
156 }
157
158 #[test]
159 fn restore_request_2() {
160 let restore = RestoreRequest {
161 days: 7,
162 job_parameters: Some(JobParameters {
163 tier: Tier::Expedited,
164 }),
165 };
166 let left =
167 "<RestoreRequest><days>7</days><JobParameters><Tier>Expedited</Tier></JobParameters></RestoreRequest>";
168 let right = quick_xml::se::to_string(&restore).unwrap();
169 assert_eq!(left, right);
170 }
171
172 #[test]
173 fn restore_request_3() {
174 let restore = RestoreRequest {
175 days: 7,
176 job_parameters: None,
177 };
178 let left = "<RestoreRequest><days>7</days></RestoreRequest>";
179 let right = quick_xml::se::to_string(&restore).unwrap();
180 assert_eq!(left, right);
181 }
182
183 #[test]
184 fn deleted_1() {
185 let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
186<Delete>
187 <Quiet>false</Quiet>
188 <Object>
189 <Key>multipart.data</Key>
190 </Object>
191 <Object>
192 <Key>test.jpg</Key>
193 </Object>
194 <Object>
195 <Key>demo.jpg</Key>
196 </Object>
197</Delete>"#;
198 let obj: Delete = quick_xml::de::from_str(&xml_content).unwrap();
199 let left = &obj.object[0].key;
200 let right = "multipart.data";
201 assert_eq!(left, right);
202 }
203
204 #[test]
205 fn delete_result_1() {
206 let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
207<DeleteResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
208 <Deleted>
209 <Key>multipart.data</Key>
210 </Deleted>
211 <Deleted>
212 <Key>test.jpg</Key>
213 </Deleted>
214 <Deleted>
215 <Key>demo.jpg</Key>
216 </Deleted>
217</DeleteResult>"#;
218 let obj: DeleteResult = quick_xml::de::from_str(&xml_content).unwrap();
219 let left = "multipart.data";
220 let right = &obj.deleted[0].key;
221 assert_eq!(left, right);
222 }
223
224 #[test]
225 fn delete_result_2() {
226 let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
227<DeleteResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
228 <Deleted>
229 <Key>multipart.data</Key>
230 <VersionId>CAEQNRiBgIDyz.6C0BYiIGQ2NWEwNmVhNTA3ZTQ3MzM5ODliYjM1ZTdjYjA4****</VersionId>
231 </Deleted>
232</DeleteResult>"#;
233 let obj: DeleteResult = quick_xml::de::from_str(&xml_content).unwrap();
234 assert_eq!("multipart.data", obj.deleted[0].key);
235 }
236
237 #[test]
238 fn delete_result_3() {
239 let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
240<DeleteResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
241 <Deleted>
242 <Key>demo.jpg</Key>
243 <VersionId>CAEQNRiBgICEoPiC0BYiIGMxZWJmYmMzYjE0OTQ0ZmZhYjgzNzkzYjc2NjZk****</VersionId>
244 <DeleteMarker>true</DeleteMarker>
245 <DeleteMarkerVersionId>THUQNRiBgICEoPiC0BYiIGMxZWJmYmMzYjE0OTQ0ZmZhYjgzNzkzYjc2NjZk****</DeleteMarkerVersionId>
246 </Deleted>
247</DeleteResult>"#;
248
249 let obj: DeleteResult = quick_xml::de::from_str(&xml_content).unwrap();
250 assert_eq!("demo.jpg", obj.deleted[0].key);
251 }
252
253 #[test]
254 fn delete_result_4() {
255 let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
256<DeleteResult>
257 <Deleted>
258 <Key>multipart.data</Key>
259 <DeleteMarker>true</DeleteMarker>
260 <DeleteMarkerVersionId>CAEQMhiBgIDXiaaB0BYiIGQzYmRkZGUxMTM1ZDRjOTZhNjk4YjRjMTAyZjhl****</DeleteMarkerVersionId>
261 </Deleted>
262 <Deleted>
263 <Key>test.jpg</Key>
264 <DeleteMarker>true</DeleteMarker>
265 <DeleteMarkerVersionId>CAEQMhiBgIDB3aWB0BYiIGUzYTA3YzliMzVmNzRkZGM5NjllYTVlMjYyYWEy****</DeleteMarkerVersionId>
266 </Deleted>
267</DeleteResult>"#;
268
269 let obj: DeleteResult = quick_xml::de::from_str(&xml_content).unwrap();
270 assert_eq!("multipart.data", obj.deleted[0].key);
271 }
272}