1extern crate proc_macro;
6
7mod context;
9
10use proc_macro::TokenStream;
12use syn::{parse_macro_input, DeriveInput};
13
14use context::EnumGroupContext;
16
17#[proc_macro_derive(EnumGroup, attributes(groups))]
18pub fn derive_enum_group(input: TokenStream) -> TokenStream {
19 let input = parse_macro_input!(input as DeriveInput);
20 let ctx = match EnumGroupContext::new(&input) {
21 Ok(ctx) => ctx,
22 Err(e) => return e.to_compile_error().into(),
23 };
24 match ctx.generate() {
25 Ok(stream) => stream.into(),
26 Err(e) => e.to_compile_error().into(),
27 }
28}
29
30#[cfg(doctest)]
31mod test_readme {
32 macro_rules! external_doc_test {
33 ($x:expr) => {
34 #[doc = $x]
35 extern {}
36 };
37 }
38
39 external_doc_test!(include_str!("../README.md"));
40}