1#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
2mod attributes;
8mod cases;
9mod macros;
10mod utils;
11
12use attributes::container::EnumAttribute;
13use deluxe::ParseAttributes;
14use syn::DeriveInput;
15
16use macros::{
17 display::inner_display, from_str::inner_from_str, has_variant::inner_has_variant,
18 modify_variant::inner_modify_variant, to_str::inner_to_str, variant_count::inner_variant_count,
19 variant_fields::inner_variant_fields, variant_names::inner_variant_names,
20 variant_tuples::inner_variant_tuples,
21};
22use utils::unwrap_attrs;
23
24#[proc_macro_derive(EnumVariantCount)]
25pub fn variant_count(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
26 let ast = syn::parse_macro_input!(input as DeriveInput);
27
28 let out = inner_variant_count(&ast).unwrap_or_else(|err| err.to_compile_error());
29
30 out.into()
31}
32
33#[proc_macro_derive(EnumVariantNames, attributes(delve))]
34pub fn variant_names(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
35 let ast = syn::parse_macro_input!(input as DeriveInput);
36
37 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
38
39 let out = inner_variant_names(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
40
41 out.into()
42}
43
44#[proc_macro_derive(EnumFromStr, attributes(delve))]
45pub fn from_str(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
46 let ast = syn::parse_macro_input!(input as DeriveInput);
47
48 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
49
50 let out = inner_from_str(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
51
52 out.into()
53}
54
55#[proc_macro_derive(EnumFields, attributes(delve))]
56pub fn variant_fields(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
57 let ast = syn::parse_macro_input!(input as DeriveInput);
58
59 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
60
61 let out = inner_variant_fields(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
62
63 out.into()
64}
65
66#[proc_macro_derive(EnumTuples)]
67pub fn variant_tuples(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
68 let ast = syn::parse_macro_input!(input as DeriveInput);
69
70 let out = inner_variant_tuples(&ast).unwrap_or_else(|err| err.to_compile_error());
71
72 out.into()
73}
74
75#[proc_macro_derive(EnumModify, attributes(delve))]
76pub fn modify_variant(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
77 let ast = syn::parse_macro_input!(input as DeriveInput);
78
79 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
80
81 let out = inner_modify_variant(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
82
83 out.into()
84}
85
86#[proc_macro_derive(EnumToStr, attributes(delve))]
87pub fn to_str(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
88 let ast = syn::parse_macro_input!(input as DeriveInput);
89
90 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
91
92 let out = inner_to_str(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
93
94 out.into()
95}
96
97#[proc_macro_derive(EnumDisplay, attributes(delve))]
98pub fn display(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
99 let ast = syn::parse_macro_input!(input as DeriveInput);
100
101 let attrs = unwrap_attrs!(EnumAttribute::parse_attributes(&ast.attrs));
102
103 let out = inner_display(&ast, attrs).unwrap_or_else(|err| err.to_compile_error());
104
105 out.into()
106}
107
108#[proc_macro_derive(EnumHasVariant)]
109pub fn has_variant(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
110 let ast = syn::parse_macro_input!(input as DeriveInput);
111
112 let out = inner_has_variant(&ast).unwrap_or_else(|err| err.to_compile_error());
113
114 out.into()
115}