Skip to main content

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}