k8s_openapi/v1_32/api/rbac/v1/
cluster_role.rs

1// Generated from definition io.k8s.api.rbac.v1.ClusterRole
2
3/// ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.
4#[derive(Clone, Debug, Default, PartialEq)]
5pub struct ClusterRole {
6    /// AggregationRule is an optional field that describes how to build the Rules for this ClusterRole. If AggregationRule is set, then the Rules are controller managed and direct changes to Rules will be stomped by the controller.
7    pub aggregation_rule: Option<crate::api::rbac::v1::AggregationRule>,
8
9    /// Standard object's metadata.
10    pub metadata: crate::apimachinery::pkg::apis::meta::v1::ObjectMeta,
11
12    /// Rules holds all the PolicyRules for this ClusterRole
13    pub rules: Option<Vec<crate::api::rbac::v1::PolicyRule>>,
14}
15
16impl crate::Resource for ClusterRole {
17    const API_VERSION: &'static str = "rbac.authorization.k8s.io/v1";
18    const GROUP: &'static str = "rbac.authorization.k8s.io";
19    const KIND: &'static str = "ClusterRole";
20    const VERSION: &'static str = "v1";
21    const URL_PATH_SEGMENT: &'static str = "clusterroles";
22    type Scope = crate::ClusterResourceScope;
23}
24
25impl crate::ListableResource for ClusterRole {
26    const LIST_KIND: &'static str = "ClusterRoleList";
27}
28
29impl crate::Metadata for ClusterRole {
30    type Ty = crate::apimachinery::pkg::apis::meta::v1::ObjectMeta;
31
32    fn metadata(&self) -> &<Self as crate::Metadata>::Ty {
33        &self.metadata
34    }
35
36    fn metadata_mut(&mut self) -> &mut<Self as crate::Metadata>::Ty {
37        &mut self.metadata
38    }
39}
40
41impl crate::DeepMerge for ClusterRole {
42    fn merge_from(&mut self, other: Self) {
43        crate::DeepMerge::merge_from(&mut self.aggregation_rule, other.aggregation_rule);
44        crate::DeepMerge::merge_from(&mut self.metadata, other.metadata);
45        crate::merge_strategies::list::atomic(&mut self.rules, other.rules);
46    }
47}
48
49impl<'de> crate::serde::Deserialize<'de> for ClusterRole {
50    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
51        #[allow(non_camel_case_types)]
52        enum Field {
53            Key_api_version,
54            Key_kind,
55            Key_aggregation_rule,
56            Key_metadata,
57            Key_rules,
58            Other,
59        }
60
61        impl<'de> crate::serde::Deserialize<'de> for Field {
62            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
63                struct Visitor;
64
65                impl crate::serde::de::Visitor<'_> for Visitor {
66                    type Value = Field;
67
68                    fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69                        f.write_str("field identifier")
70                    }
71
72                    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
73                        Ok(match v {
74                            "apiVersion" => Field::Key_api_version,
75                            "kind" => Field::Key_kind,
76                            "aggregationRule" => Field::Key_aggregation_rule,
77                            "metadata" => Field::Key_metadata,
78                            "rules" => Field::Key_rules,
79                            _ => Field::Other,
80                        })
81                    }
82                }
83
84                deserializer.deserialize_identifier(Visitor)
85            }
86        }
87
88        struct Visitor;
89
90        impl<'de> crate::serde::de::Visitor<'de> for Visitor {
91            type Value = ClusterRole;
92
93            fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
94                f.write_str(<Self::Value as crate::Resource>::KIND)
95            }
96
97            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
98                let mut value_aggregation_rule: Option<crate::api::rbac::v1::AggregationRule> = None;
99                let mut value_metadata: Option<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta> = None;
100                let mut value_rules: Option<Vec<crate::api::rbac::v1::PolicyRule>> = None;
101
102                while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
103                    match key {
104                        Field::Key_api_version => {
105                            let value_api_version: String = crate::serde::de::MapAccess::next_value(&mut map)?;
106                            if value_api_version != <Self::Value as crate::Resource>::API_VERSION {
107                                return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_api_version), &<Self::Value as crate::Resource>::API_VERSION));
108                            }
109                        },
110                        Field::Key_kind => {
111                            let value_kind: String = crate::serde::de::MapAccess::next_value(&mut map)?;
112                            if value_kind != <Self::Value as crate::Resource>::KIND {
113                                return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_kind), &<Self::Value as crate::Resource>::KIND));
114                            }
115                        },
116                        Field::Key_aggregation_rule => value_aggregation_rule = crate::serde::de::MapAccess::next_value(&mut map)?,
117                        Field::Key_metadata => value_metadata = crate::serde::de::MapAccess::next_value(&mut map)?,
118                        Field::Key_rules => value_rules = crate::serde::de::MapAccess::next_value(&mut map)?,
119                        Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
120                    }
121                }
122
123                Ok(ClusterRole {
124                    aggregation_rule: value_aggregation_rule,
125                    metadata: value_metadata.unwrap_or_default(),
126                    rules: value_rules,
127                })
128            }
129        }
130
131        deserializer.deserialize_struct(
132            <Self as crate::Resource>::KIND,
133            &[
134                "apiVersion",
135                "kind",
136                "aggregationRule",
137                "metadata",
138                "rules",
139            ],
140            Visitor,
141        )
142    }
143}
144
145impl crate::serde::Serialize for ClusterRole {
146    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
147        let mut state = serializer.serialize_struct(
148            <Self as crate::Resource>::KIND,
149            3 +
150            self.aggregation_rule.as_ref().map_or(0, |_| 1) +
151            self.rules.as_ref().map_or(0, |_| 1),
152        )?;
153        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "apiVersion", <Self as crate::Resource>::API_VERSION)?;
154        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "kind", <Self as crate::Resource>::KIND)?;
155        if let Some(value) = &self.aggregation_rule {
156            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "aggregationRule", value)?;
157        }
158        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
159        if let Some(value) = &self.rules {
160            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "rules", value)?;
161        }
162        crate::serde::ser::SerializeStruct::end(state)
163    }
164}
165
166#[cfg(feature = "schemars")]
167impl crate::schemars::JsonSchema for ClusterRole {
168    fn schema_name() -> String {
169        "io.k8s.api.rbac.v1.ClusterRole".to_owned()
170    }
171
172    fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
173        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
174            metadata: Some(Box::new(crate::schemars::schema::Metadata {
175                description: Some("ClusterRole is a cluster level, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding or ClusterRoleBinding.".to_owned()),
176                ..Default::default()
177            })),
178            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
179            object: Some(Box::new(crate::schemars::schema::ObjectValidation {
180                properties: [
181                    (
182                        "aggregationRule".to_owned(),
183                        {
184                            let mut schema_obj = __gen.subschema_for::<crate::api::rbac::v1::AggregationRule>().into_object();
185                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
186                                description: Some("AggregationRule is an optional field that describes how to build the Rules for this ClusterRole. If AggregationRule is set, then the Rules are controller managed and direct changes to Rules will be stomped by the controller.".to_owned()),
187                                ..Default::default()
188                            }));
189                            crate::schemars::schema::Schema::Object(schema_obj)
190                        },
191                    ),
192                    (
193                        "apiVersion".to_owned(),
194                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
195                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
196                                description: Some("APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources".to_owned()),
197                                ..Default::default()
198                            })),
199                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
200                            ..Default::default()
201                        }),
202                    ),
203                    (
204                        "kind".to_owned(),
205                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
206                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
207                                description: Some("Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds".to_owned()),
208                                ..Default::default()
209                            })),
210                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
211                            ..Default::default()
212                        }),
213                    ),
214                    (
215                        "metadata".to_owned(),
216                        {
217                            let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta>().into_object();
218                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
219                                description: Some("Standard object's metadata.".to_owned()),
220                                ..Default::default()
221                            }));
222                            crate::schemars::schema::Schema::Object(schema_obj)
223                        },
224                    ),
225                    (
226                        "rules".to_owned(),
227                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
228                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
229                                description: Some("Rules holds all the PolicyRules for this ClusterRole".to_owned()),
230                                ..Default::default()
231                            })),
232                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Array))),
233                            array: Some(Box::new(crate::schemars::schema::ArrayValidation {
234                                items: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(__gen.subschema_for::<crate::api::rbac::v1::PolicyRule>()))),
235                                ..Default::default()
236                            })),
237                            ..Default::default()
238                        }),
239                    ),
240                ].into(),
241                required: [
242                    "metadata".to_owned(),
243                ].into(),
244                ..Default::default()
245            })),
246            ..Default::default()
247        })
248    }
249}