1#[derive(Clone, Debug, Default, PartialEq)]
5pub struct ResourceAttributes {
6 pub field_selector: Option<crate::api::authorization::v1::FieldSelectorAttributes>,
10
11 pub group: Option<String>,
13
14 pub label_selector: Option<crate::api::authorization::v1::LabelSelectorAttributes>,
18
19 pub name: Option<String>,
21
22 pub namespace: Option<String>,
24
25 pub resource: Option<String>,
27
28 pub subresource: Option<String>,
30
31 pub verb: Option<String>,
33
34 pub version: Option<String>,
36}
37
38impl crate::DeepMerge for ResourceAttributes {
39 fn merge_from(&mut self, other: Self) {
40 crate::DeepMerge::merge_from(&mut self.field_selector, other.field_selector);
41 crate::DeepMerge::merge_from(&mut self.group, other.group);
42 crate::DeepMerge::merge_from(&mut self.label_selector, other.label_selector);
43 crate::DeepMerge::merge_from(&mut self.name, other.name);
44 crate::DeepMerge::merge_from(&mut self.namespace, other.namespace);
45 crate::DeepMerge::merge_from(&mut self.resource, other.resource);
46 crate::DeepMerge::merge_from(&mut self.subresource, other.subresource);
47 crate::DeepMerge::merge_from(&mut self.verb, other.verb);
48 crate::DeepMerge::merge_from(&mut self.version, other.version);
49 }
50}
51
52impl<'de> crate::serde::Deserialize<'de> for ResourceAttributes {
53 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
54 #[allow(non_camel_case_types)]
55 enum Field {
56 Key_field_selector,
57 Key_group,
58 Key_label_selector,
59 Key_name,
60 Key_namespace,
61 Key_resource,
62 Key_subresource,
63 Key_verb,
64 Key_version,
65 Other,
66 }
67
68 impl<'de> crate::serde::Deserialize<'de> for Field {
69 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
70 struct Visitor;
71
72 impl crate::serde::de::Visitor<'_> for Visitor {
73 type Value = Field;
74
75 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76 f.write_str("field identifier")
77 }
78
79 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
80 Ok(match v {
81 "fieldSelector" => Field::Key_field_selector,
82 "group" => Field::Key_group,
83 "labelSelector" => Field::Key_label_selector,
84 "name" => Field::Key_name,
85 "namespace" => Field::Key_namespace,
86 "resource" => Field::Key_resource,
87 "subresource" => Field::Key_subresource,
88 "verb" => Field::Key_verb,
89 "version" => Field::Key_version,
90 _ => Field::Other,
91 })
92 }
93 }
94
95 deserializer.deserialize_identifier(Visitor)
96 }
97 }
98
99 struct Visitor;
100
101 impl<'de> crate::serde::de::Visitor<'de> for Visitor {
102 type Value = ResourceAttributes;
103
104 fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105 f.write_str("ResourceAttributes")
106 }
107
108 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
109 let mut value_field_selector: Option<crate::api::authorization::v1::FieldSelectorAttributes> = None;
110 let mut value_group: Option<String> = None;
111 let mut value_label_selector: Option<crate::api::authorization::v1::LabelSelectorAttributes> = None;
112 let mut value_name: Option<String> = None;
113 let mut value_namespace: Option<String> = None;
114 let mut value_resource: Option<String> = None;
115 let mut value_subresource: Option<String> = None;
116 let mut value_verb: Option<String> = None;
117 let mut value_version: Option<String> = None;
118
119 while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
120 match key {
121 Field::Key_field_selector => value_field_selector = crate::serde::de::MapAccess::next_value(&mut map)?,
122 Field::Key_group => value_group = crate::serde::de::MapAccess::next_value(&mut map)?,
123 Field::Key_label_selector => value_label_selector = crate::serde::de::MapAccess::next_value(&mut map)?,
124 Field::Key_name => value_name = crate::serde::de::MapAccess::next_value(&mut map)?,
125 Field::Key_namespace => value_namespace = crate::serde::de::MapAccess::next_value(&mut map)?,
126 Field::Key_resource => value_resource = crate::serde::de::MapAccess::next_value(&mut map)?,
127 Field::Key_subresource => value_subresource = crate::serde::de::MapAccess::next_value(&mut map)?,
128 Field::Key_verb => value_verb = crate::serde::de::MapAccess::next_value(&mut map)?,
129 Field::Key_version => value_version = crate::serde::de::MapAccess::next_value(&mut map)?,
130 Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
131 }
132 }
133
134 Ok(ResourceAttributes {
135 field_selector: value_field_selector,
136 group: value_group,
137 label_selector: value_label_selector,
138 name: value_name,
139 namespace: value_namespace,
140 resource: value_resource,
141 subresource: value_subresource,
142 verb: value_verb,
143 version: value_version,
144 })
145 }
146 }
147
148 deserializer.deserialize_struct(
149 "ResourceAttributes",
150 &[
151 "fieldSelector",
152 "group",
153 "labelSelector",
154 "name",
155 "namespace",
156 "resource",
157 "subresource",
158 "verb",
159 "version",
160 ],
161 Visitor,
162 )
163 }
164}
165
166impl crate::serde::Serialize for ResourceAttributes {
167 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
168 let mut state = serializer.serialize_struct(
169 "ResourceAttributes",
170 self.field_selector.as_ref().map_or(0, |_| 1) +
171 self.group.as_ref().map_or(0, |_| 1) +
172 self.label_selector.as_ref().map_or(0, |_| 1) +
173 self.name.as_ref().map_or(0, |_| 1) +
174 self.namespace.as_ref().map_or(0, |_| 1) +
175 self.resource.as_ref().map_or(0, |_| 1) +
176 self.subresource.as_ref().map_or(0, |_| 1) +
177 self.verb.as_ref().map_or(0, |_| 1) +
178 self.version.as_ref().map_or(0, |_| 1),
179 )?;
180 if let Some(value) = &self.field_selector {
181 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "fieldSelector", value)?;
182 }
183 if let Some(value) = &self.group {
184 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "group", value)?;
185 }
186 if let Some(value) = &self.label_selector {
187 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "labelSelector", value)?;
188 }
189 if let Some(value) = &self.name {
190 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "name", value)?;
191 }
192 if let Some(value) = &self.namespace {
193 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "namespace", value)?;
194 }
195 if let Some(value) = &self.resource {
196 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "resource", value)?;
197 }
198 if let Some(value) = &self.subresource {
199 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "subresource", value)?;
200 }
201 if let Some(value) = &self.verb {
202 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "verb", value)?;
203 }
204 if let Some(value) = &self.version {
205 crate::serde::ser::SerializeStruct::serialize_field(&mut state, "version", value)?;
206 }
207 crate::serde::ser::SerializeStruct::end(state)
208 }
209}
210
211#[cfg(feature = "schemars")]
212impl crate::schemars::JsonSchema for ResourceAttributes {
213 fn schema_name() -> String {
214 "io.k8s.api.authorization.v1.ResourceAttributes".to_owned()
215 }
216
217 fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
218 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
219 metadata: Some(Box::new(crate::schemars::schema::Metadata {
220 description: Some("ResourceAttributes includes the authorization attributes available for resource requests to the Authorizer interface".to_owned()),
221 ..Default::default()
222 })),
223 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
224 object: Some(Box::new(crate::schemars::schema::ObjectValidation {
225 properties: [
226 (
227 "fieldSelector".to_owned(),
228 {
229 let mut schema_obj = __gen.subschema_for::<crate::api::authorization::v1::FieldSelectorAttributes>().into_object();
230 schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
231 description: Some("fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).".to_owned()),
232 ..Default::default()
233 }));
234 crate::schemars::schema::Schema::Object(schema_obj)
235 },
236 ),
237 (
238 "group".to_owned(),
239 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
240 metadata: Some(Box::new(crate::schemars::schema::Metadata {
241 description: Some("Group is the API Group of the Resource. \"*\" means all.".to_owned()),
242 ..Default::default()
243 })),
244 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
245 ..Default::default()
246 }),
247 ),
248 (
249 "labelSelector".to_owned(),
250 {
251 let mut schema_obj = __gen.subschema_for::<crate::api::authorization::v1::LabelSelectorAttributes>().into_object();
252 schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
253 description: Some("labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).".to_owned()),
254 ..Default::default()
255 }));
256 crate::schemars::schema::Schema::Object(schema_obj)
257 },
258 ),
259 (
260 "name".to_owned(),
261 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
262 metadata: Some(Box::new(crate::schemars::schema::Metadata {
263 description: Some("Name is the name of the resource being requested for a \"get\" or deleted for a \"delete\". \"\" (empty) means all.".to_owned()),
264 ..Default::default()
265 })),
266 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
267 ..Default::default()
268 }),
269 ),
270 (
271 "namespace".to_owned(),
272 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
273 metadata: Some(Box::new(crate::schemars::schema::Metadata {
274 description: Some("Namespace is the namespace of the action being requested. Currently, there is no distinction between no namespace and all namespaces \"\" (empty) is defaulted for LocalSubjectAccessReviews \"\" (empty) is empty for cluster-scoped resources \"\" (empty) means \"all\" for namespace scoped resources from a SubjectAccessReview or SelfSubjectAccessReview".to_owned()),
275 ..Default::default()
276 })),
277 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
278 ..Default::default()
279 }),
280 ),
281 (
282 "resource".to_owned(),
283 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
284 metadata: Some(Box::new(crate::schemars::schema::Metadata {
285 description: Some("Resource is one of the existing resource types. \"*\" means all.".to_owned()),
286 ..Default::default()
287 })),
288 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
289 ..Default::default()
290 }),
291 ),
292 (
293 "subresource".to_owned(),
294 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
295 metadata: Some(Box::new(crate::schemars::schema::Metadata {
296 description: Some("Subresource is one of the existing resource types. \"\" means none.".to_owned()),
297 ..Default::default()
298 })),
299 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
300 ..Default::default()
301 }),
302 ),
303 (
304 "verb".to_owned(),
305 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
306 metadata: Some(Box::new(crate::schemars::schema::Metadata {
307 description: Some("Verb is a kubernetes resource API verb, like: get, list, watch, create, update, delete, proxy. \"*\" means all.".to_owned()),
308 ..Default::default()
309 })),
310 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
311 ..Default::default()
312 }),
313 ),
314 (
315 "version".to_owned(),
316 crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
317 metadata: Some(Box::new(crate::schemars::schema::Metadata {
318 description: Some("Version is the API Version of the Resource. \"*\" means all.".to_owned()),
319 ..Default::default()
320 })),
321 instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
322 ..Default::default()
323 }),
324 ),
325 ].into(),
326 ..Default::default()
327 })),
328 ..Default::default()
329 })
330 }
331}