• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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