bucketwarden_errors/
lib.rs1use 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];