1use std::collections::HashMap;
4
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8pub type Attributes = HashMap<String, Value>;
10
11#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
13pub struct Subject {
14 pub id: String,
16 pub roles: Vec<String>,
18 pub attributes: Attributes,
20}
21
22#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
24pub struct Resource {
25 pub resource_type: String,
27 pub id: String,
29 pub attributes: Attributes,
31}
32
33#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
35pub struct Request {
36 pub subject: Subject,
38 pub resource: Resource,
40 pub action: String,
42 pub context: Attributes,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
48pub struct Permission {
49 pub resource: String,
51 pub action: String,
53 #[serde(default)]
55 pub conditions: Vec<Condition>,
56}
57
58impl Permission {
59 #[must_use]
61 pub fn matches(&self, resource: &str, action: &str) -> bool {
62 crate::matcher::match_pattern(&self.resource, resource)
63 && crate::matcher::match_pattern(&self.action, action)
64 }
65}
66
67#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
69pub struct Role {
70 pub name: String,
72 pub inherits: Vec<String>,
74 pub permissions: Vec<Permission>,
76}
77
78#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
80#[serde(rename_all = "snake_case")]
81#[non_exhaustive]
82pub enum Effect {
83 Allow,
85 #[default]
87 Deny,
88}
89
90#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
92#[serde(rename_all = "snake_case")]
93#[non_exhaustive]
94pub enum AttributeSource {
95 #[default]
97 Subject,
98 Resource,
100 Context,
102}
103
104#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
106#[serde(rename_all = "snake_case")]
107#[non_exhaustive]
108pub enum Operator {
109 #[default]
111 Equals,
112 NotEquals,
114 OneOf,
116}
117
118#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
120pub struct Condition {
121 pub source: AttributeSource,
123 pub key: String,
125 pub operator: Operator,
127 pub values: Vec<Value>,
129 pub compare_source: Option<AttributeSource>,
131 pub compare_key: Option<String>,
133}
134
135#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
137pub struct Policy {
138 pub name: String,
140 pub effect: Effect,
142 pub actions: Vec<String>,
144 pub resources: Vec<String>,
146 pub conditions: Vec<Condition>,
148}
149
150#[derive(Debug, Clone, PartialEq, Eq)]
152pub struct Decision {
153 pub allowed: bool,
155 pub reason: String,
157}