matched_enums_macro 1.3.0

Contains the macro for matchable enums.
Documentation
extern crate alloc;

use alloc::{boxed::Box, vec::Vec};

use proc_macro2::TokenStream;
use quote::{ToTokens, TokenStreamExt};
use syn::{
    parse::{Parse, ParseStream, Result},
    Attribute, Expr, Pat, Token,
};

/// Slightly different version of [`syn::Arm`], without the fat-arrow and body.
#[derive(Debug, Clone)]
pub struct MatchArm {
    pub attrs: Vec<Attribute>,
    pub pat: Pat,
    pub guard: Option<(Token![if], Box<Expr>)>,
}

impl Parse for MatchArm {
    fn parse(input: ParseStream) -> Result<Self> {
        Ok(Self {
            attrs: input.call(Attribute::parse_outer)?,
            pat: Pat::parse_multi_with_leading_vert(input)?,
            guard: {
                if input.peek(Token![if]) {
                    let if_token: Token![if] = input.parse()?;
                    let guard: Expr = input.parse()?;
                    Some((if_token, Box::new(guard)))
                } else {
                    None
                }
            },
        })
    }
}

impl ToTokens for MatchArm {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        tokens.append_all(&self.attrs);
        self.pat.to_tokens(tokens);
        if let Some((if_token, guard)) = &self.guard {
            if_token.to_tokens(tokens);
            guard.to_tokens(tokens);
        }
    }
}