use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OdrlDocument {
pub policies: Vec<OdrlPolicy>,
}
impl OdrlDocument {
pub fn from_yaml(yaml: &str) -> Result<Self, serde_yaml::Error> {
serde_yaml::from_str(yaml)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OdrlPolicy {
pub uid: String,
#[serde(rename = "type")]
pub policy_type: String,
pub rules: Vec<OdrlRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OdrlRule {
#[serde(rename = "type")]
pub rule_type: OdrlRuleType,
#[serde(default)]
pub assigner: Option<String>,
pub assignee: String,
pub action: RuleAction,
pub target: String,
#[serde(default)]
pub constraints: Vec<OdrlConstraint>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum OdrlRuleType {
Permission,
Prohibition,
Duty,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RuleAction {
Read,
Write,
Delete,
Execute,
Delegate,
#[serde(rename = "read_sensitive")]
ReadSensitive,
#[serde(rename = "write_sensitive")]
WriteSensitive,
#[serde(rename = "ai:infer")]
AiInfer,
#[serde(rename = "ai:train")]
AiTrain,
#[serde(rename = "exfiltrate")]
Exfiltrate,
Use,
}
impl RuleAction {
pub fn as_permission_name(&self) -> &str {
match self {
RuleAction::Read => "read",
RuleAction::Write => "write",
RuleAction::Delete => "delete",
RuleAction::Execute => "execute",
RuleAction::Delegate => "delegate",
RuleAction::ReadSensitive => "read_sensitive",
RuleAction::WriteSensitive => "write_sensitive",
RuleAction::AiInfer => "ai:infer",
RuleAction::AiTrain => "ai:train",
RuleAction::Exfiltrate => "ai:exfiltrate",
RuleAction::Use => "*",
}
}
pub fn matches_action(&self, action: &str) -> bool {
self == &RuleAction::Use || self.as_permission_name() == action
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OdrlConstraint {
#[serde(rename = "leftOperand")]
pub left_operand: String,
pub operator: ConstraintOperator,
#[serde(rename = "rightOperand")]
pub right_operand: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ConstraintOperator {
Eq,
Neq,
Lt,
Lteq,
Gt,
Gteq,
#[serde(rename = "isPartOf")]
IsPartOf,
}