diff --git a/proxmox-api-macro/src/api_macro.rs b/proxmox-api-macro/src/api_macro.rs index 7d330ea0..fab62644 100644 --- a/proxmox-api-macro/src/api_macro.rs +++ b/proxmox-api-macro/src/api_macro.rs @@ -527,7 +527,9 @@ fn handle_struct_named( field_ident_list.extend(quote_spanned! { field_span => #field_ident, }); serialize_entries.extend(quote_spanned! { field_span => - state.serialize_field(#field_str, &self.#field_ident)?; + if !::proxmox::api::ApiType::should_skip_serialization(&self.#field_ident) { + state.serialize_field(#field_str, &self.#field_ident)?; + } }); field_option_init_list.extend(quote_spanned! { field_span => diff --git a/proxmox-api/src/api_type.rs b/proxmox-api/src/api_type.rs index 4d95b692..f3b95c11 100644 --- a/proxmox-api/src/api_type.rs +++ b/proxmox-api/src/api_type.rs @@ -185,6 +185,10 @@ pub trait ApiType { fn get_type_info(&self) -> &'static TypeInfo { Self::type_info() } + + fn should_skip_serialization(&self) -> bool { + false + } } /// Option types are supposed to wrap their underlying types with an `optional:` text in their @@ -234,6 +238,10 @@ impl ApiType for Option { unsafe { (*DATA.info.as_ptr()).as_ref().unwrap() } */ } + + fn should_skip_serialization(&self) -> bool { + self.is_none() + } } /// Any `Result` of course gets the same info as `T`, since this only means that it can