delve_derive/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
2//! This crate provides `delve`'s macros.
3//!
4//! Refer to [`delve`](https://docs.rs/delve) for how to use them.
5//!
6
7mod 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}