test_try_macros/
lib.rs

1//! test-try.
2
3use proc_macro::TokenStream;
4
5/// Alternative to the `#[test]` macro.
6///
7/// - Use `?` to return errors without specifying a return type or ending the test with `Ok(())`.
8/// - On error, the test prints out a report including the chain of source errors.
9#[proc_macro_attribute]
10pub fn test_try(_attrs: TokenStream, item: TokenStream) -> TokenStream {
11    let input_fn = syn::parse_macro_input!(item as syn::ItemFn);
12
13    let attrs = input_fn.attrs;
14    let vis = input_fn.vis;
15    let sig = input_fn.sig;
16    let block = input_fn.block;
17    let stmts = block.stmts;
18
19    assert!(matches!(sig.output, syn::ReturnType::Default), "Don't specify a return type");
20
21    let expanded = quote::quote! {
22        #(#attrs)*
23        #[test]
24        #vis #sig -> ::std::result::Result<(), ::test_try::report::Report> {
25            #(#stmts)*
26            Ok(())
27        }
28    };
29
30    TokenStream::from(expanded)
31}