k8s_openapi/v1_30/api/authorization/v1/
self_subject_rules_review.rs

1// Generated from definition io.k8s.api.authorization.v1.SelfSubjectRulesReview
2
3/// SelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.
4#[derive(Clone, Debug, Default, PartialEq)]
5pub struct SelfSubjectRulesReview {
6    /// Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
7    pub metadata: crate::apimachinery::pkg::apis::meta::v1::ObjectMeta,
8
9    /// Spec holds information about the request being evaluated.
10    pub spec: crate::api::authorization::v1::SelfSubjectRulesReviewSpec,
11
12    /// Status is filled in by the server and indicates the set of actions a user can perform.
13    pub status: Option<crate::api::authorization::v1::SubjectRulesReviewStatus>,
14}
15
16impl crate::Resource for SelfSubjectRulesReview {
17    const API_VERSION: &'static str = "authorization.k8s.io/v1";
18    const GROUP: &'static str = "authorization.k8s.io";
19    const KIND: &'static str = "SelfSubjectRulesReview";
20    const VERSION: &'static str = "v1";
21    const URL_PATH_SEGMENT: &'static str = "selfsubjectrulesreviews";
22    type Scope = crate::ClusterResourceScope;
23}
24
25impl crate::Metadata for SelfSubjectRulesReview {
26    type Ty = crate::apimachinery::pkg::apis::meta::v1::ObjectMeta;
27
28    fn metadata(&self) -> &<Self as crate::Metadata>::Ty {
29        &self.metadata
30    }
31
32    fn metadata_mut(&mut self) -> &mut<Self as crate::Metadata>::Ty {
33        &mut self.metadata
34    }
35}
36
37impl crate::DeepMerge for SelfSubjectRulesReview {
38    fn merge_from(&mut self, other: Self) {
39        crate::DeepMerge::merge_from(&mut self.metadata, other.metadata);
40        crate::DeepMerge::merge_from(&mut self.spec, other.spec);
41        crate::DeepMerge::merge_from(&mut self.status, other.status);
42    }
43}
44
45impl<'de> crate::serde::Deserialize<'de> for SelfSubjectRulesReview {
46    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
47        #[allow(non_camel_case_types)]
48        enum Field {
49            Key_api_version,
50            Key_kind,
51            Key_metadata,
52            Key_spec,
53            Key_status,
54            Other,
55        }
56
57        impl<'de> crate::serde::Deserialize<'de> for Field {
58            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: crate::serde::Deserializer<'de> {
59                struct Visitor;
60
61                impl crate::serde::de::Visitor<'_> for Visitor {
62                    type Value = Field;
63
64                    fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
65                        f.write_str("field identifier")
66                    }
67
68                    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: crate::serde::de::Error {
69                        Ok(match v {
70                            "apiVersion" => Field::Key_api_version,
71                            "kind" => Field::Key_kind,
72                            "metadata" => Field::Key_metadata,
73                            "spec" => Field::Key_spec,
74                            "status" => Field::Key_status,
75                            _ => Field::Other,
76                        })
77                    }
78                }
79
80                deserializer.deserialize_identifier(Visitor)
81            }
82        }
83
84        struct Visitor;
85
86        impl<'de> crate::serde::de::Visitor<'de> for Visitor {
87            type Value = SelfSubjectRulesReview;
88
89            fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
90                f.write_str(<Self::Value as crate::Resource>::KIND)
91            }
92
93            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: crate::serde::de::MapAccess<'de> {
94                let mut value_metadata: Option<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta> = None;
95                let mut value_spec: Option<crate::api::authorization::v1::SelfSubjectRulesReviewSpec> = None;
96                let mut value_status: Option<crate::api::authorization::v1::SubjectRulesReviewStatus> = None;
97
98                while let Some(key) = crate::serde::de::MapAccess::next_key::<Field>(&mut map)? {
99                    match key {
100                        Field::Key_api_version => {
101                            let value_api_version: String = crate::serde::de::MapAccess::next_value(&mut map)?;
102                            if value_api_version != <Self::Value as crate::Resource>::API_VERSION {
103                                return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_api_version), &<Self::Value as crate::Resource>::API_VERSION));
104                            }
105                        },
106                        Field::Key_kind => {
107                            let value_kind: String = crate::serde::de::MapAccess::next_value(&mut map)?;
108                            if value_kind != <Self::Value as crate::Resource>::KIND {
109                                return Err(crate::serde::de::Error::invalid_value(crate::serde::de::Unexpected::Str(&value_kind), &<Self::Value as crate::Resource>::KIND));
110                            }
111                        },
112                        Field::Key_metadata => value_metadata = crate::serde::de::MapAccess::next_value(&mut map)?,
113                        Field::Key_spec => value_spec = crate::serde::de::MapAccess::next_value(&mut map)?,
114                        Field::Key_status => value_status = crate::serde::de::MapAccess::next_value(&mut map)?,
115                        Field::Other => { let _: crate::serde::de::IgnoredAny = crate::serde::de::MapAccess::next_value(&mut map)?; },
116                    }
117                }
118
119                Ok(SelfSubjectRulesReview {
120                    metadata: value_metadata.unwrap_or_default(),
121                    spec: value_spec.unwrap_or_default(),
122                    status: value_status,
123                })
124            }
125        }
126
127        deserializer.deserialize_struct(
128            <Self as crate::Resource>::KIND,
129            &[
130                "apiVersion",
131                "kind",
132                "metadata",
133                "spec",
134                "status",
135            ],
136            Visitor,
137        )
138    }
139}
140
141impl crate::serde::Serialize for SelfSubjectRulesReview {
142    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: crate::serde::Serializer {
143        let mut state = serializer.serialize_struct(
144            <Self as crate::Resource>::KIND,
145            4 +
146            self.status.as_ref().map_or(0, |_| 1),
147        )?;
148        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "apiVersion", <Self as crate::Resource>::API_VERSION)?;
149        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "kind", <Self as crate::Resource>::KIND)?;
150        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
151        crate::serde::ser::SerializeStruct::serialize_field(&mut state, "spec", &self.spec)?;
152        if let Some(value) = &self.status {
153            crate::serde::ser::SerializeStruct::serialize_field(&mut state, "status", value)?;
154        }
155        crate::serde::ser::SerializeStruct::end(state)
156    }
157}
158
159#[cfg(feature = "schemars")]
160impl crate::schemars::JsonSchema for SelfSubjectRulesReview {
161    fn schema_name() -> String {
162        "io.k8s.api.authorization.v1.SelfSubjectRulesReview".to_owned()
163    }
164
165    fn json_schema(__gen: &mut crate::schemars::gen::SchemaGenerator) -> crate::schemars::schema::Schema {
166        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
167            metadata: Some(Box::new(crate::schemars::schema::Metadata {
168                description: Some("SelfSubjectRulesReview enumerates the set of actions the current user can perform within a namespace. The returned list of actions may be incomplete depending on the server's authorization mode, and any errors experienced during the evaluation. SelfSubjectRulesReview should be used by UIs to show/hide actions, or to quickly let an end user reason about their permissions. It should NOT Be used by external systems to drive authorization decisions as this raises confused deputy, cache lifetime/revocation, and correctness concerns. SubjectAccessReview, and LocalAccessReview are the correct way to defer authorization decisions to the API server.".to_owned()),
169                ..Default::default()
170            })),
171            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::Object))),
172            object: Some(Box::new(crate::schemars::schema::ObjectValidation {
173                properties: [
174                    (
175                        "apiVersion".to_owned(),
176                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
177                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
178                                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()),
179                                ..Default::default()
180                            })),
181                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
182                            ..Default::default()
183                        }),
184                    ),
185                    (
186                        "kind".to_owned(),
187                        crate::schemars::schema::Schema::Object(crate::schemars::schema::SchemaObject {
188                            metadata: Some(Box::new(crate::schemars::schema::Metadata {
189                                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()),
190                                ..Default::default()
191                            })),
192                            instance_type: Some(crate::schemars::schema::SingleOrVec::Single(Box::new(crate::schemars::schema::InstanceType::String))),
193                            ..Default::default()
194                        }),
195                    ),
196                    (
197                        "metadata".to_owned(),
198                        {
199                            let mut schema_obj = __gen.subschema_for::<crate::apimachinery::pkg::apis::meta::v1::ObjectMeta>().into_object();
200                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
201                                description: Some("Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata".to_owned()),
202                                ..Default::default()
203                            }));
204                            crate::schemars::schema::Schema::Object(schema_obj)
205                        },
206                    ),
207                    (
208                        "spec".to_owned(),
209                        {
210                            let mut schema_obj = __gen.subschema_for::<crate::api::authorization::v1::SelfSubjectRulesReviewSpec>().into_object();
211                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
212                                description: Some("Spec holds information about the request being evaluated.".to_owned()),
213                                ..Default::default()
214                            }));
215                            crate::schemars::schema::Schema::Object(schema_obj)
216                        },
217                    ),
218                    (
219                        "status".to_owned(),
220                        {
221                            let mut schema_obj = __gen.subschema_for::<crate::api::authorization::v1::SubjectRulesReviewStatus>().into_object();
222                            schema_obj.metadata = Some(Box::new(crate::schemars::schema::Metadata {
223                                description: Some("Status is filled in by the server and indicates the set of actions a user can perform.".to_owned()),
224                                ..Default::default()
225                            }));
226                            crate::schemars::schema::Schema::Object(schema_obj)
227                        },
228                    ),
229                ].into(),
230                required: [
231                    "metadata".to_owned(),
232                    "spec".to_owned(),
233                ].into(),
234                ..Default::default()
235            })),
236            ..Default::default()
237        })
238    }
239}