Skip to main content

bucketwarden_errors/
lib.rs

1use std::sync::OnceLock;
2
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub struct S3ServiceSpecificError {
5    pub feature_id: &'static str,
6    pub family: &'static str,
7    pub code: &'static str,
8    pub status: u16,
9    pub message: &'static str,
10}
11
12pub fn s3_service_specific_error_catalog() -> &'static [S3ServiceSpecificError] {
13    S3_SERVICE_SPECIFIC_ERRORS
14        .get_or_init(|| {
15            S3_SERVICE_SPECIFIC_ERROR_PARTS
16                .iter()
17                .flat_map(|part| part.iter().copied())
18                .collect()
19        })
20        .as_slice()
21}
22
23pub fn s3_service_specific_error_by_family_code(
24    family: &str,
25    code: &str,
26) -> Option<&'static S3ServiceSpecificError> {
27    s3_service_specific_error_catalog()
28        .iter()
29        .find(|error| error.family == family && error.code == code)
30}
31
32pub fn error_response_is_retryable(status: u16) -> bool {
33    matches!(status, 500 | 503)
34}
35
36static S3_SERVICE_SPECIFIC_ERRORS: OnceLock<Vec<S3ServiceSpecificError>> = OnceLock::new();
37
38const S3_SERVICE_SPECIFIC_ERROR_PARTS: &[&[S3ServiceSpecificError]] = &[
39    include!("s3_service_specific_errors/access-grants.rs"),
40    include!("s3_service_specific_errors/async.rs"),
41    include!("s3_service_specific_errors/fsx.rs"),
42    include!("s3_service_specific_errors/general-part-01.rs"),
43    include!("s3_service_specific_errors/general-part-02.rs"),
44    include!("s3_service_specific_errors/general-part-03.rs"),
45    include!("s3_service_specific_errors/select-part-01.rs"),
46    include!("s3_service_specific_errors/select-part-02.rs"),
47    include!("s3_service_specific_errors/select-part-03.rs"),
48    include!("s3_service_specific_errors/storage-lens-groups.rs"),
49    include!("s3_service_specific_errors/storage-lens.rs"),
50    include!("s3_service_specific_errors/tables.rs"),
51    include!("s3_service_specific_errors/object-lambda.rs"),
52    include!("s3_service_specific_errors/outposts.rs"),
53    include!("s3_service_specific_errors/replication.rs"),
54    include!("s3_service_specific_errors/tagging.rs"),
55];