post3 0.1.0

Pluggable S3-compatible object storage — core library with PostgreSQL and filesystem backends
Documentation
#[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),
}