]>
Commit | Line | Data |
---|---|---|
3b2f2976 XL |
1 | // Copyright 2017 Serde Developers |
2 | // | |
3 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
4 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
5 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
6 | // option. This file may not be copied, modified, or distributed | |
7 | // except according to those terms. | |
8 | ||
9 | //! This crate provides Serde's two derive macros. | |
10 | //! | |
abe05a73 XL |
11 | //! ```rust |
12 | //! # #[macro_use] | |
13 | //! # extern crate serde_derive; | |
14 | //! # | |
3b2f2976 | 15 | //! #[derive(Serialize, Deserialize)] |
abe05a73 XL |
16 | //! # struct S; |
17 | //! # | |
18 | //! # fn main() {} | |
3b2f2976 XL |
19 | //! ``` |
20 | //! | |
21 | //! Please refer to [https://serde.rs/derive.html] for how to set this up. | |
22 | //! | |
23 | //! [https://serde.rs/derive.html]: https://serde.rs/derive.html | |
24 | ||
b7449926 | 25 | #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.75")] |
8faf50e0 XL |
26 | #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] |
27 | // Whitelisted clippy lints | |
83c7162d XL |
28 | #![cfg_attr( |
29 | feature = "cargo-clippy", | |
8faf50e0 | 30 | allow( |
b7449926 XL |
31 | enum_variant_names, |
32 | redundant_field_names, | |
33 | too_many_arguments, | |
34 | used_underscore_binding, | |
35 | cyclomatic_complexity, | |
36 | needless_pass_by_value | |
8faf50e0 XL |
37 | ) |
38 | )] | |
39 | // Whitelisted clippy_pedantic lints | |
40 | #![cfg_attr( | |
41 | feature = "cargo-clippy", | |
42 | allow( | |
b7449926 XL |
43 | items_after_statements, |
44 | doc_markdown, | |
45 | stutter, | |
46 | similar_names, | |
47 | use_self, | |
48 | single_match_else, | |
49 | enum_glob_use, | |
50 | match_same_arms, | |
51 | filter_map, | |
52 | cast_possible_truncation, | |
53 | indexing_slicing, | |
8faf50e0 | 54 | ) |
83c7162d | 55 | )] |
3b2f2976 | 56 | // The `quote!` macro requires deep recursion. |
0531ce1d | 57 | #![recursion_limit = "512"] |
3b2f2976 | 58 | |
3b2f2976 XL |
59 | #[macro_use] |
60 | extern crate quote; | |
0531ce1d | 61 | #[macro_use] |
ff7c6d11 | 62 | extern crate syn; |
3b2f2976 | 63 | |
3b2f2976 | 64 | extern crate proc_macro; |
0531ce1d XL |
65 | extern crate proc_macro2; |
66 | ||
8faf50e0 XL |
67 | mod internals; |
68 | ||
3b2f2976 | 69 | use proc_macro::TokenStream; |
0531ce1d | 70 | use syn::DeriveInput; |
3b2f2976 XL |
71 | |
72 | #[macro_use] | |
73 | mod bound; | |
74 | #[macro_use] | |
75 | mod fragment; | |
76 | ||
3b2f2976 | 77 | mod de; |
8faf50e0 | 78 | mod pretend; |
83c7162d | 79 | mod ser; |
8faf50e0 | 80 | mod try; |
3b2f2976 XL |
81 | |
82 | #[proc_macro_derive(Serialize, attributes(serde))] | |
83 | pub fn derive_serialize(input: TokenStream) -> TokenStream { | |
0531ce1d | 84 | let input: DeriveInput = syn::parse(input).unwrap(); |
8faf50e0 XL |
85 | ser::expand_derive_serialize(&input) |
86 | .unwrap_or_else(compile_error) | |
87 | .into() | |
3b2f2976 XL |
88 | } |
89 | ||
90 | #[proc_macro_derive(Deserialize, attributes(serde))] | |
91 | pub fn derive_deserialize(input: TokenStream) -> TokenStream { | |
0531ce1d | 92 | let input: DeriveInput = syn::parse(input).unwrap(); |
8faf50e0 XL |
93 | de::expand_derive_deserialize(&input) |
94 | .unwrap_or_else(compile_error) | |
95 | .into() | |
96 | } | |
97 | ||
98 | fn compile_error(message: String) -> proc_macro2::TokenStream { | |
99 | quote! { | |
100 | compile_error!(#message); | |
3b2f2976 XL |
101 | } |
102 | } |