use syn::{Attribute, Expr, ExprLit, Lit};
#[derive(Default)]
pub(crate) struct FieldConfig {
pub rename: Option<String>,
pub skip: bool,
pub default: bool,
pub flatten: bool,
}
#[derive(Default)]
pub(crate) struct StructConfig {
pub type_name: Option<String>,
pub rename_all: Option<String>,
}
pub(crate) fn parse_field_config(attrs: &[Attribute]) -> FieldConfig {
let mut config = FieldConfig::default();
for attr in attrs {
if !attr.path().is_ident("mssql") {
continue;
}
let _ = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("rename") {
let value: Expr = meta.value()?.parse()?;
if let Expr::Lit(ExprLit {
lit: Lit::Str(lit), ..
}) = value
{
config.rename = Some(lit.value());
}
} else if meta.path.is_ident("skip") {
config.skip = true;
} else if meta.path.is_ident("default") {
config.default = true;
} else if meta.path.is_ident("flatten") {
config.flatten = true;
}
Ok(())
});
}
config
}
pub(crate) fn parse_struct_config(attrs: &[Attribute]) -> StructConfig {
let mut config = StructConfig::default();
for attr in attrs {
if !attr.path().is_ident("mssql") {
continue;
}
let _ = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("type_name") {
let value: Expr = meta.value()?.parse()?;
if let Expr::Lit(ExprLit {
lit: Lit::Str(lit), ..
}) = value
{
config.type_name = Some(lit.value());
}
} else if meta.path.is_ident("rename_all") {
let value: Expr = meta.value()?.parse()?;
if let Expr::Lit(ExprLit {
lit: Lit::Str(lit), ..
}) = value
{
config.rename_all = Some(lit.value());
}
}
Ok(())
});
}
config
}