use {
scratchstack_arn::ArnError,
std::{
error::Error,
fmt::{Debug, Display, Formatter, Result as FmtResult},
},
};
#[derive(Debug, Eq, PartialEq)]
pub enum PrincipalError {
CannotConvertToArn,
InvalidAccountId(String),
InvalidArn(String),
InvalidCanonicalUserId(String),
InvalidPartition(String),
InvalidFederatedUserName(String),
InvalidGroupName(String),
InvalidGroupId(String),
InvalidInstanceProfileName(String),
InvalidInstanceProfileId(String),
InvalidPath(String),
InvalidRegion(String),
InvalidResource(String),
InvalidRoleName(String),
InvalidRoleId(String),
InvalidScheme(String),
InvalidService(String),
InvalidSessionName(String),
InvalidUserName(String),
InvalidUserId(String),
}
impl Error for PrincipalError {}
impl Display for PrincipalError {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
Self::CannotConvertToArn => f.write_str("Cannot convert entity to ARN"),
Self::InvalidArn(arn) => write!(f, "Invalid ARN: {arn:#?}"),
Self::InvalidAccountId(account_id) => write!(f, "Invalid account id: {account_id:#?}"),
Self::InvalidCanonicalUserId(canonical_user_id) => {
write!(f, "Invalid canonical user id: {canonical_user_id:#?}")
}
Self::InvalidFederatedUserName(user_name) => {
write!(f, "Invalid federated user name: {user_name:#?}")
}
Self::InvalidGroupName(group_name) => {
write!(f, "Invalid group name: {group_name:#?}")
}
Self::InvalidGroupId(group_id) => write!(f, "Invalid group id: {group_id:#?}"),
Self::InvalidInstanceProfileName(instance_profile_name) => {
write!(f, "Invalid instance profile name: {instance_profile_name:#?}")
}
Self::InvalidInstanceProfileId(instance_profile_id) => {
write!(f, "Invalid instance profile id: {instance_profile_id:#?}")
}
Self::InvalidPartition(partition) => write!(f, "Invalid partition: {partition:#?}"),
Self::InvalidPath(path) => write!(f, "Invalid path: {path:#?}"),
Self::InvalidRegion(region) => write!(f, "Invalid region: {region:#?}"),
Self::InvalidResource(resource) => write!(f, "Invalid resource: {resource:#?}"),
Self::InvalidRoleName(role_name) => write!(f, "Invalid role name: {role_name:#?}"),
Self::InvalidRoleId(role_id) => write!(f, "Invalid role id: {role_id:#?}"),
Self::InvalidScheme(scheme) => write!(f, "Invalid scheme: {scheme:#?}"),
Self::InvalidService(service_name) => {
write!(f, "Invalid service name: {service_name:#?}")
}
Self::InvalidSessionName(session_name) => {
write!(f, "Invalid session name: {session_name:#?}")
}
Self::InvalidUserName(user_name) => write!(f, "Invalid user name: {user_name:#?}"),
Self::InvalidUserId(user_id) => write!(f, "Invalid user id: {user_id:#?}"),
}
}
}
impl From<ArnError> for PrincipalError {
fn from(err: ArnError) -> Self {
match err {
ArnError::InvalidScheme(scheme) => Self::InvalidScheme(scheme),
ArnError::InvalidPartition(partition) => Self::InvalidPartition(partition),
ArnError::InvalidService(service_name) => Self::InvalidService(service_name),
ArnError::InvalidRegion(region) => Self::InvalidRegion(region),
ArnError::InvalidAccountId(account_id) => Self::InvalidAccountId(account_id),
ArnError::InvalidResource(resource) => Self::InvalidResource(resource),
ArnError::InvalidArn(arn) => Self::InvalidArn(arn),
}
}
}
#[cfg(test)]
mod tests {
use {super::PrincipalError, scratchstack_arn::ArnError};
#[test]
fn exercise_unused_in_crate() {
let err = PrincipalError::InvalidGroupName("test+1".to_string());
assert_eq!(err.to_string(), r#"Invalid group name: "test+1""#);
let err = PrincipalError::InvalidInstanceProfileName("test+1".to_string());
assert_eq!(err.to_string(), r#"Invalid instance profile name: "test+1""#);
}
fn check_arn_err_into(arn_err: ArnError) {
let arn_err_string = arn_err.to_string();
let principal_err = PrincipalError::from(arn_err);
assert_eq!(principal_err.to_string(), arn_err_string);
let _ = format!("{principal_err:?}");
}
#[test]
fn test_from_arn_error() {
check_arn_err_into(ArnError::InvalidAccountId("abcd".to_string()));
check_arn_err_into(ArnError::InvalidArn("arn:foo:bar".to_string()));
check_arn_err_into(ArnError::InvalidPartition("-foo".to_string()));
check_arn_err_into(ArnError::InvalidRegion("foo-".to_string()));
check_arn_err_into(ArnError::InvalidResource("".to_string()));
check_arn_err_into(ArnError::InvalidScheme("https".to_string()));
check_arn_err_into(ArnError::InvalidService("foo".to_string()));
}
}