宏匹配手臂图案 "no rules expected the token `if`"

Macro match arm pattern "no rules expected the token `if`"

所以我有这个宏用来匹配Box<dyn error::Error>多种错误类型

#[macro_export]
macro_rules! dynmatch {
    ($e:expr, $(type $ty:ty {$(arm $pat:pat => $result:expr),*, _ => $any:expr}),*, _ => $end:expr) => (
        $(
            if let Some(e) = $e.downcast_ref::<$ty>() {
                match e {
                    $(
                        $pat => {$result}
                    )*
                    _ => $any
                }
            } else
        )*
        {$end}
    );
}

在我尝试添加 match gaurds 之前它工作正常。当我尝试在模式中使用“if”语句时,它给我错误 no rules expected the token 'if'

let _i = match example(2) {
    Ok(i) => i,
    Err(e) => {
        dynmatch!(e,                                                            
            type ExampleError1 {                                                
                arm ExampleError1::ThisError(2) => panic!("it was 2!"),  
                _ => panic!("{}",e)                                             
            },
            type ExampleError2 {
                arm ExampleError2::ThatError(8) => panic!("it was 8!"),
                arm ExampleError2::ThatError(9..=11) => 10,
                _ => panic!("{}",e)
            }, 
            type std::io::Error {                                               
                arm i if i.kind() == std::io::ErrorKind::NotFound => panic!("not found"), //ERROR no rules expected the token `if`
                _ => panic!("{}", e)
            },
            _ => panic!("{}",e)                                                 
        )
    }
};

有什么方法可以在我的模式匹配中使用匹配守卫而不出现令牌错误吗?

当然,尽管我花了大约一个小时寻找解决方案,但在我 post 这个问题之后我找到了答案。

正确的宏如下所示:

#[macro_export]
macro_rules! dynmatch {
    ($e:expr, $(type $ty:ty {$(arm $( $pattern:pat )|+ $( if $guard: expr )? => $result:expr),*, _ => $any:expr}),*, _ => $end:expr) => (
        $(
            if let Some(e) = $e.downcast_ref::<$ty>() {
                match e {
                    $(
                        $( $pattern )|+ $( if $guard )? => {$result}
                    )*
                    _ => $any
                }
            } else
        )*
        {$end}
    );
}

归功于生锈 matches! source 第 244-251 行