use super::context::Context;
use crate::{Arn, Principal};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct IAMRequest {
#[serde(rename = "Principal")]
pub principal: Principal,
#[serde(rename = "Action")]
pub action: String,
#[serde(rename = "Resource")]
pub resource: Arn,
#[serde(rename = "Context", default)]
pub context: Context,
}
impl IAMRequest {
#[must_use]
pub fn new<S: Into<String>>(principal: Principal, action: S, resource: Arn) -> Self {
let action = action.into();
Self {
principal,
action,
resource,
context: Context::new(),
}
}
#[must_use]
pub fn new_with_context<S: Into<String>>(
principal: Principal,
action: S,
resource: Arn,
context: Context,
) -> Self {
let action = action.into();
Self {
principal,
action,
resource,
context,
}
}
}
#[cfg(test)]
mod tests {
use crate::PrincipalId;
use super::*;
#[test]
fn test_parc_request_creation() {
let request = IAMRequest::new(
Principal::Aws(PrincipalId::String("AROA123456789EXAMPLE".into())),
"iam:DeactivateMFADevice",
Arn::parse("arn:aws:iam:::user/martha").unwrap(),
);
assert_eq!(
request.principal,
Principal::Aws(PrincipalId::String("AROA123456789EXAMPLE".into()))
);
assert_eq!(request.action, "iam:DeactivateMFADevice");
assert_eq!(
request.resource,
Arn::parse("arn:aws:iam:::user/martha").unwrap()
);
}
#[test]
#[allow(clippy::float_cmp)]
fn test_parc_request_with_context() {
let context = Context::new()
.with_string("aws:UserId", "AIDA123456789EXAMPLE:BobsSession")
.with_boolean("aws:MultiFactorAuthPresent", true)
.with_number("aws:EpochTime", 1_633_072_800.0);
let request = IAMRequest::new_with_context(
Principal::Aws(PrincipalId::String("principal".into())),
"action",
Arn::parse("arn:aws:iam:::user/martha").unwrap(),
context,
);
assert_eq!(
request
.context
.get("aws:UserId")
.unwrap()
.as_string()
.unwrap(),
"AIDA123456789EXAMPLE:BobsSession"
);
assert!(
request
.context
.get("aws:MultiFactorAuthPresent")
.unwrap()
.as_boolean()
.unwrap()
);
assert_eq!(
request
.context
.get("aws:EpochTime")
.unwrap()
.as_number()
.unwrap(),
1_633_072_800.0
);
}
}