diff --git a/k8s-openapi-codegen/src/fixups.rs b/k8s-openapi-codegen/src/fixups.rs index 1ad73b7304..af163f7240 100644 --- a/k8s-openapi-codegen/src/fixups.rs +++ b/k8s-openapi-codegen/src/fixups.rs @@ -194,7 +194,7 @@ pub(crate) mod json_ty { pub(crate) fn json_schema_props_or_array(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { for (definition_path, definition) in &mut spec.definitions { if &**definition_path == "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrArray" { - if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::Any) = definition.kind { + if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrArray) = definition.kind { } else { definition.kind = crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrArray); @@ -211,7 +211,7 @@ pub(crate) mod json_ty { pub(crate) fn json_schema_props_or_bool(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { for (definition_path, definition) in &mut spec.definitions { if &**definition_path == "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool" { - if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::Any) = definition.kind { + if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrBool) = definition.kind { } else { definition.kind = crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrBool); @@ -228,7 +228,7 @@ pub(crate) mod json_ty { pub(crate) fn json_schema_props_or_string_array(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { for (definition_path, definition) in &mut spec.definitions { if &**definition_path == "io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray" { - if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::Any) = definition.kind { + if let crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrStringArray) = definition.kind { } else { definition.kind = crate::swagger20::SchemaKind::Ty(crate::swagger20::Type::JSONSchemaPropsOrStringArray); diff --git a/k8s-openapi-codegen/src/supported_version.rs b/k8s-openapi-codegen/src/supported_version.rs index e08bbf65d1..a6ecb1fd84 100644 --- a/k8s-openapi-codegen/src/supported_version.rs +++ b/k8s-openapi-codegen/src/supported_version.rs @@ -104,7 +104,6 @@ impl SupportedVersion { SupportedVersion::V1_11 => &[ crate::fixups::deployment_rollback_create_response_type, - crate::fixups::json_ty::json, crate::fixups::json_ty::json_schema_props_or_array, crate::fixups::json_ty::json_schema_props_or_bool, crate::fixups::json_ty::json_schema_props_or_string_array, @@ -118,7 +117,6 @@ impl SupportedVersion { SupportedVersion::V1_12 => &[ crate::fixups::connect_options_gvk, - crate::fixups::json_ty::json, crate::fixups::json_ty::json_schema_props_or_array, crate::fixups::json_ty::json_schema_props_or_bool, crate::fixups::json_ty::json_schema_props_or_string_array, @@ -131,7 +129,6 @@ impl SupportedVersion { SupportedVersion::V1_13 => &[ crate::fixups::connect_options_gvk, - crate::fixups::json_ty::json, crate::fixups::json_ty::json_schema_props_or_array, crate::fixups::json_ty::json_schema_props_or_bool, crate::fixups::json_ty::json_schema_props_or_string_array, diff --git a/k8s-openapi-codegen/src/swagger20/definitions.rs b/k8s-openapi-codegen/src/swagger20/definitions.rs index cb5931c7dd..dd0d70a47d 100644 --- a/k8s-openapi-codegen/src/swagger20/definitions.rs +++ b/k8s-openapi-codegen/src/swagger20/definitions.rs @@ -112,8 +112,7 @@ impl<'de> serde::Deserialize<'de> for Schema { #[serde(rename = "x-kubernetes-group-version-kind")] kubernetes_group_kind_versions: Option>, - #[serde(default)] - properties: std::collections::BTreeMap, + properties: Option>, #[serde(rename = "$ref")] ref_path: Option, @@ -125,12 +124,27 @@ impl<'de> serde::Deserialize<'de> for Schema { ty: Option, } - let value: InnerSchema = serde::Deserialize::deserialize(deserializer)?; + let mut value: InnerSchema = serde::Deserialize::deserialize(deserializer)?; let kind = if let Some(ref_path) = value.ref_path { SchemaKind::Ref(ref_path) } + else if let Some(properties) = value.properties.take() { + // Starting from 1.14, the spec sets type=object for all types with properties. + // Earlier specs did not set it at all. + if let Some(ty) = value.ty.take() { + if ty != "object" { + return Err(serde::de::Error::custom(format!("schema has properties but not type=object {:?}", value))); + } + } + + let required: std::collections::HashSet<_> = value.required.into_iter().collect(); + SchemaKind::Properties(properties.into_iter().map(|(name, schema)| { + let required = required.contains(&name); + (name, (schema, required)) + }).collect()) + } else if let Some(ty) = value.ty { SchemaKind::Ty(Type::parse::( &ty, @@ -140,11 +154,7 @@ impl<'de> serde::Deserialize<'de> for Schema { )?) } else { - let required: std::collections::HashSet<_> = value.required.into_iter().collect(); - SchemaKind::Properties(value.properties.into_iter().map(|(name, schema)| { - let required = required.contains(&name); - (name, (schema, required)) - }).collect()) + SchemaKind::Ty(Type::Any) }; Ok(Schema { diff --git a/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs b/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs index 24101f3dab..a2448d1eda 100644 --- a/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs +++ b/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs @@ -2,75 +2,30 @@ /// CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza #[derive(Clone, Debug, Default, PartialEq)] -pub struct CustomResourceSubresourceStatus { -} +pub struct CustomResourceSubresourceStatus(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for CustomResourceSubresourceStatus { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = CustomResourceSubresourceStatus; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct CustomResourceSubresourceStatus") + write!(f, "CustomResourceSubresourceStatus") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(CustomResourceSubresourceStatus { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(CustomResourceSubresourceStatus(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "CustomResourceSubresourceStatus", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("CustomResourceSubresourceStatus", Visitor) } } impl serde::Serialize for CustomResourceSubresourceStatus { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "CustomResourceSubresourceStatus", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("CustomResourceSubresourceStatus", &self.0) } } diff --git a/src/v1_10/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_10/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_10/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_10/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } } diff --git a/src/v1_11/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs b/src/v1_11/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs index 24101f3dab..a2448d1eda 100644 --- a/src/v1_11/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs +++ b/src/v1_11/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs @@ -2,75 +2,30 @@ /// CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza #[derive(Clone, Debug, Default, PartialEq)] -pub struct CustomResourceSubresourceStatus { -} +pub struct CustomResourceSubresourceStatus(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for CustomResourceSubresourceStatus { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = CustomResourceSubresourceStatus; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct CustomResourceSubresourceStatus") + write!(f, "CustomResourceSubresourceStatus") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(CustomResourceSubresourceStatus { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(CustomResourceSubresourceStatus(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "CustomResourceSubresourceStatus", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("CustomResourceSubresourceStatus", Visitor) } } impl serde::Serialize for CustomResourceSubresourceStatus { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "CustomResourceSubresourceStatus", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("CustomResourceSubresourceStatus", &self.0) } } diff --git a/src/v1_11/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_11/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_11/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_11/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } } diff --git a/src/v1_12/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs b/src/v1_12/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs index 24101f3dab..a2448d1eda 100644 --- a/src/v1_12/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs +++ b/src/v1_12/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs @@ -2,75 +2,30 @@ /// CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza #[derive(Clone, Debug, Default, PartialEq)] -pub struct CustomResourceSubresourceStatus { -} +pub struct CustomResourceSubresourceStatus(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for CustomResourceSubresourceStatus { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = CustomResourceSubresourceStatus; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct CustomResourceSubresourceStatus") + write!(f, "CustomResourceSubresourceStatus") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(CustomResourceSubresourceStatus { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(CustomResourceSubresourceStatus(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "CustomResourceSubresourceStatus", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("CustomResourceSubresourceStatus", Visitor) } } impl serde::Serialize for CustomResourceSubresourceStatus { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "CustomResourceSubresourceStatus", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("CustomResourceSubresourceStatus", &self.0) } } diff --git a/src/v1_12/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_12/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_12/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_12/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } } diff --git a/src/v1_13/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs b/src/v1_13/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs index 24101f3dab..a2448d1eda 100644 --- a/src/v1_13/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs +++ b/src/v1_13/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_subresource_status.rs @@ -2,75 +2,30 @@ /// CustomResourceSubresourceStatus defines how to serve the status subresource for CustomResources. Status is represented by the `.status` JSON path inside of a CustomResource. When set, * exposes a /status subresource for the custom resource * PUT requests to the /status subresource take a custom resource object, and ignore changes to anything except the status stanza * PUT/POST/PATCH requests to the custom resource ignore changes to the status stanza #[derive(Clone, Debug, Default, PartialEq)] -pub struct CustomResourceSubresourceStatus { -} +pub struct CustomResourceSubresourceStatus(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for CustomResourceSubresourceStatus { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = CustomResourceSubresourceStatus; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct CustomResourceSubresourceStatus") + write!(f, "CustomResourceSubresourceStatus") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(CustomResourceSubresourceStatus { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(CustomResourceSubresourceStatus(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "CustomResourceSubresourceStatus", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("CustomResourceSubresourceStatus", Visitor) } } impl serde::Serialize for CustomResourceSubresourceStatus { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "CustomResourceSubresourceStatus", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("CustomResourceSubresourceStatus", &self.0) } } diff --git a/src/v1_13/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_13/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_13/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_13/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } } diff --git a/src/v1_8/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_8/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_8/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_8/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } } diff --git a/src/v1_9/apimachinery/pkg/apis/meta/v1/patch.rs b/src/v1_9/apimachinery/pkg/apis/meta/v1/patch.rs index 8f07ca508b..6e84c5d4bd 100644 --- a/src/v1_9/apimachinery/pkg/apis/meta/v1/patch.rs +++ b/src/v1_9/apimachinery/pkg/apis/meta/v1/patch.rs @@ -2,75 +2,30 @@ /// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. #[derive(Clone, Debug, Default, PartialEq)] -pub struct Patch { -} +pub struct Patch(pub serde_json::Value); impl<'de> serde::Deserialize<'de> for Patch { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum Field { - Other, - } - - impl<'de> serde::Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - struct Visitor; - - impl<'de> serde::de::Visitor<'de> for Visitor { - type Value = Field; - - fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "field identifier") - } - - fn visit_str(self, v: &str) -> Result where E: serde::de::Error { - Ok(match v { - _ => Field::Other, - }) - } - } - - deserializer.deserialize_identifier(Visitor) - } - } - struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Patch; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "struct Patch") + write!(f, "Patch") } - fn visit_map(self, mut map: A) -> Result where A: serde::de::MapAccess<'de> { - - while let Some(key) = serde::de::MapAccess::next_key::(&mut map)? { - match key { - Field::Other => { let _: serde::de::IgnoredAny = serde::de::MapAccess::next_value(&mut map)?; }, - } - } - - Ok(Patch { - }) + fn visit_newtype_struct(self, deserializer: D) -> Result where D: serde::Deserializer<'de> { + Ok(Patch(serde::Deserialize::deserialize(deserializer)?)) } } - deserializer.deserialize_struct( - "Patch", - &[ - ], - Visitor, - ) + deserializer.deserialize_newtype_struct("Patch", Visitor) } } impl serde::Serialize for Patch { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - let state = serializer.serialize_struct( - "Patch", - 0, - )?; - serde::ser::SerializeStruct::end(state) + serializer.serialize_newtype_struct("Patch", &self.0) } }