scratchstack_aspen/
error.rs

1use std::{
2    error::Error,
3    fmt::{Display, Formatter, Result as FmtResult},
4};
5
6/// The error type used to convey Aspen errors.
7#[derive(Debug, Eq, PartialEq)]
8pub enum AspenError {
9    /// An invalid action was specified in a policy. The string is the invalid action.
10    InvalidAction(String),
11
12    /// An invalid condition operator was specified in a condition clause. The string contains the invalid operator.
13    InvalidConditionOperator(String),
14
15    /// An invalid policy version was specified in a policy. The string contains the invalid version.
16    InvalidPolicyVersion(String),
17
18    /// An invalid principal was specified ina policy. The string contains the invalid principal.
19    InvalidPrincipal(String),
20
21    /// An invalid resource was specified in a policy. The string contains the invalid resource.
22    InvalidResource(String),
23
24    /// An invalid variable substitution was specified in a policy. The string contains the invalid variable.
25    InvalidSubstitution(String),
26}
27
28impl Display for AspenError {
29    fn fmt(&self, f: &mut Formatter) -> FmtResult {
30        match self {
31            Self::InvalidAction(action) => write!(f, "Invalid action: {action}"),
32            Self::InvalidConditionOperator(operator) => write!(f, "Invalid condition operator: {operator}"),
33            Self::InvalidPolicyVersion(version) => write!(f, "Invalid policy version: {version}"),
34            Self::InvalidPrincipal(principal) => write!(f, "Invalid principal: {principal}"),
35            Self::InvalidResource(resource) => write!(f, "Invalid resource: {resource}"),
36            Self::InvalidSubstitution(element) => write!(f, "Invalid variable substitution: {element}"),
37        }
38    }
39}
40
41impl Error for AspenError {}
42
43#[cfg(test)]
44mod tests {
45    use {
46        crate::AspenError,
47        pretty_assertions::{assert_eq, assert_ne},
48    };
49
50    #[test_log::test]
51    fn test_display() {
52        let _ = format!("{:?}", AspenError::InvalidAction("foo".to_string()));
53        assert_eq!(AspenError::InvalidAction("foo".to_string()).to_string(), "Invalid action: foo");
54
55        let _ = format!("{:?}", AspenError::InvalidPrincipal("foo".to_string()));
56        assert_eq!(AspenError::InvalidPrincipal("foo".to_string()).to_string(), "Invalid principal: foo");
57
58        let _ = format!("{:?}", AspenError::InvalidResource("foo".to_string()));
59        assert_eq!(AspenError::InvalidResource("foo".to_string()).to_string(), "Invalid resource: foo");
60    }
61
62    #[test_log::test]
63    fn test_eq() {
64        let e1a = AspenError::InvalidAction("foo".to_string());
65        let e1b = AspenError::InvalidAction("foo".to_string());
66        let e2a = AspenError::InvalidPrincipal("foo".to_string());
67        let e2b = AspenError::InvalidPrincipal("foo".to_string());
68        let e3a = AspenError::InvalidResource("foo".to_string());
69        let e3b = AspenError::InvalidResource("foo".to_string());
70        let e4 = AspenError::InvalidAction("bar".to_string());
71        let e5 = AspenError::InvalidPrincipal("bar".to_string());
72        let e6 = AspenError::InvalidResource("bar".to_string());
73
74        assert_eq!(e1a, e1b);
75        assert_eq!(e2a, e2b);
76        assert_eq!(e3a, e3b);
77        assert_ne!(e1a, e2a);
78        assert_ne!(e1a, e3a);
79        assert_ne!(e1a, e4);
80        assert_ne!(e1a, e5);
81        assert_ne!(e1a, e6);
82        assert_ne!(e2a, e3a);
83        assert_ne!(e2a, e4);
84        assert_ne!(e2a, e5);
85        assert_ne!(e2a, e6);
86        assert_ne!(e3a, e4);
87        assert_ne!(e3a, e5);
88        assert_ne!(e3a, e6);
89    }
90}