Files
rustical/crates/xml/derive/src/attrs.rs
2024-12-31 19:07:37 +01:00

70 lines
1.5 KiB
Rust

use std::collections::HashMap;
use darling::{util::Flag, FromDeriveInput, FromField, FromMeta, FromVariant};
use syn::LitByteStr;
#[derive(Default, FromMeta, Clone)]
pub struct ContainerAttrs {
pub ns_strict: Flag,
}
#[derive(Default, FromMeta, Clone)]
pub struct TagAttrs {
pub rename: Option<LitByteStr>,
pub ns_strict: Flag,
pub ns: Option<syn::Path>,
}
#[derive(Default, FromVariant)]
#[darling(attributes(xml))]
pub struct VariantAttrs {
#[darling(flatten)]
pub common: TagAttrs,
pub other: Flag,
pub skip_deserializing: Flag,
}
#[derive(Default, FromDeriveInput, Clone)]
#[darling(attributes(xml))]
pub struct EnumAttrs {
#[darling(flatten)]
pub container: ContainerAttrs,
pub untagged: Flag,
}
#[derive(Default, FromDeriveInput, Clone)]
#[darling(attributes(xml))]
pub struct StructAttrs {
#[darling(flatten)]
pub container: ContainerAttrs,
pub root: Option<LitByteStr>,
pub ns: Option<syn::Path>,
#[darling(default)]
pub ns_prefix: HashMap<syn::Path, LitByteStr>,
pub allow_invalid: Flag,
}
#[derive(Default, FromMeta, PartialEq)]
pub enum FieldType {
#[default]
Tag,
Attr,
Text,
Untagged,
TagName,
Namespace,
}
#[derive(Default, FromField)]
#[darling(attributes(xml))]
pub struct FieldAttrs {
#[darling(flatten)]
pub common: TagAttrs,
pub flatten: Flag,
pub default: Option<syn::ExprPath>,
pub serialize_with: Option<syn::ExprPath>,
#[darling(default, rename = "ty")]
pub xml_ty: FieldType,
}