serde_derive/
lib.rs

1//! This crate provides Serde's two derive macros.
2//!
3//! ```edition2018
4//! # use serde_derive::{Serialize, Deserialize};
5//! #
6//! #[derive(Serialize, Deserialize)]
7//! # struct S;
8//! #
9//! # fn main() {}
10//! ```
11//!
12//! Please refer to [https://serde.rs/derive.html] for how to set this up.
13//!
14//! [https://serde.rs/derive.html]: https://serde.rs/derive.html
15
16#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.103")]
17#![allow(unknown_lints, bare_trait_objects)]
18#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
19#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
20// Ignored clippy lints
21#![cfg_attr(
22    feature = "cargo-clippy",
23    allow(
24        cognitive_complexity,
25        enum_variant_names,
26        needless_pass_by_value,
27        redundant_field_names,
28        too_many_arguments,
29        trivially_copy_pass_by_ref,
30        used_underscore_binding,
31    )
32)]
33// Ignored clippy_pedantic lints
34#![cfg_attr(
35    feature = "cargo-clippy",
36    allow(
37        cast_possible_truncation,
38        checked_conversions,
39        doc_markdown,
40        enum_glob_use,
41        filter_map,
42        indexing_slicing,
43        items_after_statements,
44        match_same_arms,
45        module_name_repetitions,
46        must_use_candidate,
47        similar_names,
48        single_match_else,
49        too_many_lines,
50        unseparated_literal_suffix,
51        use_self,
52    )
53)]
54// The `quote!` macro requires deep recursion.
55#![recursion_limit = "512"]
56
57#[macro_use]
58extern crate quote;
59#[macro_use]
60extern crate syn;
61
62extern crate proc_macro;
63extern crate proc_macro2;
64
65mod internals;
66
67use proc_macro::TokenStream;
68use syn::DeriveInput;
69
70#[macro_use]
71mod bound;
72#[macro_use]
73mod fragment;
74
75mod de;
76mod dummy;
77mod pretend;
78mod ser;
79mod try;
80
81#[proc_macro_derive(Serialize, attributes(serde))]
82pub fn derive_serialize(input: TokenStream) -> TokenStream {
83    let input = parse_macro_input!(input as DeriveInput);
84    ser::expand_derive_serialize(&input)
85        .unwrap_or_else(to_compile_errors)
86        .into()
87}
88
89#[proc_macro_derive(Deserialize, attributes(serde))]
90pub fn derive_deserialize(input: TokenStream) -> TokenStream {
91    let input = parse_macro_input!(input as DeriveInput);
92    de::expand_derive_deserialize(&input)
93        .unwrap_or_else(to_compile_errors)
94        .into()
95}
96
97fn to_compile_errors(errors: Vec<syn::Error>) -> proc_macro2::TokenStream {
98    let compile_errors = errors.iter().map(syn::Error::to_compile_error);
99    quote!(#(#compile_errors)*)
100}