matched_enums 1.3.0

A macro that provides the option to bin enum attribute to match-statements. This makes it easier to convert values into enums.
Documentation
use rstest::rstest;

use crate::{match_never, match_when, Matched, UnmatchedError};

#[derive(Matched, Debug, PartialEq, Eq)]
#[matched_enum(value_type=i32, allow_runtime_configurable=true)]
enum Signature {
    #[matches(1..)]
    Positive,

    // NOTE: `..=` is not allowed, as the [`matches!`] does not support it :(
    #[matches(..0)]
    Negative,

    #[matches(0..1)]
    Zero,
}

#[rstest]
#[case(0, Ok(Signature::Zero))]
#[case(1, Ok(Signature::Positive))]
#[case(i32::MAX, Ok(Signature::Positive))]
#[case(-1, Ok(Signature::Negative))]
#[case(i32::MIN, Ok(Signature::Negative))]
fn get_enum_from_default_matcher(
    #[case] input: i32,
    #[case] expected: Result<Signature, UnmatchedError>,
) {
    let matcher = SignatureMatcher::<i32>::default();

    assert_eq!(matcher.try_into_enum(&input), expected);
}

#[rstest]
#[case(0, Ok(Signature::Zero))]
#[case(1, Err(UnmatchedError{}))]
#[case(i32::MAX, Err(UnmatchedError{}))]
#[case(-1, Ok(Signature::Negative))]
#[case(i32::MIN, Ok(Signature::Negative))]
fn get_enum_with_unmatched_path(
    #[case] input: i32,
    #[case] expected: Result<Signature, UnmatchedError>,
) {
    let matcher = SignatureMatcher::<i32> {
        positive: match_never(),
        ..Default::default()
    };

    assert_eq!(matcher.try_into_enum(&input), expected);
}

#[rstest]
#[case(0, Ok(Signature::Positive))]
#[case(1, Ok(Signature::Positive))]
#[case(i32::MAX, Ok(Signature::Positive))]
#[case(-1, Ok(Signature::Positive))]
#[case(i32::MIN, Ok(Signature::Positive))]
fn get_enum_with_early_wild_card(
    #[case] input: i32,
    #[case] expected: Result<Signature, UnmatchedError>,
) {
    let matcher = SignatureMatcher::<i32> {
        positive: match_when!(_),
        ..Default::default()
    };

    assert_eq!(matcher.try_into_enum(&input), expected);
}