From a11f832e548ce536c9c8563b6c0a04916a7fb514 Mon Sep 17 00:00:00 2001 From: Mikail Bagishov Date: Tue, 6 Sep 2022 23:37:11 +0300 Subject: [PATCH] Avoid optionality Signed-off-by: Mikail Bagishov --- kube-core/src/conversion/types.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/kube-core/src/conversion/types.rs b/kube-core/src/conversion/types.rs index ee7c1c332..02676f0ce 100644 --- a/kube-core/src/conversion/types.rs +++ b/kube-core/src/conversion/types.rs @@ -1,5 +1,5 @@ use crate::{Status, TypeMeta}; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize}; use thiserror::Error; /// The `kind` field in [`TypeMeta`] @@ -92,8 +92,27 @@ pub struct ConversionResponse { /// This field should contain objects in the same order as in the request /// Should be empty if conversion failed. #[serde(rename = "convertedObjects")] - #[serde(skip_serializing_if = "Option::is_none")] - pub converted_objects: Option>, + #[serde(deserialize_with = "parse_converted_objects")] + pub converted_objects: Vec, +} + +fn parse_converted_objects<'de, D>(de: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum Helper { + List(Vec), + Null(()) + } + + let h: Helper = Helper::deserialize(de)?; + let res = match h { + Helper::List(l) => l, + Helper::Null(()) => Vec::new() + }; + Ok(res) } impl ConversionResponse { @@ -113,7 +132,7 @@ impl ConversionResponse { reason: String::new(), details: None, }, - converted_objects: None, + converted_objects: Vec::new(), } } @@ -122,7 +141,7 @@ impl ConversionResponse { /// `converted_objects` must specify objects in the exact same order as on input. pub fn success(mut self, converted_objects: Vec) -> Self { self.result = Status::success(); - self.converted_objects = Some(converted_objects); + self.converted_objects = converted_objects; self } @@ -144,7 +163,7 @@ impl ConversionResponse { types: None, uid: String::new(), result: Status::failure(message, reason), - converted_objects: None, + converted_objects: Vec::new(), } }