use crate::prelude::*;
use darling::FromMeta;
#[derive(Clone, Debug, Default, FromMeta)]
#[allow(dead_code)]
pub struct SerdeField {
#[darling(default, multiple)]
pub alias: Vec<syn::LitStr>,
#[darling(default)]
pub default: Option<syn::Meta>,
#[darling(default)]
pub deserialize_with: Option<syn::Meta>,
#[darling(default)]
pub flatten: Option<bool>,
#[darling(default)]
pub rename: Option<syn::LitStr>,
#[darling(default)]
pub serialize_with: Option<syn::Meta>,
#[darling(default)]
pub skip: Option<bool>,
#[darling(default)]
pub skip_deserializing: Option<bool>,
#[darling(default)]
pub skip_serializing: Option<bool>,
#[darling(default)]
pub skip_serializing_if: Option<syn::Meta>,
#[darling(default)]
pub with: Option<syn::Meta>,
}
impl SerdeField {
pub fn from_ast(attrs: &[syn::Attribute]) -> Result<Self> {
attrs::from_ast(attrs, "serde")
.map(|attrs| attrs.fold(Self::default(), Self::merge))
}
pub fn merge(mut self, mut other: Self) -> Self {
self.alias.append(&mut other.alias);
Self {
alias: self.alias,
default: None, deserialize_with: None, flatten: other.flatten.or(self.flatten),
rename: other.rename.or(self.rename),
serialize_with: None, skip: other.skip.or(self.skip),
skip_deserializing: other
.skip_deserializing
.or(self.skip_deserializing),
skip_serializing: other.skip_serializing.or(self.skip_serializing),
skip_serializing_if: None, with: None, }
}
}