solid_pod_rs/wac/
document.rs1use serde::{Deserialize, Serialize};
8
9use crate::wac::conditions::Condition;
10
11#[derive(Debug, Clone, Deserialize, Serialize)]
13pub struct AclDocument {
14 #[serde(rename = "@context", skip_serializing_if = "Option::is_none")]
16 pub context: Option<serde_json::Value>,
17
18 #[serde(rename = "@graph", skip_serializing_if = "Option::is_none")]
20 pub graph: Option<Vec<AclAuthorization>>,
21}
22
23#[derive(Debug, Clone, Deserialize, Serialize)]
25pub struct AclAuthorization {
26 #[serde(rename = "@id", skip_serializing_if = "Option::is_none")]
28 pub id: Option<String>,
29
30 #[serde(rename = "@type", skip_serializing_if = "Option::is_none")]
32 pub r#type: Option<String>,
33
34 #[serde(rename = "acl:agent", skip_serializing_if = "Option::is_none")]
36 pub agent: Option<IdOrIds>,
37
38 #[serde(rename = "acl:agentClass", skip_serializing_if = "Option::is_none")]
40 pub agent_class: Option<IdOrIds>,
41
42 #[serde(rename = "acl:agentGroup", skip_serializing_if = "Option::is_none")]
44 pub agent_group: Option<IdOrIds>,
45
46 #[serde(rename = "acl:origin", skip_serializing_if = "Option::is_none")]
48 pub origin: Option<IdOrIds>,
49
50 #[serde(rename = "acl:accessTo", skip_serializing_if = "Option::is_none")]
52 pub access_to: Option<IdOrIds>,
53
54 #[serde(rename = "acl:default", skip_serializing_if = "Option::is_none")]
56 pub default: Option<IdOrIds>,
57
58 #[serde(rename = "acl:mode", skip_serializing_if = "Option::is_none")]
60 pub mode: Option<IdOrIds>,
61
62 #[serde(
68 rename = "acl:condition",
69 default,
70 skip_serializing_if = "Option::is_none"
71 )]
72 pub condition: Option<Vec<Condition>>,
73}
74
75#[derive(Debug, Clone, Deserialize, Serialize)]
77#[serde(untagged)]
78pub enum IdOrIds {
79 Single(IdRef),
81 Multiple(Vec<IdRef>),
83}
84
85#[derive(Debug, Clone, Deserialize, Serialize)]
87pub struct IdRef {
88 #[serde(rename = "@id")]
90 pub id: String,
91}
92
93pub(crate) fn get_ids(val: &Option<IdOrIds>) -> Vec<&str> {
94 match val {
95 None => Vec::new(),
96 Some(IdOrIds::Single(r)) => vec![r.id.as_str()],
97 Some(IdOrIds::Multiple(refs)) => refs.iter().map(|r| r.id.as_str()).collect(),
98 }
99}
100
101pub(crate) fn ids_of(items: Vec<String>) -> IdOrIds {
102 if items.len() == 1 {
103 IdOrIds::Single(IdRef {
104 id: items.into_iter().next().unwrap(),
105 })
106 } else {
107 IdOrIds::Multiple(items.into_iter().map(|id| IdRef { id }).collect())
108 }
109}