1#![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#![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#![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#![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}