use core::ops::Deref;
use core::ops::DerefMut;
use crate::ctor;
use crate::ctor::Handler;
use crate::ctx::Match;
use crate::err::Error;
use crate::regex;
use crate::regex::Regex;
use crate::span::Span;
use super::Ctor;
use super::r2r;
use super::r2r_kv;
use super::sel;
use super::sel_kv;
#[derive(Debug, Clone, Copy)]
pub struct Array<const N: usize, T> {
inner: [T; N],
longest: bool,
}
impl<const N: usize, T> core::ops::Not for Array<N, T> {
type Output = crate::regex::Assert<Self>;
fn not(self) -> Self::Output {
crate::regex::not(self)
}
}
impl<const N: usize, T> Array<N, T> {
pub const fn new(inner: [T; N], longest: bool) -> Self {
Self { inner, longest }
}
pub const fn longest(&self) -> bool {
self.longest
}
pub fn set_longest(&mut self, longest: bool) -> &mut Self {
self.longest = longest;
self
}
pub fn with_longest(mut self, longest: bool) -> Self {
self.set_longest(longest);
self
}
}
impl<const N: usize, T> Deref for Array<N, T> {
type Target = [T; N];
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<const N: usize, T> DerefMut for Array<N, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<'a, const N: usize, C, T, O, H> Ctor<C, O, H> for Array<N, T>
where
C: Match<'a>,
T: Ctor<C, O, H>,
H: Handler<C>,
{
#[inline(always)]
fn construct(&self, ctx: &mut C, func: &mut H) -> Result<O, Error> {
let offset = ctx.offset();
crate::debug_ctor_beg!("Array", offset);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::Array, sel, r2r);
(handler)(&self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::Array, sel, r2r);
(handler)(&self.inner, ctx, func)
};
crate::debug_ctor_reval!("Array", offset, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, const N: usize, C, T> Regex<C> for Array<N, T>
where
T: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
crate::debug_regex_beg!("Array", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::Array, sel);
handler(&self.inner, ctx)
} else {
let handler = regex::handler(Error::Array, sel);
handler(&self.inner, ctx)
};
crate::debug_regex_reval!("Array", ret)
}
}
#[derive(Debug, Clone, Copy)]
pub struct PairArray<const N: usize, K, V> {
inner: [(K, V); N],
longest: bool,
}
impl<const N: usize, K, V> core::ops::Not for PairArray<N, K, V> {
type Output = crate::regex::Assert<Self>;
fn not(self) -> Self::Output {
crate::regex::not(self)
}
}
impl<const N: usize, K, V> PairArray<N, K, V> {
pub const fn new(inner: [(K, V); N], longest: bool) -> Self {
Self { inner, longest }
}
pub const fn longest(&self) -> bool {
self.longest
}
pub fn set_longest(&mut self, longest: bool) -> &mut Self {
self.longest = longest;
self
}
pub fn with_longest(mut self, longest: bool) -> Self {
self.set_longest(longest);
self
}
}
impl<const N: usize, K, V> Deref for PairArray<N, K, V> {
type Target = [(K, V); N];
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<const N: usize, K, V> DerefMut for PairArray<N, K, V> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<'a, const N: usize, C, K, O, V, H> Ctor<C, (O, V), H> for PairArray<N, K, V>
where
V: Clone,
K: Ctor<C, O, H>,
C: Match<'a>,
H: Handler<C>,
{
#[inline(always)]
fn construct(&self, ctx: &mut C, func: &mut H) -> Result<(O, V), Error> {
let offset = ctx.offset();
crate::debug_ctor_beg!("PairArray", offset);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::PairArray, sel_kv, r2r_kv);
handler(&self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::PairArray, sel_kv, r2r_kv);
handler(&self.inner, ctx, func)
};
crate::debug_ctor_reval!("PairArray", offset, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, const N: usize, C, K, V> Regex<C> for PairArray<N, K, V>
where
K: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
crate::debug_regex_beg!("PairArray", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::PairArray, sel_kv);
handler(&self.inner, ctx)
} else {
let handler = regex::handler(Error::PairArray, sel_kv);
handler(&self.inner, ctx)
};
crate::debug_regex_reval!("PairArray", ret)
}
}