xt_oss/oss/entities/
object.rs

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}