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.123")]
17 #![allow(unknown_lints, bare_trait_objects)]
18 #![deny(clippy::all, clippy::pedantic)]
19 // Ignored clippy lints
20 #![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 bug: https://github.com/rust-lang/rust-clippy/issues/5704
30 clippy::unnested_or_patterns,
31 )]
32 // Ignored clippy_pedantic lints
33 #![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::unused_self,
52 clippy::use_self,
53 clippy::wildcard_imports
54 )]
55
56 #[macro_use]
57 extern crate quote;
58 #[macro_use]
59 extern crate syn;
60
61 extern crate proc_macro;
62 extern crate proc_macro2;
63
64 mod internals;
65
66 use proc_macro::TokenStream;
67 use syn::DeriveInput;
68
69 #[macro_use]
70 mod bound;
71 #[macro_use]
72 mod fragment;
73
74 mod de;
75 mod dummy;
76 mod pretend;
77 mod ser;
78 mod try;
79
80 #[proc_macro_derive(Serialize, attributes(serde))]
derive_serialize(input: TokenStream) -> TokenStream81 pub fn derive_serialize(input: TokenStream) -> TokenStream {
82 let mut input = parse_macro_input!(input as DeriveInput);
83 ser::expand_derive_serialize(&mut input)
84 .unwrap_or_else(to_compile_errors)
85 .into()
86 }
87
88 #[proc_macro_derive(Deserialize, attributes(serde))]
derive_deserialize(input: TokenStream) -> TokenStream89 pub fn derive_deserialize(input: TokenStream) -> TokenStream {
90 let mut input = parse_macro_input!(input as DeriveInput);
91 de::expand_derive_deserialize(&mut input)
92 .unwrap_or_else(to_compile_errors)
93 .into()
94 }
95
to_compile_errors(errors: Vec<syn::Error>) -> proc_macro2::TokenStream96 fn to_compile_errors(errors: Vec<syn::Error>) -> proc_macro2::TokenStream {
97 let compile_errors = errors.iter().map(syn::Error::to_compile_error);
98 quote!(#(#compile_errors)*)
99 }
100