warrant 0.2.0

A Swift-guard-like macro for Rust
Documentation
use proc_macro::TokenStream;
use quote::quote;
use syn::{
    Block, Expr, Token,
    parse::{ParseStream, Result},
};

fn parse_warrant(input: ParseStream) -> Result<(Expr, Block)> {
    let condition = input.parse()?;
    input.parse::<Token![,]>()?;
    input.parse::<Token![else]>()?;
    let else_block: Block = input.parse()?;
    Ok((condition, else_block))
}

#[proc_macro]
pub fn warrant(input: TokenStream) -> TokenStream {
    let (condition, else_block) = syn::parse_macro_input!(input with parse_warrant);

    let expanded = quote! {
        if #condition {
            // The pattern matched, so we do nothing.
        } else {
            #else_block
        }
    };

    TokenStream::from(expanded)
}

#[proc_macro]
pub fn guard(input: TokenStream) -> TokenStream {
    warrant(input)
}