auto_enum/
lib.rs

1//! Provides automatic enum implementations that are convenient for working with FFI
2//! 
3//! ```
4//! #[macro_use]
5//! extern crate auto_enum;
6//! extern crate checked_enum;
7//! 
8//! #[auto_enum(u32, checked)]
9//! pub enum SweepDirection {
10//!     CounterClockwise = 0,
11//!     Clockwise = 1,
12//! }
13//! 
14//! # fn main() {
15//! assert_eq!(SweepDirection::from_u32(0), Some(SweepDirection::CounterClockwise));
16//! # }
17//! ```
18//! 
19//! ```
20//! #[macro_use]
21//! extern crate auto_enum;
22//! 
23//! #[enum_flags(u32)]
24//! pub enum BitmapOptions {
25//!     TARGET = 0x1,
26//!     CANNOT_DRAW = 0x2,
27//!     CPU_READ = 0x4,
28//!     GDI_COMPATIBLE = 0x8,
29//! }
30//! 
31//! # fn main() {
32//! let flags = BitmapOptions::TARGET | BitmapOptions::GDI_COMPATIBLE;
33//! assert!(flags.is_set(BitmapOptions::TARGET));
34//! assert!(!flags.is_set(BitmapOptions::CPU_READ));
35//! # }
36//! ```
37
38#![recursion_limit = "1024"]
39
40#[macro_use]
41extern crate quote;
42#[macro_use]
43extern crate syn;
44
45extern crate proc_macro;
46extern crate proc_macro2;
47
48use proc_macro::TokenStream;
49use syn::{AttributeArgs, Item};
50
51mod common;
52mod enum_flags;
53mod int_enums;
54mod int_eval;
55
56#[proc_macro_attribute]
57pub fn auto_enum(attr: TokenStream, item: TokenStream) -> TokenStream {
58    let args = parse_macro_input!(attr as AttributeArgs);
59    let input = parse_macro_input!(item as Item);
60    int_enums::expand_int_enum(&args, &input)
61        .unwrap_or_else(compile_error)
62        .into()
63}
64
65#[proc_macro_attribute]
66pub fn enum_flags(attr: TokenStream, item: TokenStream) -> TokenStream {
67    let args = parse_macro_input!(attr as AttributeArgs);
68    let input = parse_macro_input!(item as Item);
69    enum_flags::expand_enum_flags(&args, &input)
70        .unwrap_or_else(compile_error)
71        .into()
72}
73
74fn compile_error(message: String) -> proc_macro2::TokenStream {
75    quote! {
76        compile_error!(#message);
77    }
78}