use std::fmt::{Display, Formatter};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum AccountRetirementRefusal {
ConfigurationReferencesAccount,
NonZeroState,
OperationInProgress,
EvaluationFailed,
}
impl Display for AccountRetirementRefusal {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::ConfigurationReferencesAccount => {
formatter.write_str("policy configuration references the account")
}
Self::NonZeroState => formatter.write_str("policy holds non-zero account state"),
Self::OperationInProgress => {
formatter.write_str("policy has an account operation in progress")
}
Self::EvaluationFailed => {
formatter.write_str("policy could not evaluate account retirement")
}
}
}
}
impl std::error::Error for AccountRetirementRefusal {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AccountRetirementPolicyRefusal {
pub policy: String,
pub refusal: AccountRetirementRefusal,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum AccountRetirementError {
Refused {
refusals: Vec<AccountRetirementPolicyRefusal>,
},
FinalizerFailed,
}
impl Display for AccountRetirementError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Refused { .. } => {
formatter.write_str("account retirement refused by one or more policies")
}
Self::FinalizerFailed => formatter.write_str("account retirement finalizer failed"),
}
}
}
impl std::error::Error for AccountRetirementError {}
#[cfg(test)]
mod tests {
use super::{AccountRetirementError, AccountRetirementRefusal};
#[test]
fn retire_refusal_display_is_stable_and_omits_account_id() {
let cases = [
(
AccountRetirementRefusal::ConfigurationReferencesAccount,
"policy configuration references the account",
),
(
AccountRetirementRefusal::NonZeroState,
"policy holds non-zero account state",
),
(
AccountRetirementRefusal::OperationInProgress,
"policy has an account operation in progress",
),
(
AccountRetirementRefusal::EvaluationFailed,
"policy could not evaluate account retirement",
),
];
for (refusal, expected) in cases {
let display = refusal.to_string();
assert_eq!(display, expected);
assert!(!display.contains("99224416"));
}
}
#[test]
fn retire_error_display_is_stable_and_omits_account_id() {
let errors = [
(
AccountRetirementError::Refused { refusals: vec![] },
"account retirement refused by one or more policies",
),
(
AccountRetirementError::FinalizerFailed,
"account retirement finalizer failed",
),
];
for (error, expected) in errors {
let display = error.to_string();
assert_eq!(display, expected);
assert!(!display.contains("99224416"));
}
}
}