Distinguish between field and container attributes when parsing

This commit is contained in:
jaydenelliott 2023-03-27 18:22:53 +11:00
parent 071dfa3f3b
commit bc8ad8aee6
5 changed files with 11 additions and 5 deletions

View File

@ -14,7 +14,7 @@ pub struct Field {
impl Field {
pub fn parse(raw: &syn::Field, rename_all: Option<RenameRule>) -> Result<Field, Error> {
let overrides = Overrides::extract(&raw.attrs)?;
let overrides = Overrides::extract(&raw.attrs, false)?;
let ident = raw.ident.as_ref().unwrap().clone();
// field level name override takes precendence over container level rename_all override

View File

@ -18,7 +18,7 @@ impl Variant {
))
}
}
let overrides = Overrides::extract(&raw.attrs)?;
let overrides = Overrides::extract(&raw.attrs, false)?;
// variant level name override takes precendence over container level rename_all override
let name = overrides.name.unwrap_or_else(|| match rename_all {

View File

@ -15,7 +15,7 @@ use crate::enums::Variant;
use crate::overrides::Overrides;
pub fn expand_derive_fromsql(input: DeriveInput) -> Result<TokenStream, Error> {
let overrides = Overrides::extract(&input.attrs)?;
let overrides = Overrides::extract(&input.attrs, true)?;
if overrides.name.is_some() && overrides.transparent {
return Err(Error::new_spanned(

View File

@ -10,7 +10,7 @@ pub struct Overrides {
}
impl Overrides {
pub fn extract(attrs: &[Attribute]) -> Result<Overrides, Error> {
pub fn extract(attrs: &[Attribute], container_attr: bool) -> Result<Overrides, Error> {
let mut overrides = Overrides {
name: None,
rename_all: None,
@ -34,6 +34,12 @@ impl Overrides {
Meta::NameValue(meta) => {
let name_override = meta.path.is_ident("name");
let rename_all_override = meta.path.is_ident("rename_all");
if !container_attr && rename_all_override {
return Err(Error::new_spanned(
&meta.path,
"rename_all is a container attribute",
));
}
if !name_override && !rename_all_override {
return Err(Error::new_spanned(&meta.path, "unknown override"));
}

View File

@ -13,7 +13,7 @@ use crate::enums::Variant;
use crate::overrides::Overrides;
pub fn expand_derive_tosql(input: DeriveInput) -> Result<TokenStream, Error> {
let overrides = Overrides::extract(&input.attrs)?;
let overrides = Overrides::extract(&input.attrs, true)?;
if overrides.name.is_some() && overrides.transparent {
return Err(Error::new_spanned(