1#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.119")]
17#![allow(unknown_lints, bare_trait_objects)]
18#![deny(clippy::all, clippy::pedantic)]
19#![allow(
21 clippy::cognitive_complexity,
22 clippy::enum_variant_names,
23 clippy::match_like_matches_macro,
24 clippy::needless_pass_by_value,
25 clippy::too_many_arguments,
26 clippy::trivially_copy_pass_by_ref,
27 clippy::used_underscore_binding,
28 clippy::wildcard_in_or_patterns,
29 clippy::unnested_or_patterns,
31)]
32#![allow(
34 clippy::cast_possible_truncation,
35 clippy::checked_conversions,
36 clippy::doc_markdown,
37 clippy::enum_glob_use,
38 clippy::filter_map,
39 clippy::indexing_slicing,
40 clippy::items_after_statements,
41 clippy::map_err_ignore,
42 clippy::match_same_arms,
43 clippy::module_name_repetitions,
44 clippy::must_use_candidate,
45 clippy::option_if_let_else,
46 clippy::similar_names,
47 clippy::single_match_else,
48 clippy::struct_excessive_bools,
49 clippy::too_many_lines,
50 clippy::unseparated_literal_suffix,
51 clippy::use_self,
52 clippy::wildcard_imports
53)]
54
55#[macro_use]
56extern crate quote;
57#[macro_use]
58extern crate syn;
59
60extern crate proc_macro;
61extern crate proc_macro2;
62
63mod internals;
64
65use proc_macro::TokenStream;
66use syn::DeriveInput;
67
68#[macro_use]
69mod bound;
70#[macro_use]
71mod fragment;
72
73mod de;
74mod dummy;
75mod pretend;
76mod ser;
77mod try;
78
79#[proc_macro_derive(Serialize, attributes(serde))]
80pub fn derive_serialize(input: TokenStream) -> TokenStream {
81 let input = parse_macro_input!(input as DeriveInput);
82 ser::expand_derive_serialize(&input)
83 .unwrap_or_else(to_compile_errors)
84 .into()
85}
86
87#[proc_macro_derive(Deserialize, attributes(serde))]
88pub fn derive_deserialize(input: TokenStream) -> TokenStream {
89 let input = parse_macro_input!(input as DeriveInput);
90 de::expand_derive_deserialize(&input)
91 .unwrap_or_else(to_compile_errors)
92 .into()
93}
94
95fn to_compile_errors(errors: Vec<syn::Error>) -> proc_macro2::TokenStream {
96 let compile_errors = errors.iter().map(syn::Error::to_compile_error);
97 quote!(#(#compile_errors)*)
98}