ytil_macros/lib.rs
1//! Proc-macro companion for `ytil_sys`.
2//!
3//! If [`try_trait_v2`](https://github.com/rust-lang/rust/issues/84277) stabilises, this crate
4//! could be replaced by a `CliResult` newtype implementing `Termination` + `FromResidual`.
5
6use proc_macro::TokenStream;
7use quote::quote;
8use syn::parse_macro_input;
9
10/// Wraps `fn main() -> rootcause::Result<()>` into `ytil_sys::run` so errors print in bold red.
11#[proc_macro_attribute]
12pub fn main(_attr: TokenStream, item: TokenStream) -> TokenStream {
13 let input_fn = parse_macro_input!(item as syn::ItemFn);
14 let body = &input_fn.block;
15 let attrs: Vec<_> = input_fn.attrs.iter().collect();
16
17 let output = quote! {
18 #(#attrs)*
19 fn main() {
20 ytil_sys::run(|| #body);
21 }
22 };
23
24 output.into()
25}