enum_group/
lib.rs

1// @author:    olinex
2// @time:      2022/07/18
3
4
5extern crate proc_macro;
6
7// self mods
8mod context;
9
10// use other mods
11use proc_macro::TokenStream;
12use syn::{parse_macro_input, DeriveInput};
13
14// use self mods
15use 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}