#![no_std]
#![forbid(unsafe_code)]
#![allow(clippy::type_complexity)]
use core::ops::Range;
pub use safe_regex_macro::regex;
pub trait IsMatch {
fn is_match(&self, data: &[u8]) -> bool;
}
pub struct Matcher0<F>
where
F: Fn(&[u8]) -> Option<()>,
{
f: F,
}
impl<F> Matcher0<F>
where
F: Fn(&[u8]) -> Option<()>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_slices(&self, data: &[u8]) -> Option<()> {
(self.f)(data)
}
#[must_use]
pub fn match_ranges(&self, data: &[u8]) -> Option<()> {
(self.f)(data)
}
}
impl<F: Fn(&[u8]) -> Option<()>> IsMatch for Matcher0<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher1<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 1]>,
{
f: F,
}
impl<F> Matcher1<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 1]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(&self, data: &[u8]) -> Option<(Range<usize>,)> {
let [r0] = (self.f)(data)?;
Some((r0,))
}
#[must_use]
pub fn match_slices<'d>(&self, data: &'d [u8]) -> Option<(&'d [u8],)> {
let [r0] = (self.f)(data)?;
Some((&data[r0],))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 1]>> IsMatch for Matcher1<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher2<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 2]>,
{
f: F,
}
impl<F> Matcher2<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 2]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(&self, data: &[u8]) -> Option<(Range<usize>, Range<usize>)> {
let [r0, r1] = (self.f)(data)?;
Some((r0, r1))
}
#[must_use]
pub fn match_slices<'d>(&self, data: &'d [u8]) -> Option<(&'d [u8], &'d [u8])> {
let [r0, r1] = (self.f)(data)?;
Some((&data[r0], &data[r1]))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 2]>> IsMatch for Matcher2<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher3<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 3]>,
{
f: F,
}
impl<F> Matcher3<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 3]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(&self, data: &[u8]) -> Option<(Range<usize>, Range<usize>, Range<usize>)> {
let [r0, r1, r2] = (self.f)(data)?;
Some((r0, r1, r2))
}
#[must_use]
pub fn match_slices<'d>(&self, data: &'d [u8]) -> Option<(&'d [u8], &'d [u8], &'d [u8])> {
let [r0, r1, r2] = (self.f)(data)?;
Some((&data[r0], &data[r1], &data[r2]))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 3]>> IsMatch for Matcher3<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher4<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 4]>,
{
f: F,
}
impl<F> Matcher4<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 4]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(Range<usize>, Range<usize>, Range<usize>, Range<usize>)> {
let [r0, r1, r2, r3] = (self.f)(data)?;
Some((r0, r1, r2, r3))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(&'d [u8], &'d [u8], &'d [u8], &'d [u8])> {
let [r0, r1, r2, r3] = (self.f)(data)?;
Some((&data[r0], &data[r1], &data[r2], &data[r3]))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 4]>> IsMatch for Matcher4<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher5<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 5]>,
{
f: F,
}
impl<F> Matcher5<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 5]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(&'d [u8], &'d [u8], &'d [u8], &'d [u8], &'d [u8])> {
let [r0, r1, r2, r3, r4] = (self.f)(data)?;
Some((&data[r0], &data[r1], &data[r2], &data[r3], &data[r4]))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 5]>> IsMatch for Matcher5<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher6<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 6]>,
{
f: F,
}
impl<F> Matcher6<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 6]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4, r5] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4, r5))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(&'d [u8], &'d [u8], &'d [u8], &'d [u8], &'d [u8], &'d [u8])> {
let [r0, r1, r2, r3, r4, r5] = (self.f)(data)?;
Some((
&data[r0], &data[r1], &data[r2], &data[r3], &data[r4], &data[r5],
))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 6]>> IsMatch for Matcher6<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher7<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 7]>,
{
f: F,
}
impl<F> Matcher7<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 7]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4, r5, r6] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4, r5, r6))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
)> {
let [r0, r1, r2, r3, r4, r5, r6] = (self.f)(data)?;
Some((
&data[r0], &data[r1], &data[r2], &data[r3], &data[r4], &data[r5], &data[r6],
))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 7]>> IsMatch for Matcher7<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher8<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 8]>,
{
f: F,
}
impl<F> Matcher8<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 8]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4, r5, r6, r7))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7] = (self.f)(data)?;
Some((
&data[r0], &data[r1], &data[r2], &data[r3], &data[r4], &data[r5], &data[r6], &data[r7],
))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 8]>> IsMatch for Matcher8<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher9<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 9]>,
{
f: F,
}
impl<F> Matcher9<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 9]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7, r8] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4, r5, r6, r7, r8))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7, r8] = (self.f)(data)?;
Some((
&data[r0], &data[r1], &data[r2], &data[r3], &data[r4], &data[r5], &data[r6], &data[r7],
&data[r8],
))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 9]>> IsMatch for Matcher9<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}
pub struct Matcher10<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 10]>,
{
f: F,
}
impl<F> Matcher10<F>
where
F: Fn(&[u8]) -> Option<[Range<usize>; 10]>,
{
#[must_use]
pub fn new(f: F) -> Self {
Self { f }
}
#[must_use]
pub fn is_match(&self, data: &[u8]) -> bool {
(self.f)(data).is_some()
}
#[must_use]
pub fn match_ranges(
&self,
data: &[u8],
) -> Option<(
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
Range<usize>,
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9] = (self.f)(data)?;
Some((r0, r1, r2, r3, r4, r5, r6, r7, r8, r9))
}
#[must_use]
pub fn match_slices<'d>(
&self,
data: &'d [u8],
) -> Option<(
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
&'d [u8],
)> {
let [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9] = (self.f)(data)?;
Some((
&data[r0], &data[r1], &data[r2], &data[r3], &data[r4], &data[r5], &data[r6], &data[r7],
&data[r8], &data[r9],
))
}
}
impl<F: Fn(&[u8]) -> Option<[Range<usize>; 10]>> IsMatch for Matcher10<F> {
fn is_match(&self, data: &[u8]) -> bool {
self.is_match(data)
}
}