objectstore_service/multipart.rs
1//! Shared types for Objectstore's multipart upload protocol.
2
3use std::time::SystemTime;
4
5pub use objectstore_types::multipart::{ETag, InvalidUploadId, PartNumber, UploadId};
6
7/// Description of one part in the response to
8/// [`MultipartUploadBackend::list_parts`](crate::backend::common::MultipartUploadBackend::list_parts).
9#[derive(Clone, Debug)]
10pub struct Part {
11 /// 1-indexed position of this part within the upload.
12 pub part_number: PartNumber,
13 /// Identifier returned when the part was uploaded.
14 pub etag: ETag,
15 /// Server-recorded time at which the part was uploaded.
16 pub last_modified: SystemTime,
17 /// Size of the part in bytes.
18 pub size: u64,
19}
20
21/// Pair of (part number, ETag) that the client provides on
22/// [`MultipartUploadBackend::complete_multipart`](crate::backend::common::MultipartUploadBackend::complete_multipart)
23/// to identify the parts in order.
24#[derive(Clone, Debug)]
25pub struct CompletedPart {
26 /// 1-indexed position of this part within the upload.
27 pub part_number: PartNumber,
28 /// Identifier returned when the part was uploaded.
29 pub etag: ETag,
30}
31
32/// Error optionally returned by
33/// [`MultipartUploadBackend::complete_multipart`](crate::backend::common::MultipartUploadBackend::complete_multipart).
34#[derive(Clone, Debug)]
35pub struct CompleteMultipartError {
36 /// Error code or identifier.
37 pub code: String,
38 /// Human-readable error description.
39 pub message: String,
40}
41
42/// Response for
43/// [`MultipartUploadBackend::initiate_multipart`](crate::backend::common::MultipartUploadBackend::initiate_multipart).
44pub type InitiateMultipartResponse = UploadId;
45
46/// Response for
47/// [`MultipartUploadBackend::upload_part`](crate::backend::common::MultipartUploadBackend::upload_part).
48pub type UploadPartResponse = ETag;
49
50/// Response for
51/// [`MultipartUploadBackend::list_parts`](crate::backend::common::MultipartUploadBackend::list_parts).
52#[derive(Clone, Debug)]
53pub struct ListPartsResponse {
54 /// Parts uploaded so far, in `part_number` order.
55 pub parts: Vec<Part>,
56 /// Set when the listing was truncated and more parts can be fetched
57 /// using [`Self::next_part_number_marker`] as the next
58 /// `part_number_marker`.
59 pub is_truncated: bool,
60 /// Marker to pass as the next `part_number_marker` when
61 /// [`Self::is_truncated`] is `true`.
62 pub next_part_number_marker: Option<PartNumber>,
63}
64
65/// Response for
66/// [`MultipartUploadBackend::abort_multipart`](crate::backend::common::MultipartUploadBackend::abort_multipart).
67pub type AbortMultipartResponse = ();
68
69/// Response for
70/// [`MultipartUploadBackend::complete_multipart`](crate::backend::common::MultipartUploadBackend::complete_multipart).
71pub type CompleteMultipartResponse = Option<CompleteMultipartError>;