use crate::attributes::FieldDefault;
use crate::case::RenameRule;
use darling::FromMeta;
use proc_macro2::Span;
use syn::Expr;
#[derive(Debug, FromMeta, PartialEq, Clone, Copy)]
pub enum Repr {
Enum,
BareUnion,
UnionOfRecords,
RecordTagContent,
RecordInternallyTagged,
}
#[derive(darling::FromAttributes)]
#[darling(attributes(avro))]
pub struct ContainerAttributes {
#[darling(default)]
pub name: Option<String>,
#[darling(default)]
pub namespace: Option<String>,
#[darling(default)]
pub doc: Option<String>,
#[darling(multiple)]
pub alias: Vec<String>,
#[darling(default)]
pub rename_all: RenameRule,
#[darling(default)]
pub default: Option<String>,
#[darling(default)]
pub repr: Option<Repr>,
}
impl ContainerAttributes {
pub fn deprecated(&self, span: Span) {
if self.name.is_some() {
super::warn(
span,
r#"`#[avro(name = "...")]` is deprecated."#,
r#"Use `#[serde(rename = "...")]` instead."#,
);
}
if self.rename_all != RenameRule::None {
super::warn(
span,
r#"`#[avro(rename_all = "..")]` is deprecated"#,
r#"Use `#[serde(rename_all = "..")]` instead"#,
);
}
}
}
#[derive(Debug, PartialEq, Default)]
pub enum With {
#[default]
Trait,
Serde,
Expr(Expr),
}
impl FromMeta for With {
fn from_word() -> darling::Result<Self> {
Ok(Self::Serde)
}
fn from_expr(expr: &Expr) -> darling::Result<Self> {
Ok(Self::Expr(expr.clone()))
}
}
#[derive(darling::FromAttributes)]
#[darling(attributes(avro))]
pub struct VariantAttributes {
#[darling(default)]
pub rename: Option<String>,
#[darling(default)]
pub with: With,
#[darling(default)]
pub doc: Option<String>,
}
impl VariantAttributes {
pub fn deprecated(&self, span: Span) {
if self.rename.is_some() {
super::warn(
span,
r#"`#[avro(rename = "..")]` is deprecated"#,
r#"Use `#[serde(rename = "..")]` instead"#,
);
}
}
}
#[derive(darling::FromAttributes)]
#[darling(attributes(avro))]
pub struct FieldAttributes {
#[darling(default)]
pub doc: Option<String>,
#[darling(default)]
pub default: FieldDefault,
#[darling(multiple)]
pub alias: Vec<String>,
#[darling(default)]
pub rename: Option<String>,
#[darling(default)]
pub skip: bool,
#[darling(default)]
pub flatten: bool,
#[darling(default)]
pub with: With,
}
impl FieldAttributes {
pub fn deprecated(&self, span: Span) {
if !self.alias.is_empty() {
super::warn(
span,
r#"`#[avro(alias = "..")]` is deprecated"#,
r#"Use `#[serde(alias = "..")]` instead"#,
);
}
if self.rename.is_some() {
super::warn(
span,
r#"`#[avro(rename = "..")]` is deprecated"#,
r#"Use `#[serde(rename = "..")]` instead"#,
);
}
if self.skip {
super::warn(
span,
"`#[avro(skip)]` is deprecated",
"Use `#[serde(skip)]` instead",
);
}
if self.flatten {
super::warn(
span,
"`#[avro(flatten)]` is deprecated",
"Use `#[serde(flatten)]` instead",
);
}
}
}