api-macro: support non-idents in serde(rename)

For PVE we'll have enum variants like /dev/urandom...

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2023-03-31 13:43:26 +02:00
parent 39453abb8f
commit 12674a37e0
3 changed files with 6 additions and 7 deletions

View File

@ -59,7 +59,7 @@ pub fn handle_enum(
let attrs = serde::SerdeAttrib::try_from(&variant.attrs[..])?; let attrs = serde::SerdeAttrib::try_from(&variant.attrs[..])?;
let variant_string = if let Some(renamed) = attrs.rename { let variant_string = if let Some(renamed) = attrs.rename {
renamed.into_lit_str() renamed
} else if let Some(rename_all) = container_attrs.rename_all { } else if let Some(rename_all) = container_attrs.rename_all {
let name = rename_all.apply_to_variant(&variant.ident.to_string()); let name = rename_all.apply_to_variant(&variant.ident.to_string());
syn::LitStr::new(&name, variant.ident.span()) syn::LitStr::new(&name, variant.ident.span())

View File

@ -169,7 +169,7 @@ fn handle_regular_struct(
.ok_or_else(|| format_err!(field => "field without name?"))?; .ok_or_else(|| format_err!(field => "field without name?"))?;
if let Some(renamed) = attrs.rename { if let Some(renamed) = attrs.rename {
(renamed.into_str(), ident.span()) (renamed.value(), ident.span())
} else if let Some(rename_all) = container_attrs.rename_all { } else if let Some(rename_all) = container_attrs.rename_all {
let name = rename_all.apply_to_field(&ident.to_string()); let name = rename_all.apply_to_field(&ident.to_string());
(name, ident.span()) (name, ident.span())

View File

@ -5,7 +5,7 @@
use std::convert::TryFrom; use std::convert::TryFrom;
use crate::util::{AttrArgs, FieldName}; use crate::util::AttrArgs;
/// Serde name types. /// Serde name types.
#[allow(clippy::enum_variant_names)] #[allow(clippy::enum_variant_names)]
@ -159,7 +159,7 @@ impl TryFrom<&[syn::Attribute]> for ContainerAttrib {
/// `serde` field/variant attributes we support /// `serde` field/variant attributes we support
#[derive(Default)] #[derive(Default)]
pub struct SerdeAttrib { pub struct SerdeAttrib {
pub rename: Option<FieldName>, pub rename: Option<syn::LitStr>,
pub flatten: bool, pub flatten: bool,
} }
@ -176,10 +176,9 @@ impl SerdeAttrib {
match arg { match arg {
NestedMeta::Meta(Meta::NameValue(var)) if var.path.is_ident("rename") => { NestedMeta::Meta(Meta::NameValue(var)) if var.path.is_ident("rename") => {
match var.lit { match var.lit {
syn::Lit::Str(lit) => { syn::Lit::Str(rename) => {
let rename = FieldName::from(&lit);
if self.rename.is_some() && self.rename.as_ref() != Some(&rename) { if self.rename.is_some() && self.rename.as_ref() != Some(&rename) {
error!(lit => "multiple conflicting 'rename' attributes"); error!(&rename => "multiple conflicting 'rename' attributes");
} }
self.rename = Some(rename); self.rename = Some(rename);
} }