#[derive(Clone, Debug, PartialEq, Eq)]
pub enum AuditActor {
User(String),
System,
Job(String),
ApiClient(String),
Anonymous,
}
impl AuditActor {
pub fn kind(&self) -> &'static str {
match self {
Self::User(_) => "user",
Self::System => "system",
Self::Job(_) => "job",
Self::ApiClient(_) => "api_client",
Self::Anonymous => "anonymous",
}
}
pub fn id(&self) -> Option<&str> {
match self {
Self::User(id) | Self::Job(id) | Self::ApiClient(id) => Some(id.as_str()),
Self::System | Self::Anonymous => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn user_kind_and_id() {
let a = AuditActor::User("u_42".into());
assert_eq!(a.kind(), "user");
assert_eq!(a.id(), Some("u_42"));
}
#[test]
fn system_kind_and_id() {
let a = AuditActor::System;
assert_eq!(a.kind(), "system");
assert_eq!(a.id(), None);
}
#[test]
fn job_kind_and_id() {
let a = AuditActor::Job("stripe.webhook.subscription_updated".into());
assert_eq!(a.kind(), "job");
assert_eq!(a.id(), Some("stripe.webhook.subscription_updated"));
}
#[test]
fn api_client_kind_and_id() {
let a = AuditActor::ApiClient("oauth_client_xyz".into());
assert_eq!(a.kind(), "api_client");
assert_eq!(a.id(), Some("oauth_client_xyz"));
}
#[test]
fn anonymous_kind_and_id() {
let a = AuditActor::Anonymous;
assert_eq!(a.kind(), "anonymous");
assert_eq!(a.id(), None);
}
}