bucketwarden-errors 0.1.0

BucketWarden S3 error catalogs and retry classification.
Documentation
use std::sync::OnceLock;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct S3ServiceSpecificError {
    pub feature_id: &'static str,
    pub family: &'static str,
    pub code: &'static str,
    pub status: u16,
    pub message: &'static str,
}

pub fn s3_service_specific_error_catalog() -> &'static [S3ServiceSpecificError] {
    S3_SERVICE_SPECIFIC_ERRORS
        .get_or_init(|| {
            S3_SERVICE_SPECIFIC_ERROR_PARTS
                .iter()
                .flat_map(|part| part.iter().copied())
                .collect()
        })
        .as_slice()
}

pub fn s3_service_specific_error_by_family_code(
    family: &str,
    code: &str,
) -> Option<&'static S3ServiceSpecificError> {
    s3_service_specific_error_catalog()
        .iter()
        .find(|error| error.family == family && error.code == code)
}

pub fn error_response_is_retryable(status: u16) -> bool {
    matches!(status, 500 | 503)
}

static S3_SERVICE_SPECIFIC_ERRORS: OnceLock<Vec<S3ServiceSpecificError>> = OnceLock::new();

const S3_SERVICE_SPECIFIC_ERROR_PARTS: &[&[S3ServiceSpecificError]] = &[
    include!("s3_service_specific_errors/access-grants.rs"),
    include!("s3_service_specific_errors/async.rs"),
    include!("s3_service_specific_errors/fsx.rs"),
    include!("s3_service_specific_errors/general-part-01.rs"),
    include!("s3_service_specific_errors/general-part-02.rs"),
    include!("s3_service_specific_errors/general-part-03.rs"),
    include!("s3_service_specific_errors/select-part-01.rs"),
    include!("s3_service_specific_errors/select-part-02.rs"),
    include!("s3_service_specific_errors/select-part-03.rs"),
    include!("s3_service_specific_errors/storage-lens-groups.rs"),
    include!("s3_service_specific_errors/storage-lens.rs"),
    include!("s3_service_specific_errors/tables.rs"),
    include!("s3_service_specific_errors/object-lambda.rs"),
    include!("s3_service_specific_errors/outposts.rs"),
    include!("s3_service_specific_errors/replication.rs"),
    include!("s3_service_specific_errors/tagging.rs"),
];