xt_oss/oss/entities/
multi_upload.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize,Clone, Deserialize, Debug, Default)]
4pub struct InitiateMultipartUploadResult {
5    #[serde(rename = "Bucket")]
6    pub bucket: String,
7    #[serde(rename = "Key")]
8    pub key: String,
9    #[serde(rename = "UploadId")]
10    pub upload_id: String,
11    #[serde(rename = "EncodingType", skip_serializing_if = "Option::is_none")]
12    pub encoding_type: Option<String>,
13}
14
15#[derive(Serialize, Clone, Deserialize, Debug, Default)]
16pub struct Part {
17    #[serde(rename = "PartNumber")]
18    pub part_number: u64,
19    #[serde(rename = "LastModified", skip_serializing_if = "Option::is_none")]
20    pub last_modified: Option<String>,
21    #[serde(rename = "ETag")]
22    pub etag: String,
23    #[serde(rename = "Size", skip_serializing_if = "Option::is_none")]
24    pub size: Option<u64>,
25}
26
27#[derive(Serialize, Clone, Deserialize, Debug, Default)]
28pub struct ListPartsResult {
29    #[serde(rename = "Bucket")]
30    pub bucket: String,
31    #[serde(rename = "Key")]
32    pub key: String,
33    #[serde(rename = "UploadId")]
34    pub upload_id: String,
35    #[serde(rename = "NextPartNumberMarker")]
36    pub next_part_number_marker: String,
37    #[serde(rename = "MaxParts")]
38    pub max_parts: u64,
39    #[serde(rename = "IsTruncated")]
40    pub is_truncated: bool,
41    #[serde(rename = "Part", skip_serializing_if = "Option::is_none")]
42    pub parts: Option<Vec<Part>>,
43}
44
45#[derive(Serialize, Clone, Deserialize, Debug, Default)]
46pub struct ListMultipartUploadsResult {
47    #[serde(rename = "Bucket")]
48    pub bucket: String,
49    #[serde(rename = "KeyMarker")]
50    pub key_marker: String,
51    #[serde(rename = "UploadIdMarker")]
52    pub upload_id_marker: String,
53    #[serde(rename = "NextKeyMarker")]
54    pub next_key_marker: String,
55    #[serde(rename = "NextUploadIdMarker")]
56    pub next_upload_id_marker: String,
57    #[serde(rename = "Delimiter")]
58    pub delimiter: String,
59    #[serde(rename = "Prefix")]
60    pub prefix: String,
61    #[serde(rename = "MaxUploads")]
62    pub max_uploads: String,
63    #[serde(rename = "IsTruncated")]
64    pub is_truncated: String,
65    #[serde(rename = "Upload")]
66    pub uploads: Option<Vec<Upload>>,
67}
68
69#[derive(Debug, Serialize,Clone, Deserialize, Default)]
70pub struct Upload {
71    #[serde(rename = "Key")]
72    pub key: String,
73    #[serde(rename = "UploadId")]
74    pub upload_id: String,
75    #[serde(rename = "Initiated")]
76    pub initiated: String,
77}
78
79#[derive(Serialize, Deserialize, Debug, Default, Clone)]
80pub struct CompleteMultipartUpload {
81    #[serde(rename = "Part")]
82    pub parts: Vec<Part>,
83}
84
85#[derive(Serialize, Deserialize, Debug, Default, Clone)]
86pub struct CopyPartResult {
87    #[serde(rename = "LastModified")]
88    pub last_modified: String,
89    #[serde(rename = "ETag")]
90    pub etag: String,
91}
92
93#[derive(Serialize, Deserialize, Debug, Default, Clone)]
94pub struct CompleteMultipartUploadResult {
95    #[serde(rename = "EncodingType", skip_serializing_if = "Option::is_none")]
96    pub encoding_type: Option<String>,
97    #[serde(rename = "Location")]
98    pub location: String,
99    #[serde(rename = "Bucket")]
100    pub bucket: String,
101    #[serde(rename = "Key")]
102    pub key: String,
103    #[serde(rename = "ETag")]
104    pub etag: String,
105}
106
107#[cfg(test)]
108mod tests {
109    use super::*;
110    #[test]
111    fn multipart_1() {
112        let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
113<CopyPartResult>
114  <LastModified>2019-04-09T07:01:56.000Z</LastModified>
115  <ETag>"25A9F4ABFCC05743DF6E2C886C56****"</ETag>
116</CopyPartResult>"#;
117        let obj: CopyPartResult = quick_xml::de::from_str(&xml_content).unwrap();
118        let left = "2019-04-09T07:01:56.000Z";
119        let right = obj.last_modified;
120        assert_eq!(left, right);
121    }
122
123    #[test]
124    fn multipart_2() {
125        let xml_content = r#"<CompleteMultipartUpload> 
126<Part>
127	<PartNumber>1</PartNumber>  
128	<ETag>"3349DC700140D7F86A0784842780****"</ETag> 
129</Part>  
130<Part> 
131<PartNumber>5</PartNumber>  
132	<ETag>"8EFDA8BE206636A695359836FE0A****"</ETag> 
133</Part>  
134<Part> 
135	<PartNumber>8</PartNumber>  
136	<ETag>"8C315065167132444177411FDA14****"</ETag> 
137</Part> 
138</CompleteMultipartUpload>
139"#;
140        let obj: CompleteMultipartUpload = quick_xml::de::from_str(&xml_content).unwrap();
141        let left = 1u64;
142        let right = obj.parts[0].part_number;
143        assert_eq!(left, right);
144    }
145
146    #[test]
147    fn multipart_3() {
148        let xml_content = r#"<CompleteMultipartUploadResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
149<EncodingType>url</EncodingType>
150  <Location>http://oss-example.oss-cn-hangzhou.aliyuncs.com /multipart.data</Location>
151  <Bucket>oss-example</Bucket>
152  <Key>multipart.data</Key>
153  <ETag>"B864DB6A936D376F9F8D3ED3BBE540****"</ETag>
154</CompleteMultipartUploadResult>"#;
155
156        let obj: CompleteMultipartUploadResult = quick_xml::de::from_str(&xml_content).unwrap();
157        let left = "multipart.data";
158        let right = &obj.key;
159        assert_eq!(left, right);
160    }
161
162    #[test]
163    fn multipart_4() {
164        let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
165<CompleteMultipartUploadResult>
166  <Location>http://oss-example.oss-cn-hangzhou.aliyuncs.com/multipart.data</Location>
167  <Bucket>oss-example</Bucket>
168  <Key>multipart.data</Key>
169  <ETag>"097DE458AD02B5F89F9D0530231876****"</ETag>
170</CompleteMultipartUploadResult>
171"#;
172
173        let obj: CompleteMultipartUploadResult = quick_xml::de::from_str(&xml_content).unwrap();
174        let left = "multipart.data";
175        let right = &obj.key;
176        assert_eq!(left, right);
177    }
178
179    #[test]
180    fn multipart_5() {
181        let xml_content = r#"<ListMultipartUploadsResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
182  <Bucket>oss-example</Bucket>
183  <KeyMarker></KeyMarker>
184  <UploadIdMarker></UploadIdMarker>
185  <NextKeyMarker>oss.avi</NextKeyMarker>
186  <NextUploadIdMarker>0004B99B8E707874FC2D692FA5D77D3F</NextUploadIdMarker>
187  <Delimiter></Delimiter>
188  <Prefix></Prefix>
189  <MaxUploads>1000</MaxUploads>
190  <IsTruncated>false</IsTruncated>
191  <Upload>
192    <Key>multipart.data</Key>
193    <UploadId>0004B999EF518A1FE585B0C9360DC4C8</UploadId>
194    <Initiated>2012-02-23T04:18:23.000Z</Initiated>
195  </Upload>
196  <Upload>
197    <Key>multipart.data</Key>
198    <UploadId>0004B999EF5A239BB9138C6227D6****</UploadId>
199    <Initiated>2012-02-23T04:18:23.000Z</Initiated>
200  </Upload>
201  <Upload>
202    <Key>oss.avi</Key>
203    <UploadId>0004B99B8E707874FC2D692FA5D7****</UploadId>
204    <Initiated>2012-02-23T06:14:27.000Z</Initiated>
205  </Upload>
206</ListMultipartUploadsResult>
207"#;
208
209        let obj: ListMultipartUploadsResult = quick_xml::de::from_str(&xml_content).unwrap();
210        let left = "multipart.data";
211        let right = &obj.uploads.unwrap()[0].key;
212        assert_eq!(left, right);
213    }
214
215    #[test]
216    fn multipart_6() {
217        let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
218<ListPartsResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
219  <Bucket>multipart_upload</Bucket>
220  <Key>multipart.data</Key>
221  <UploadId>0004B999EF5A239BB9138C6227D6****</UploadId>
222  <NextPartNumberMarker>5</NextPartNumberMarker>
223  <MaxParts>1000</MaxParts>
224  <IsTruncated>false</IsTruncated>
225  <Part>
226     <PartNumber>1</PartNumber>
227     <LastModified>2012-02-23T07:01:34.000Z</LastModified>
228     <ETag>"3349DC700140D7F86A0784842780****"</ETag>
229     <Size>6291456</Size>
230  </Part>
231  <Part>
232     <PartNumber>2</PartNumber>
233     <LastModified>2012-02-23T07:01:12.000Z</LastModified>
234     <ETag>"3349DC700140D7F86A0784842780****"</ETag>
235     <Size>6291456</Size>
236  </Part>
237  <Part>
238     <PartNumber>5</PartNumber>
239     <LastModified>2012-02-23T07:02:03.000Z</LastModified>
240     <ETag>"7265F4D211B56873A381D321F586****"</ETag>
241     <Size>1024</Size>
242  </Part>
243</ListPartsResult>
244"#;
245        let obj: ListPartsResult = quick_xml::de::from_str(&xml_content).unwrap();
246        let left = r#""3349DC700140D7F86A0784842780****""#;
247        let right = &obj.parts.unwrap()[0].etag;
248        assert_eq!(left, right);
249    }
250
251    #[test]
252    fn multipart_7() {
253        let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
254<InitiateMultipartUploadResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com">
255  <Bucket>oss-example</Bucket>
256  <Key>multipart.data</Key>
257  <UploadId>0004B9894A22E5B1888A1E29F823****</UploadId>
258</InitiateMultipartUploadResult>"#;
259        let obj: InitiateMultipartUploadResult = quick_xml::de::from_str(&xml_content).unwrap();
260        let left = "oss-example";
261        let right = obj.bucket;
262        assert_eq!(left, right);
263    }
264
265    #[test]
266    fn multipart_8() {
267        let xml_content = r#"<?xml version="1.0" encoding="UTF-8"?>
268<ListPartsResult>
269  <Bucket>xtoss-ex1</Bucket>
270  <Key>tmp/temp.jpg</Key>
271  <UploadId>149E85A3897241A2B8A5F5BBFADA5D88</UploadId>
272  <StorageClass>Standard</StorageClass>
273  <PartNumberMarker>0</PartNumberMarker>
274  <NextPartNumberMarker></NextPartNumberMarker>
275  <MaxParts>1000</MaxParts>
276  <IsTruncated>false</IsTruncated>
277</ListPartsResult>"#;
278        let obj: ListPartsResult = quick_xml::de::from_str(&xml_content).unwrap();
279        assert!(obj.parts.is_none());
280    }
281}