1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
//! Procedural macros for `rkyv`. #![deny(broken_intra_doc_links)] #![deny(missing_docs)] #![deny(missing_crate_level_docs)] mod archive; mod attributes; mod deserialize; mod repr; mod serialize; mod util; mod with; extern crate proc_macro; use syn::{parse_macro_input, DeriveInput}; /// Derives `Archive` for the labeled type. /// /// # Attributes /// /// Additional arguments can be specified using the `#[archive(...)]` and `#[archive_attr(...)]` /// attributes. /// /// `#[archive(...)]` takes the following arguments: /// /// - `name`, `name = "..."`: Exposes the archived type with the given name. If used without a name /// assignment, uses the name `"Archived" + name`. /// - `repr(...)`: Sets the representation for the archived type to the given representation. /// Available representation options may vary depending on features and type layout. /// - `compare(...)`: Implements common comparison operators between the original and archived /// types. Supported comparisons are `PartialEq` and `PartialOrd` (i.e. /// `#[archive(compare(PartialEq, PartialOrd))]`). /// - `bound(...)`: Adds additional bounds to the `Serialize` and `Deserialize` implementations. /// This can be especially useful when dealing with recursive structures, where bounds may need to /// be omitted to prevent recursive type definitions. /// /// `#[archive_attr(...)]` adds the attributes passed as arguments as attributes to the generated /// type. This is commonly used with attributes like `derive(...)` to derive trait implementations /// for the archived type. /// /// # Recursive types /// /// This derive macro automatically adds a type bound `field: Archive` for each field type. This can /// cause an overflow while evaluating trait bounds if the structure eventually references its own /// type, as the implementation of `Archive` for a struct depends on each field type implementing it /// as well. Adding the attribute `#[omit_bounds]` to a field will suppress this trait bound and /// allow recursive structures. This may be too coarse for some types, in which case additional type /// bounds may be required with `bound(...)`. #[proc_macro_derive(Archive, attributes(archive, archive_attr, omit_bounds, with))] pub fn derive_archive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { match archive::derive(parse_macro_input!(input as DeriveInput)) { Ok(result) => result.into(), Err(e) => e.to_compile_error().into(), } } /// Derives `Serialize` for the labeled type. /// /// This macro also supports the `#[archive]` and `#[omit_bounds]` attributes. See [`Archive`] for /// more information. #[proc_macro_derive(Serialize, attributes(archive, omit_bounds, with))] pub fn derive_serialize(input: proc_macro::TokenStream) -> proc_macro::TokenStream { match serialize::derive(parse_macro_input!(input as DeriveInput)) { Ok(result) => result.into(), Err(e) => e.to_compile_error().into(), } } /// Derives `Deserialize` for the labeled type. /// /// This macro also supports the `#[archive]` and `#[omit_bounds]` attributes. See [`Archive`] for /// more information. #[proc_macro_derive(Deserialize, attributes(archive, omit_bounds, with))] pub fn derive_deserialize(input: proc_macro::TokenStream) -> proc_macro::TokenStream { match deserialize::derive(parse_macro_input!(input as DeriveInput)) { Ok(result) => result.into(), Err(e) => e.to_compile_error().into(), } }