Skip to main content

enumset_derive/
lib.rs

1#![recursion_limit = "256"]
2
3mod const_eval;
4mod gen;
5mod plan;
6
7extern crate proc_macro;
8
9use proc_macro::TokenStream;
10use std::fmt::Display;
11use syn::{parse_macro_input, DeriveInput};
12
13/// Helper function for emitting compile errors.
14fn error<T>(span: proc_macro2::Span, message: impl Display) -> syn::Result<T> {
15    Err(syn::Error::new(span, message))
16}
17
18#[proc_macro_derive(EnumSetType, attributes(enumset))]
19pub fn derive_enum_set_type(input: TokenStream) -> TokenStream {
20    let input: DeriveInput = parse_macro_input!(input);
21    derive_enum_set_type_0(input).unwrap_or_else(|e| e.to_compile_error().into())
22}
23fn derive_enum_set_type_0(input: DeriveInput) -> syn::Result<TokenStream> {
24    let plan = plan::plan_for_enum(input)?;
25    Ok(gen::generate_code(plan).into())
26}