use tracing::info;
use crate::model::OdrlRuleType;
#[derive(Debug)]
pub struct OdrlAuditEvent {
pub policy_uid: String,
pub matched_rule: Option<OdrlRuleType>,
pub subject: String,
pub action: String,
pub target: String,
pub verdict: OdrlVerdict,
pub constraint_results: Vec<ConstraintEval>,
}
#[derive(Debug, Clone)]
pub enum OdrlVerdict {
Permitted,
Prohibited {
reason: String,
},
NotApplicable,
ConstraintFailed {
constraint: String,
},
}
#[derive(Debug, Clone)]
pub struct ConstraintEval {
pub operand: String,
pub passed: bool,
}
impl OdrlAuditEvent {
pub fn log(&self) {
let verdict_str = match &self.verdict {
OdrlVerdict::Permitted => "permitted".to_owned(),
OdrlVerdict::Prohibited { reason } => format!("prohibited: {reason}"),
OdrlVerdict::NotApplicable => "not_applicable".to_owned(),
OdrlVerdict::ConstraintFailed { constraint } => {
format!("constraint_failed: {constraint}")
}
};
info!(
policy = %self.policy_uid,
subject = %self.subject,
action = %self.action,
target = %self.target,
verdict = %verdict_str,
"odrl policy decision"
);
}
}