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 let mut iter = items.into_iter();
103 let first = iter.next();
104 let second = iter.next();
105 match (first, second) {
106 (Some(id), None) => IdOrIds::Single(IdRef { id }),
108 (Some(first), Some(second)) => IdOrIds::Multiple(
110 std::iter::once(first)
111 .chain(std::iter::once(second))
112 .chain(iter)
113 .map(|id| IdRef { id })
114 .collect(),
115 ),
116 _ => IdOrIds::Multiple(Vec::new()),
119 }
120}