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)
}
}