Skip to main content

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>;