Skip to main content

kutil_std_macros/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![warn(missing_docs)]
3#![doc = include_str!(concat!("../", std::env!("CARGO_PKG_README")))]
4// See: https://stackoverflow.com/a/61417700
5// See: https://github.com/rust-lang/cargo/pull/11645#issuecomment-1536905941
6
7mod attributes;
8mod derive_display;
9mod derive_from_str;
10
11// See: https://petanode.com/posts/rust-proc-macro/
12
13/// Procedural macro for `#[derive(Display)]`.
14#[proc_macro_derive(Display, attributes(display, strings))]
15pub fn derive_display(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
16    let mut input: syn::DeriveInput = syn::parse_macro_input!(input);
17
18    match input.data {
19        syn::Data::Enum(_) => derive_display::Generator::generate(&mut input),
20
21        _ => Err(syn::Error::new(input.ident.span(), "`Display`: not an enum")),
22    }
23    .unwrap_or_else(|e| e.to_compile_error())
24    .into()
25}
26
27/// Procedural macro for `#[derive(FromStr)]`.
28#[proc_macro_derive(FromStr, attributes(from_str, strings))]
29pub fn derive_from_str(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
30    let mut input: syn::DeriveInput = syn::parse_macro_input!(input);
31
32    match input.data {
33        syn::Data::Enum(_) => derive_from_str::Generator::generate(&mut input),
34
35        _ => Err(syn::Error::new(input.ident.span(), "`FromStr`: not an enum")),
36    }
37    .unwrap_or_else(|e| e.to_compile_error())
38    .into()
39}