#[derive(Debug, thiserror::Error)]
pub enum Post3Error {
#[error("bucket not found: {0}")]
BucketNotFound(String),
#[error("bucket already exists: {0}")]
BucketAlreadyExists(String),
#[error("object not found: bucket={bucket}, key={key}")]
ObjectNotFound { bucket: String, key: String },
#[error("bucket not empty: {0}")]
BucketNotEmpty(String),
#[error("multipart upload not found: {0}")]
UploadNotFound(String),
#[error("invalid part: upload_id={upload_id}, part_number={part_number}")]
InvalidPart { upload_id: String, part_number: i32 },
#[error("etag mismatch for part {part_number}: expected={expected}, got={got}")]
ETagMismatch {
part_number: i32,
expected: String,
got: String,
},
#[error("invalid part order in complete request")]
InvalidPartOrder,
#[error("part {part_number} is too small: size={size}, minimum=5242880")]
EntityTooSmall { part_number: i32, size: i64 },
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("serialization error: {0}")]
Serialization(String),
#[error(transparent)]
Database(#[from] sqlx::Error),
#[error(transparent)]
Other(#[from] anyhow::Error),
}