1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! Enum Serialization with Tag
//!
//! ```diff
//! # serde_yaml -- every variant starts with a !Tag
//! enser:
//! -- Tbd
//! -- None
//! +- !Tbd null
//! +- !None null
//! - !Some 123
//! - !Named
//! value: 456
//!
//! # serde_json -- every variant is an object
//! {
//! "enser": [
//! - "Tbd",
//! - "None",
//! + { "Tbd": null },
//! + { "None": null },
//! { "Some": 123 },
//! { "Named": { "value": 456 } }
//! ]
//! }
//! ```
//!
//!
//! ## Usage
//!
//! Add the following to `Cargo.toml`
//!
//! ```toml
//! enser = "0.1.4"
//! ```
//!
//! ```rust
//! # use serde::{Deserialize, Serialize};
//! #
//! #[enser::enser] // <-- just add this
//! // Note: It *must* come above `#[derive(Clone, Deserialize, Serialize)]`
//! #[derive(Clone, Debug, Deserialize, Serialize)]
//! enum MyEnum {
//! Tbd,
//! None,
//! Some(u32),
//! Named { value: u32 },
//! }
//! # fn main() {}
//! ```
//!
//!
//! ## Generics
//!
//! This will automatically work for generic types:
//!
//! ```rust
//! # use serde::{Deserialize, Serialize};
//! #
//! #[enser::enser]
//! #[derive(Clone, Debug, Deserialize, Serialize)]
//! enum MyEnum<T, U> {
//! None,
//! Some(T),
//! Named { value: U },
//! }
//! # fn main() {}
//! ```
//!
//! **However**, it also adds a `Clone` bound to each type parameter, so all
//! `impl` blocks will require the type parameters to have a `Clone` bound.
//!
//! If you can find a way for the `generics` example to work without causing the
//! `Clone` bound propagation, then please let me know / submit a pull request!
pub use enser;