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}