From c4a07ed4e80c5db43293526798f5d1ba580351f5 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 20 Sep 2025 00:10:10 +0500 Subject: [PATCH] Move body generator for unit structs to its own module Cut-paste --- serde_derive/src/de.rs | 49 ++--------------------------------- serde_derive/src/de/unit.rs | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 47 deletions(-) create mode 100644 serde_derive/src/de/unit.rs diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 48d2b57c..b20c840e 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -19,6 +19,7 @@ mod enum_internally; mod enum_untagged; mod struct_; mod tuple; +mod unit; pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result { replace_receiver(input); @@ -317,7 +318,7 @@ fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment { Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => { tuple::deserialize_tuple(params, fields, &cont.attrs, TupleForm::Tuple) } - Data::Struct(Style::Unit, _) => deserialize_unit_struct(params, &cont.attrs), + Data::Struct(Style::Unit, _) => unit::deserialize_unit_struct(params, &cont.attrs), } } else { match &cont.data { @@ -438,52 +439,6 @@ fn deserialize_try_from(type_try_from: &syn::Type) -> Fragment { } } -/// Generates `Deserialize::deserialize` body for a `struct Unit;` -fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment { - let this_type = ¶ms.this_type; - let this_value = ¶ms.this_value; - let type_name = cattrs.name().deserialize_name(); - let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = params.generics(); - let delife = params.borrowed.de_lifetime(); - - let expecting = format!("unit struct {}", params.type_name()); - let expecting = cattrs.expecting().unwrap_or(&expecting); - - quote_block! { - #[doc(hidden)] - struct __Visitor #de_impl_generics #where_clause { - marker: _serde::#private::PhantomData<#this_type #ty_generics>, - lifetime: _serde::#private::PhantomData<&#delife ()>, - } - - #[automatically_derived] - impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause { - type Value = #this_type #ty_generics; - - fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result { - _serde::#private::Formatter::write_str(__formatter, #expecting) - } - - #[inline] - fn visit_unit<__E>(self) -> _serde::#private::Result - where - __E: _serde::de::Error, - { - _serde::#private::Ok(#this_value) - } - } - - _serde::Deserializer::deserialize_unit_struct( - __deserializer, - #type_name, - __Visitor { - marker: _serde::#private::PhantomData::<#this_type #ty_generics>, - lifetime: _serde::#private::PhantomData, - }, - ) - } -} - enum TupleForm<'a> { Tuple, /// Contains a variant name diff --git a/serde_derive/src/de/unit.rs b/serde_derive/src/de/unit.rs new file mode 100644 index 00000000..3bce02c3 --- /dev/null +++ b/serde_derive/src/de/unit.rs @@ -0,0 +1,51 @@ +use crate::de::Parameters; +use crate::fragment::Fragment; +use crate::internals::attr; +use crate::private; +use quote::quote; + +/// Generates `Deserialize::deserialize` body for a `struct Unit;` +pub fn deserialize_unit_struct(params: &Parameters, cattrs: &attr::Container) -> Fragment { + let this_type = ¶ms.this_type; + let this_value = ¶ms.this_value; + let type_name = cattrs.name().deserialize_name(); + let (de_impl_generics, de_ty_generics, ty_generics, where_clause) = params.generics(); + let delife = params.borrowed.de_lifetime(); + + let expecting = format!("unit struct {}", params.type_name()); + let expecting = cattrs.expecting().unwrap_or(&expecting); + + quote_block! { + #[doc(hidden)] + struct __Visitor #de_impl_generics #where_clause { + marker: _serde::#private::PhantomData<#this_type #ty_generics>, + lifetime: _serde::#private::PhantomData<&#delife ()>, + } + + #[automatically_derived] + impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause { + type Value = #this_type #ty_generics; + + fn expecting(&self, __formatter: &mut _serde::#private::Formatter) -> _serde::#private::fmt::Result { + _serde::#private::Formatter::write_str(__formatter, #expecting) + } + + #[inline] + fn visit_unit<__E>(self) -> _serde::#private::Result + where + __E: _serde::de::Error, + { + _serde::#private::Ok(#this_value) + } + } + + _serde::Deserializer::deserialize_unit_struct( + __deserializer, + #type_name, + __Visitor { + marker: _serde::#private::PhantomData::<#this_type #ty_generics>, + lifetime: _serde::#private::PhantomData, + }, + ) + } +}