s3_wire/operation/multipart/
listing.rs1use http::HeaderMap;
2
3use super::{PartNumber, UploadId};
4use crate::operation::{Checksum, ChecksumType, ObjectKey, PageSize, RequestIds};
5
6#[derive(Clone, Default, derive_more::Debug, Eq, PartialEq)]
8pub struct ListMultipartUploadsRequest {
9 pub prefix: Option<String>,
11 pub delimiter: Option<String>,
13 pub key_marker: Option<String>,
15 pub upload_id_marker: Option<UploadId>,
17 pub max_uploads: PageSize,
19 #[debug("{:?}", "<redacted>")]
22 pub headers: HeaderMap,
23}
24
25impl ListMultipartUploadsRequest {
26 pub fn with_headers(mut self, headers: HeaderMap) -> Self {
28 self.headers = headers;
29 self
30 }
31}
32
33#[derive(Clone, Debug, Eq, PartialEq)]
35pub struct MultipartUploadEntry {
36 pub key: ObjectKey,
38 upload_id: UploadId,
40 pub initiated: Option<time::OffsetDateTime>,
42 pub storage_class: Option<String>,
44}
45
46impl MultipartUploadEntry {
47 pub(crate) fn new(
48 key: ObjectKey,
49 upload_id: UploadId,
50 initiated: Option<time::OffsetDateTime>,
51 storage_class: Option<String>,
52 ) -> Self {
53 Self {
54 key,
55 upload_id,
56 initiated,
57 storage_class,
58 }
59 }
60
61 pub const fn upload_id(&self) -> &UploadId {
63 &self.upload_id
64 }
65}
66
67#[derive(Clone, Debug, Default, Eq, PartialEq)]
69pub struct ListMultipartUploadsOutput {
70 pub uploads: Vec<MultipartUploadEntry>,
72 pub common_prefixes: Vec<String>,
74 pub is_truncated: bool,
76 pub next_key_marker: Option<String>,
78 pub next_upload_id_marker: Option<UploadId>,
80 pub request_ids: RequestIds,
82}
83
84#[derive(Clone, derive_more::Debug, Eq, PartialEq)]
86pub struct ListPartsRequest {
87 key: ObjectKey,
88 upload_id: UploadId,
89 pub part_number_marker: Option<PartNumber>,
91 pub max_parts: PageSize,
93 #[debug("{:?}", "<redacted>")]
96 pub headers: HeaderMap,
97}
98
99impl ListPartsRequest {
100 pub fn new(key: ObjectKey, upload_id: UploadId) -> Self {
102 Self {
103 key,
104 upload_id,
105 part_number_marker: None,
106 max_parts: PageSize::default(),
107 headers: HeaderMap::new(),
108 }
109 }
110
111 pub fn with_headers(mut self, headers: HeaderMap) -> Self {
113 self.headers = headers;
114 self
115 }
116
117 pub const fn key(&self) -> &ObjectKey {
119 &self.key
120 }
121
122 pub const fn upload_id(&self) -> &UploadId {
124 &self.upload_id
125 }
126}
127
128#[derive(Clone, Debug, Eq, PartialEq)]
130pub struct ListedPart {
131 part_number: PartNumber,
132 pub e_tag: String,
134 pub last_modified: Option<time::OffsetDateTime>,
136 pub size: u64,
138 pub checksum: Checksum,
140}
141
142impl ListedPart {
143 pub(crate) fn new(
144 part_number: PartNumber,
145 e_tag: String,
146 last_modified: Option<time::OffsetDateTime>,
147 size: u64,
148 checksum: Checksum,
149 ) -> Self {
150 Self {
151 part_number,
152 e_tag,
153 last_modified,
154 size,
155 checksum,
156 }
157 }
158
159 pub const fn part_number(&self) -> PartNumber {
161 self.part_number
162 }
163
164 pub fn completed_part(&self) -> Result<super::CompletedPart, super::MultipartError> {
166 super::CompletedPart::new(self.part_number.get(), self.e_tag.clone())
167 .map(|part| part.with_checksum(self.checksum.clone()))
168 }
169}
170
171#[derive(Clone, Debug, Default, Eq, PartialEq)]
173pub struct ListPartsOutput {
174 pub parts: Vec<ListedPart>,
176 pub is_truncated: bool,
178 pub next_part_number_marker: Option<PartNumber>,
180 pub checksum_algorithm: Option<String>,
182 pub checksum_type: Option<ChecksumType>,
184 pub request_ids: RequestIds,
186}