jdefault_derive/lib.rs
1//! ```
2//! use jdefault_derive::Jdefault;
3//!
4//!
5//! #[derive(Debug, PartialEq, Eq, Jdefault)]
6//! pub struct StructExample<'a> {
7//! pub value1: u16,
8//! #[jd(default=18)]
9//! pub value2: u16,
10//! #[jd(default="\"jankincai\".to_string()")]
11//! pub value3: String,
12//! #[jd(default="\"jankincai\"")]
13//! pub value4: &'a str,
14//! #[jd(default=b"\x00\x01\x02")]
15//! pub value5: &'a [u8],
16//! pub body: StructExampleBody,
17//! }
18//!
19//!
20//! #[derive(Debug, PartialEq, Eq, Jdefault)]
21//! pub struct StructExampleBody {
22//! #[jd(default=1)]
23//! pub value: u16,
24//! }
25//!
26//!
27//! fn main() {
28//! let value = StructExample::default();
29//!
30//! assert_eq!(value, StructExample {
31//! value1: 0,
32//! value2: 18,
33//! value3: "jankincai".to_string(),
34//! value4: "jankincai",
35//! value5: b"\x00\x01\x02",
36//! body: StructExampleBody {
37//! value: 1,
38//! }
39//! });
40//! }
41//! ```
42//
43extern crate proc_macro;
44
45mod jdefault;
46
47use jdefault::attribute::ContainerAttributes;
48use jdefault::derive_enum;
49use jdefault::derive_struct;
50
51use proc_macro::TokenStream;
52use virtue::prelude::*;
53
54
55#[proc_macro_derive(Jdefault, attributes(jd, jbytes))]
56pub fn derive_jdefault(input: TokenStream) -> TokenStream {
57 derive_jdefault_inner(input).unwrap_or_else(|e|e.into_token_stream())
58}
59
60
61fn derive_jdefault_inner(input: TokenStream) -> Result<TokenStream> {
62 let parse = Parse::new(input)?;
63 let (mut generator, attributes, body) = parse.into_generator();
64 let attributes = attributes
65 .get_attribute::<ContainerAttributes>()?
66 .unwrap_or_default();
67
68 match body {
69 Body::Struct(body) => {
70 derive_struct::DeriveStruct {
71 fields: body.fields,
72 attributes,
73 }.generate_jdefault(&mut generator)?;
74 }
75 Body::Enum(body) => {
76 derive_enum::DeriveEnum {
77 variants: body.variants,
78 attributes,
79 }
80 .generate_jdefault(&mut generator)?;
81 }
82 }
83
84 generator.export_to_file("jdefault", "Jdefault");
85 generator.finish()
86}