xmlity_derive/
lib.rs

1//! # XMLity Derive
2//!
3//! This crate contains the proc-macros for XMLity, specifically the derive macros for [`Serialize`], [`SerializeAttribute`], [`Deserialize`], [`SerializationGroup`], and [`DeserializationGroup`].
4//!
5//! Each of these macros has its own documentation, which can be found by following the links above.
6//!
7//! The attributes used by these macros are made to be compatible with their counterparts:
8//! - [`Serialize`] and [`SerializeAttribute`] use the same attributes with the same options as [`Deserialize`].
9//! - [`SerializationGroup`] use the same attributes with the same options as [`DeserializationGroup`].
10//!
11//! There are some attributes only used by either serialization or deserialization. These are highlighted in the documentation for each macro.
12//!
13//! ## Example
14//! ```ignore
15//! use xmlity_derive::{Deserialize, Serialize};
16//!
17//! #[derive(Serialize, Deserialize)]
18//! #[xelement(name = "name")]
19//! struct Name(String);
20//!
21//! #[derive(Serialize, Deserialize)]
22//! #[xelement(name = "age")]
23//! struct Age(u8);
24//!
25//! #[derive(Serialize, Deserialize)]
26//! #[xelement(name = "person")]
27//! struct Person {
28//!     name: Name,
29//!     age: Age,
30//! }
31//! ```
32//!
33//! The derive macros are re-exported by the `xmlity` crate in the `derive` feature, so you can use them directly from there without referring to [`xmlity_derive`].
34
35#[cfg(doctest)]
36#[doc = include_str!("../README.md")]
37struct _ReadMeDocTests;
38
39pub(crate) mod common;
40mod de;
41mod derive;
42mod options;
43mod ser;
44mod utils;
45
46use de::{DeriveDeserializationGroup, DeriveDeserialize};
47use derive::{DeriveError, DeriveMacro, DeriveMacroExt, DeriveResult};
48use ser::{DeriveSerializationGroup, DeriveSerialize, DeriveSerializeAttribute};
49
50#[doc = include_str!("./ser/Serialize.md")]
51#[proc_macro_derive(Serialize, attributes(xelement, xattribute, xgroup, xvalue))]
52pub fn derive_serialize_fn(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
53    DeriveSerialize::derive(item)
54}
55
56#[doc = include_str!("./ser/SerializeAttribute.md")]
57#[proc_macro_derive(SerializeAttribute, attributes(xattribute))]
58pub fn derive_serialize_attribute_fn(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
59    DeriveSerializeAttribute::derive(item)
60}
61
62#[doc = include_str!("./de/Deserialize.md")]
63#[proc_macro_derive(Deserialize, attributes(xelement, xattribute, xgroup, xvalue))]
64pub fn derive_deserialize_fn(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
65    DeriveDeserialize::derive(item)
66}
67
68#[doc = include_str!("./ser/SerializationGroup.md")]
69#[proc_macro_derive(SerializationGroup, attributes(xelement, xattribute, xgroup, xvalue))]
70pub fn derive_serialization_group_attribute_fn(
71    item: proc_macro::TokenStream,
72) -> proc_macro::TokenStream {
73    DeriveSerializationGroup::derive(item)
74}
75
76#[doc = include_str!("./de/DeserializationGroup.md")]
77#[proc_macro_derive(DeserializationGroup, attributes(xelement, xattribute, xgroup, xvalue))]
78pub fn derive_deserialization_group_fn(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
79    DeriveDeserializationGroup::derive(item)
80}