irrefutable 0.1.3

Procedural macro to convert a refutable let expression to an irrefutable.
Documentation
#![feature(proc_macro_hygiene)]

use irrefutable::irrefutable;
use std::ops::Range;

#[cfg(test)]
mod panic {
    use super::*;
    use std::mem::discriminant;

    #[test]
    #[should_panic(expected = "The panic cause.")]
    fn without_args() {
        let v = None;
        #[irrefutable(panic("The panic cause."))]
        let Some("a") = v;
    }

    #[test]
    #[should_panic(expected = "The panic cause with arg: Discriminant(0).")]
    fn with_arg() {
        let v = None;
        #[irrefutable(panic("The panic cause with arg: {:?}.", discriminant(&v)))]
        let Some("a") = v;
    }

    #[test]
    #[should_panic(expected = "The panic cause with args: Discriminant(0), Discriminant(1).")]
    fn with_args() {
        let v = None;
        #[irrefutable(panic("The panic cause with args: {:?}, {:?}.", discriminant(&v), discriminant(&Some("a"))))]
        let Some("a") = v;
    }
}

#[cfg(test)]
mod r#return {
    use super::*;

    #[test]
    fn tuple_struct() {
        #[irrefutable(return)]
        let Some("a") = Some("b");
        panic!("unreachable");
    }
}

#[cfg(test)]
mod unreachable {
    use super::*;

    #[test]
    fn ident() {
        #[irrefutable(unreachable)]
        let Some((ref a, ref mut b)) = Some(("a", "b"));
        assert_eq!(*a, "a");
        *b = "c";
        assert_eq!(*b, "c");
    }

    #[test]
    fn reference() {
        #[irrefutable(unreachable)]
        let Some((&a, &mut b)) = Some((&"a", &mut "b"));
        assert_eq!(a, "a");
        assert_eq!(b, "b");
    }

    #[test]
    fn r#struct() {
        #[irrefutable(unreachable)]
        let Some(Range { start, end }) = Some(Range { start: 0, end: 9 });
        assert_eq!(start, 0);
        assert_eq!(end, 9);
    }

    #[test]
    fn tuple() {
        #[irrefutable(unreachable)]
        let Some((a, b)) = Some(("a", "b"));
        assert_eq!(a, "a");
        assert_eq!(b, "b");
    }

    #[test]
    fn tuple_struct() {
        #[irrefutable(unreachable)]
        let Some(a) = Some("a");
        assert_eq!(a, "a");
    }
}