1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct OdrlDocument {
8 pub policies: Vec<OdrlPolicy>,
10}
11
12impl OdrlDocument {
13 pub fn from_yaml(yaml: &str) -> Result<Self, serde_yaml::Error> {
15 serde_yaml::from_str(yaml)
16 }
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct OdrlPolicy {
24 pub uid: String,
26 #[serde(rename = "type")]
28 pub policy_type: String,
29 pub rules: Vec<OdrlRule>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct OdrlRule {
36 #[serde(rename = "type")]
38 pub rule_type: OdrlRuleType,
39 #[serde(default)]
41 pub assigner: Option<String>,
42 pub assignee: String,
44 pub action: RuleAction,
46 pub target: String,
48 #[serde(default)]
50 pub constraints: Vec<OdrlConstraint>,
51}
52
53#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "lowercase")]
56pub enum OdrlRuleType {
57 Permission,
59 Prohibition,
61 Duty,
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69#[serde(rename_all = "lowercase")]
70pub enum RuleAction {
71 Read,
73 Write,
75 Delete,
77 Execute,
79 Delegate,
81 #[serde(rename = "read_sensitive")]
83 ReadSensitive,
84 #[serde(rename = "write_sensitive")]
86 WriteSensitive,
87 #[serde(rename = "ai:infer")]
89 AiInfer,
90 #[serde(rename = "ai:train")]
92 AiTrain,
93 #[serde(rename = "exfiltrate")]
95 Exfiltrate,
96 Use,
98}
99
100impl RuleAction {
101 pub fn as_permission_name(&self) -> &str {
103 match self {
104 RuleAction::Read => "read",
105 RuleAction::Write => "write",
106 RuleAction::Delete => "delete",
107 RuleAction::Execute => "execute",
108 RuleAction::Delegate => "delegate",
109 RuleAction::ReadSensitive => "read_sensitive",
110 RuleAction::WriteSensitive => "write_sensitive",
111 RuleAction::AiInfer => "ai:infer",
112 RuleAction::AiTrain => "ai:train",
113 RuleAction::Exfiltrate => "ai:exfiltrate",
114 RuleAction::Use => "*",
115 }
116 }
117
118 pub fn matches_action(&self, action: &str) -> bool {
120 self == &RuleAction::Use || self.as_permission_name() == action
121 }
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct OdrlConstraint {
127 #[serde(rename = "leftOperand")]
129 pub left_operand: String,
130 pub operator: ConstraintOperator,
132 #[serde(rename = "rightOperand")]
134 pub right_operand: String,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
139#[serde(rename_all = "camelCase")]
140pub enum ConstraintOperator {
141 Eq,
143 Neq,
145 Lt,
147 Lteq,
149 Gt,
151 Gteq,
153 #[serde(rename = "isPartOf")]
155 IsPartOf,
156}