Files
continuwuity/src/macros/mod.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

67 lines
1.9 KiB
Rust
Raw Normal View History

2024-07-24 00:14:03 +00:00
mod admin;
mod build_info;
2024-09-08 22:17:02 +00:00
mod config;
2024-07-25 01:41:31 +00:00
mod debug;
2024-07-26 06:41:26 +00:00
mod implement;
2024-07-26 06:13:30 +00:00
mod refutable;
2024-07-24 03:55:01 +00:00
mod utils;
2024-07-24 00:14:03 +00:00
use proc_macro::TokenStream;
2024-07-26 20:40:07 +00:00
use syn::{
Error, Item, ItemEnum, ItemFn, ItemStruct, Meta,
2024-07-26 20:40:07 +00:00
parse::{Parse, Parser},
parse_macro_input,
2024-07-26 20:40:07 +00:00
};
pub(crate) type Result<T> = std::result::Result<T, Error>;
2024-07-24 00:14:03 +00:00
2024-07-27 00:11:41 +00:00
#[proc_macro_attribute]
pub fn admin_command(args: TokenStream, input: TokenStream) -> TokenStream {
attribute_macro::<ItemFn, _>(args, input, admin::command)
}
2024-07-24 00:14:03 +00:00
#[proc_macro_attribute]
pub fn admin_command_dispatch(args: TokenStream, input: TokenStream) -> TokenStream {
2024-07-26 20:40:07 +00:00
attribute_macro::<ItemEnum, _>(args, input, admin::command_dispatch)
2024-07-24 00:14:03 +00:00
}
2024-07-24 09:10:01 +00:00
2024-07-25 01:41:31 +00:00
#[proc_macro_attribute]
2024-07-26 20:40:07 +00:00
pub fn recursion_depth(args: TokenStream, input: TokenStream) -> TokenStream {
attribute_macro::<Item, _>(args, input, debug::recursion_depth)
}
2024-07-25 01:41:31 +00:00
2024-07-26 06:13:30 +00:00
#[proc_macro_attribute]
2024-07-26 20:40:07 +00:00
pub fn refutable(args: TokenStream, input: TokenStream) -> TokenStream {
attribute_macro::<ItemFn, _>(args, input, refutable::refutable)
}
2024-07-26 06:41:26 +00:00
#[proc_macro_attribute]
2024-07-26 20:40:07 +00:00
pub fn implement(args: TokenStream, input: TokenStream) -> TokenStream {
attribute_macro::<ItemFn, _>(args, input, implement::implement)
}
2024-09-08 22:17:02 +00:00
#[proc_macro_attribute]
pub fn config_example_generator(args: TokenStream, input: TokenStream) -> TokenStream {
attribute_macro::<ItemStruct, _>(args, input, config::example_generator)
}
#[proc_macro]
pub fn introspect_crate(input: TokenStream) -> TokenStream {
build_info::introspect(input.into())
.unwrap_or_else(|e| e.to_compile_error())
.into()
}
2024-07-26 20:40:07 +00:00
fn attribute_macro<I, F>(args: TokenStream, input: TokenStream, func: F) -> TokenStream
where
F: Fn(I, &[Meta]) -> Result<TokenStream>,
I: Parse,
{
let item = parse_macro_input!(input as I);
syn::punctuated::Punctuated::<Meta, syn::Token![,]>::parse_terminated
.parse(args)
.map(|args| args.iter().cloned().collect::<Vec<_>>())
.and_then(|ref args| func(item, args))
.unwrap_or_else(|e| e.to_compile_error().into())
}