diff --git a/examples/crd_derive_schema.rs b/examples/crd_derive_schema.rs index a25037336..a299f48ec 100644 --- a/examples/crd_derive_schema.rs +++ b/examples/crd_derive_schema.rs @@ -7,7 +7,7 @@ use kube::{ WatchEvent, WatchParams, }, runtime::wait::{await_condition, conditions}, - Client, CustomResource, CustomResourceExt, ValidateSchema, + Client, CustomResource, CustomResourceExt, CELSchema, }; use serde::{Deserialize, Serialize}; @@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize}; // - https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#defaulting // - https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#defaulting-and-nullable -#[derive(CustomResource, ValidateSchema, Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)] +#[derive(CustomResource, CELSchema, Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)] #[kube( group = "clux.dev", version = "v1", @@ -100,7 +100,7 @@ pub struct FooSpec { foo_sub_spec: Option, } -#[derive(ValidateSchema, Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)] +#[derive(CELSchema, Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)] pub struct FooSubSpec { #[cel_validate(rule = "self != 'not legal'".into())] field: String, diff --git a/kube-derive/src/custom_resource.rs b/kube-derive/src/custom_resource.rs index 3a05c10c8..c74e26c07 100644 --- a/kube-derive/src/custom_resource.rs +++ b/kube-derive/src/custom_resource.rs @@ -161,7 +161,6 @@ enum SchemaMode { Disabled, Manual, Derived, - Validated, } impl SchemaMode { @@ -170,16 +169,6 @@ impl SchemaMode { SchemaMode::Disabled => false, SchemaMode::Manual => false, SchemaMode::Derived => true, - SchemaMode::Validated => true, - } - } - - fn validated(self) -> bool { - match self { - SchemaMode::Disabled => false, - SchemaMode::Manual => false, - SchemaMode::Derived => false, - SchemaMode::Validated => true, } } @@ -188,7 +177,6 @@ impl SchemaMode { SchemaMode::Disabled => false, SchemaMode::Manual => true, SchemaMode::Derived => true, - SchemaMode::Validated => true, } } } @@ -320,16 +308,13 @@ pub(crate) fn derive(input: proc_macro2::TokenStream) -> proc_macro2::TokenStrea } // Enable schema generation by default as in v1 it is mandatory. - let schema_mode = schema_mode.unwrap_or(match rules.is_empty() { - true => SchemaMode::Derived, - false => SchemaMode::Validated, - }); + let schema_mode = schema_mode.unwrap_or(SchemaMode::Derived); // We exclude fields `apiVersion`, `kind`, and `metadata` from our schema because // these are validated by the API server implicitly. Also, we can't generate the // schema for `metadata` (`ObjectMeta`) because it doesn't implement `JsonSchema`. let schemars_skip = schema_mode.derive().then_some(quote! { #[schemars(skip)] }); - if schema_mode.validated() { - derive_paths.push(syn::parse_quote! { #kube::ValidateSchema }); + if schema_mode.derive() && !rules.is_empty() { + derive_paths.push(syn::parse_quote! { #kube::CELSchema }); } else if schema_mode.derive() { derive_paths.push(syn::parse_quote! { #schemars::JsonSchema }); } @@ -666,7 +651,7 @@ struct Rule { #[derive(FromDeriveInput)] #[darling(attributes(cel_validate), supports(struct_named))] -struct ValidateSchema { +struct CELSchema { #[darling(default)] crates: Crates, ident: Ident, @@ -680,7 +665,7 @@ pub(crate) fn derive_validated_schema(input: TokenStream) -> TokenStream { Ok(di) => di, }; - let ValidateSchema { + let CELSchema { crates: Crates { kube_core, @@ -690,7 +675,7 @@ pub(crate) fn derive_validated_schema(input: TokenStream) -> TokenStream { }, ident, rules, - } = match ValidateSchema::from_derive_input(&ast) { + } = match CELSchema::from_derive_input(&ast) { Err(err) => return err.write_errors(), Ok(attrs) => attrs, }; @@ -916,7 +901,7 @@ mod tests { #[test] fn test_derive_validated() { let input = quote! { - #[derive(CustomResource, ValidateSchema, Serialize, Deserialize, Debug, PartialEq, Clone)] + #[derive(CustomResource, CELSchema, Serialize, Deserialize, Debug, PartialEq, Clone)] #[kube(group = "clux.dev", version = "v1", kind = "Foo", namespaced)] #[cel_validate(rule = "self != ''".into())] struct FooSpec { @@ -925,14 +910,14 @@ mod tests { } }; let input = syn::parse2(input).unwrap(); - let v = ValidateSchema::from_derive_input(&input).unwrap(); + let v = CELSchema::from_derive_input(&input).unwrap(); assert_eq!(v.rules.len(), 1); } #[test] fn test_derive_validated_full() { let input = quote! { - #[derive(ValidateSchema)] + #[derive(CELSchema)] #[cel_validate(rule = "true".into())] struct FooSpec { #[cel_validate(rule = "true".into())] diff --git a/kube-derive/src/lib.rs b/kube-derive/src/lib.rs index 5a603b368..4022a96af 100644 --- a/kube-derive/src/lib.rs +++ b/kube-derive/src/lib.rs @@ -330,13 +330,13 @@ pub fn derive_custom_resource(input: proc_macro::TokenStream) -> proc_macro::Tok /// Generates a JsonSchema implementation a set of CEL validation rules applied on the CRD. /// /// ```rust -/// use kube::ValidateSchema; +/// use kube::CELSchema; /// use kube::CustomResource; /// use serde::Deserialize; /// use serde::Serialize; /// use kube::core::crd::CustomResourceExt; /// -/// #[derive(CustomResource, ValidateSchema, Serialize, Deserialize, Clone, Debug)] +/// #[derive(CustomResource, CELSchema, Serialize, Deserialize, Clone, Debug)] /// #[kube( /// group = "kube.rs", /// version = "v1", @@ -361,7 +361,7 @@ pub fn derive_custom_resource(input: proc_macro::TokenStream) -> proc_macro::Tok /// assert!(serde_json::to_string(&Struct::crd()).unwrap().contains(r#""default":"value""#)); /// assert!(serde_json::to_string(&Struct::crd()).unwrap().contains(r#""rule":"self.matadata.name == 'singleton'""#)); /// ``` -#[proc_macro_derive(ValidateSchema, attributes(cel_validate, schemars))] +#[proc_macro_derive(CELSchema, attributes(cel_validate, schemars))] pub fn derive_schema_validation(input: proc_macro::TokenStream) -> proc_macro::TokenStream { custom_resource::derive_validated_schema(input.into()).into() } diff --git a/kube-derive/tests/crd_schema_test.rs b/kube-derive/tests/crd_schema_test.rs index aba8e4873..8e8c5cf07 100644 --- a/kube-derive/tests/crd_schema_test.rs +++ b/kube-derive/tests/crd_schema_test.rs @@ -2,14 +2,14 @@ use assert_json_diff::assert_json_eq; use chrono::{DateTime, Utc}; -use kube::ValidateSchema; +use kube::CELSchema; use kube_derive::CustomResource; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; // See `crd_derive_schema` example for how the schema generated from this struct affects defaulting and validation. -#[derive(CustomResource, Serialize, Deserialize, Debug, PartialEq, Clone, ValidateSchema)] +#[derive(CustomResource, Serialize, Deserialize, Debug, PartialEq, Clone, CELSchema)] #[kube( group = "clux.dev", version = "v1", diff --git a/kube/src/lib.rs b/kube/src/lib.rs index bec8ba4d0..1cb9f23c4 100644 --- a/kube/src/lib.rs +++ b/kube/src/lib.rs @@ -170,7 +170,7 @@ pub use kube_derive::Resource; #[cfg(feature = "derive")] #[cfg_attr(docsrs, doc(cfg(feature = "derive")))] -pub use kube_derive::ValidateSchema; +pub use kube_derive::CELSchema; #[cfg(feature = "runtime")] #[cfg_attr(docsrs, doc(cfg(feature = "runtime")))]