use kiseki_common::ids::ChunkId;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum MultipartState {
InProgress,
Finalized,
Aborted,
}
#[derive(Clone, Debug)]
pub struct MultipartUpload {
pub upload_id: String,
pub state: MultipartState,
pub parts: Vec<MultipartPart>,
}
#[derive(Clone, Debug)]
pub struct MultipartPart {
pub part_number: u32,
pub chunk_id: ChunkId,
pub size: u64,
}
impl MultipartUpload {
#[must_use]
pub fn new(upload_id: String) -> Self {
Self {
upload_id,
state: MultipartState::InProgress,
parts: Vec::new(),
}
}
pub fn add_part(&mut self, part: MultipartPart) -> bool {
if self.state != MultipartState::InProgress {
return false;
}
self.parts.push(part);
true
}
pub fn finalize(&mut self) -> bool {
if self.state != MultipartState::InProgress {
return false;
}
self.state = MultipartState::Finalized;
true
}
pub fn abort(&mut self) -> bool {
if self.state != MultipartState::InProgress {
return false;
}
self.state = MultipartState::Aborted;
true
}
#[must_use]
pub fn total_size(&self) -> u64 {
self.parts.iter().map(|p| p.size).sum()
}
}