xt_oss/oss/entities/
multi_upload.rs1use 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}