1use serde::{Deserialize, Serialize};
2
3use crate::{declare_resource_type, declare_schema, meta::Meta, reference::Reference};
4
5declare_schema!(SchemaSchema = "urn:ietf:params:scim:schemas:core:2.0:Schema");
6declare_resource_type!(SchemaResourceType = "Schema");
7
8#[derive(Serialize, Deserialize, Debug, Clone)]
10#[serde(rename_all = "camelCase")]
11pub struct Schema {
12 #[serde(skip_deserializing)]
14 pub schemas: [SchemaSchema; 1],
15 pub id: String,
17 pub name: String,
19 pub description: String,
21 pub attributes: Vec<Attribute>,
23 #[serde(skip_deserializing)]
25 pub meta: Meta<SchemaResourceType>,
26}
27
28impl Schema {
29 pub fn locate(&mut self) {
31 self.meta.location = Some(Reference::new_relative(&format!("/Schemas/{}", self.id)));
32 }
33}
34
35#[derive(Serialize, Deserialize, Debug, Clone)]
37#[serde(rename_all = "camelCase")]
38pub struct Attribute {
39 pub name: String,
41 #[serde(rename = "type")]
43 pub type_: Type,
44 #[serde(default)]
46 pub multi_valued: bool,
47 #[serde(default)]
49 pub description: String,
50 #[serde(default)]
52 pub required: bool,
53 #[serde(default, skip_serializing_if = "Option::is_none")]
55 pub canonical_values: Option<Vec<String>>,
56 #[serde(default)]
58 pub case_exact: bool,
59 #[serde(default)]
61 pub mutability: Mutability,
62 #[serde(default)]
64 pub returned: Returned,
65 #[serde(default)]
67 pub uniqueness: Uniqueness,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
70 pub reference_types: Option<Vec<String>>,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub sub_attributes: Option<Vec<Attribute>>,
74}
75
76impl Attribute {
77 pub fn new(name: String, type_: Type) -> Self {
79 Self {
80 name,
81 type_,
82 multi_valued: false,
83 description: "".into(),
84 required: false,
85 canonical_values: None,
86 case_exact: false,
87 mutability: Mutability::ReadWrite,
88 returned: Returned::Default,
89 uniqueness: Uniqueness::None,
90 reference_types: None,
91 sub_attributes: None,
92 }
93 }
94 pub fn multi_valued(mut self) -> Self {
96 self.multi_valued = true;
97 self
98 }
99 pub fn required(mut self) -> Self {
101 self.required = true;
102 self
103 }
104 pub fn case_exact(mut self) -> Self {
106 self.case_exact = true;
107 self
108 }
109 pub fn sub_attributes(mut self, sub_attributes: Vec<Attribute>) -> Self {
111 self.sub_attributes = Some(sub_attributes);
112 self
113 }
114 pub fn immutable(mut self) -> Self {
116 self.mutability = Mutability::Immutable;
117 self
118 }
119 pub fn read_only(mut self) -> Self {
121 self.mutability = Mutability::ReadOnly;
122 self
123 }
124 pub fn write_only(mut self) -> Self {
126 self.mutability = Mutability::WriteOnly;
127 self
128 }
129 pub fn always_returned(mut self) -> Self {
131 self.returned = Returned::Always;
132 self
133 }
134 pub fn never_returned(mut self) -> Self {
136 self.returned = Returned::Never;
137 self
138 }
139 pub fn returned_on_request(mut self) -> Self {
141 self.returned = Returned::Request;
142 self
143 }
144 pub fn unique(mut self) -> Self {
146 self.uniqueness = Uniqueness::Server;
147 self
148 }
149 pub fn globally_unique(mut self) -> Self {
151 self.uniqueness = Uniqueness::Global;
152 self
153 }
154 pub fn reference_types(mut self, reference_types: Vec<String>) -> Self {
156 self.reference_types = Some(reference_types);
157 self
158 }
159}
160
161#[allow(unused)]
163#[derive(Serialize, Deserialize, Debug, Clone)]
164#[serde(rename_all = "camelCase")]
165pub enum Mutability {
166 ReadOnly,
168 ReadWrite,
170 Immutable,
172 WriteOnly,
174}
175
176impl Default for Mutability {
177 fn default() -> Self {
178 Self::ReadWrite
179 }
180}
181
182#[allow(unused)]
184#[derive(Serialize, Deserialize, Debug, Clone)]
185#[serde(rename_all = "camelCase")]
186pub enum Returned {
187 Always,
189 Never,
191 Default,
193 Request,
195}
196
197impl Default for Returned {
198 fn default() -> Self {
199 Self::Default
200 }
201}
202
203#[allow(unused)]
205#[derive(Serialize, Deserialize, Debug, Clone)]
206#[serde(rename_all = "camelCase")]
207pub enum Uniqueness {
208 None,
210 Server,
212 Global,
214}
215
216impl Default for Uniqueness {
217 fn default() -> Self {
218 Self::None
219 }
220}
221
222#[allow(unused)]
224#[derive(Serialize, Deserialize, Debug, Clone)]
225#[serde(rename_all = "camelCase")]
226pub enum Type {
227 String,
229 Boolean,
231 Decimal,
233 Integer,
235 DateTime,
237 Binary,
239 Reference,
241 Complex,
243}
244
245impl Default for Type {
246 fn default() -> Self {
247 Self::String
248 }
249}