1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
pub mod macros;

use std::borrow::Borrow;

use crate::parser::search::Search;

#[derive(Debug, Clone, Copy)]
pub enum MatcherSingle<'a, T: ?Sized, I> {
    Ident(&'a T),
    Item(I),
}

impl<'a, T: ?Sized + Search> MatcherSingle<'a, T, T::Item> {
    pub fn ident(ident: &'a impl Borrow<T>) -> Self {
        MatcherSingle::Ident(ident.borrow())
    }
    pub fn item(item: T::Item) -> Self {
        MatcherSingle::Item(item)
    }
}

#[derive(Debug, Clone, Copy)]
pub enum Matcher<'a, T: ?Sized, I> {
    Single(MatcherSingle<'a, T, I>),
    List(&'a [MatcherSingle<'a, T, I>]),
}

impl<'a, T: ?Sized + Search> Matcher<'a, T, T::Item> {
    pub fn ident(ident: &'a impl Borrow<T>) -> Self {
        Matcher::Single(MatcherSingle::Ident(ident.borrow()))
    }
    pub fn item(item: T::Item) -> Self {
        Matcher::Single(MatcherSingle::Item(item))
    }
    pub fn list(list: &'a impl Borrow<[MatcherSingle<'a, T, T::Item>]>) -> Self {
        Matcher::List(list.borrow())
    }
}

impl<'a, T: ?Sized + Search> From<MatcherSingle<'a, T, T::Item>> for Matcher<'a, T, T::Item> {
    fn from(value: MatcherSingle<'a, T, T::Item>) -> Self {
        Matcher::Single(value)
    }
}

impl<'a, T: ?Sized + Search> From<&'a [MatcherSingle<'_, T, T::Item>]> for Matcher<'a, T, T::Item> {
    fn from(value: &'a [MatcherSingle<T, T::Item>]) -> Self {
        Matcher::List(value)
    }
}