pub use delimited::*;
pub use escaped::*;
pub use expected::*;
pub use generic_arraydeque::GenericArrayDeque;
pub use lexeme::*;
pub use located::*;
pub use message::Message;
pub use positioned_char::*;
pub use sliced::*;
pub use span::*;
pub use spanned::*;
pub use to_equivalent::*;
pub use generic_arraydeque::{self, typenum};
pub mod recursion_tracker;
pub mod token_tracker;
pub mod tracker;
pub mod cmp;
pub mod human_display;
pub mod sdl_display;
pub mod syntax_tree_display;
pub mod delimiter;
pub mod knowledge;
#[cfg(feature = "smallvec")]
#[cfg_attr(docsrs, doc(cfg(feature = "smallvec")))]
pub mod container;
pub mod marker;
mod delimited;
mod escaped;
mod expected;
mod lexeme;
mod located;
mod message;
mod positioned_char;
mod sliced;
mod span;
mod spanned;
mod to_equivalent;
pub trait AsSpan<Span> {
fn as_span(&self) -> &Span;
}
pub trait IntoSpan<Span>: AsSpan<Span> {
fn into_span(self) -> Span;
}
pub trait IntoComponents {
type Components;
fn into_components(self) -> Self::Components;
}
pub trait IsAsciiChar {
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool;
fn is_ascii_digit(&self) -> bool;
#[cfg_attr(not(tarpaulin), inline(always))]
fn one_of(&self, choices: &[ascii::AsciiChar]) -> bool {
choices.iter().any(|&ch| self.is_ascii_char(ch))
}
}
impl<T> IsAsciiChar for &T
where
T: IsAsciiChar + ?Sized,
{
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<T as IsAsciiChar>::is_ascii_char(*self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<T as IsAsciiChar>::is_ascii_digit(*self)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn one_of(&self, choices: &[ascii::AsciiChar]) -> bool {
<T as IsAsciiChar>::one_of(*self, choices)
}
}
impl<T> IsAsciiChar for &mut T
where
T: IsAsciiChar + ?Sized,
{
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<T as IsAsciiChar>::is_ascii_char(*self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<T as IsAsciiChar>::is_ascii_digit(*self)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn one_of(&self, choices: &[ascii::AsciiChar]) -> bool {
<T as IsAsciiChar>::one_of(*self, choices)
}
}
impl IsAsciiChar for char {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
if self.is_ascii() {
*self as u8 == ch as u8
} else {
false
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
char::is_ascii_digit(self)
}
}
impl IsAsciiChar for u8 {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
*self == ch as u8
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
u8::is_ascii_digit(self)
}
}
impl IsAsciiChar for str {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
self.len() == 1 && self.as_bytes()[0] == ch as u8
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
self.len() == 1 && self.as_bytes()[0].is_ascii_digit()
}
}
impl IsAsciiChar for [u8] {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
self.len() == 1 && self[0] == ch as u8
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
self.len() == 1 && self[0].is_ascii_digit()
}
}
#[cfg(feature = "bstr")]
impl IsAsciiChar for bstr::BStr {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<[u8] as IsAsciiChar>::is_ascii_char(self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<[u8] as IsAsciiChar>::is_ascii_digit(self)
}
}
#[cfg(feature = "bytes")]
impl IsAsciiChar for bytes::Bytes {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<[u8] as IsAsciiChar>::is_ascii_char(self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<[u8] as IsAsciiChar>::is_ascii_digit(self)
}
}
#[cfg(feature = "hipstr")]
impl IsAsciiChar for hipstr::HipByt<'_> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<[u8] as IsAsciiChar>::is_ascii_char(self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<[u8] as IsAsciiChar>::is_ascii_digit(self)
}
}
#[cfg(feature = "hipstr")]
impl IsAsciiChar for hipstr::HipStr<'_> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_char(&self, ch: ascii::AsciiChar) -> bool {
<str as IsAsciiChar>::is_ascii_char(self, ch)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_ascii_digit(&self) -> bool {
<str as IsAsciiChar>::is_ascii_digit(self)
}
}
#[allow(clippy::len_without_is_empty)]
pub trait CharLen: sealed::Sealed {
fn char_len(&self) -> usize;
}
mod sealed {
use super::{CharLen, PositionedChar};
pub trait Sealed {}
impl Sealed for u8 {}
impl Sealed for char {}
impl<T: Sealed> Sealed for PositionedChar<T> {}
impl<T: Sealed> Sealed for &T {}
impl CharLen for u8 {
#[cfg_attr(not(tarpaulin), inline(always))]
fn char_len(&self) -> usize {
1
}
}
impl CharLen for char {
#[cfg_attr(not(tarpaulin), inline(always))]
fn char_len(&self) -> usize {
self.len_utf8()
}
}
impl<T: CharLen> CharLen for PositionedChar<T> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn char_len(&self) -> usize {
self.char_ref().char_len()
}
}
impl<T: CharLen> CharLen for &T {
#[cfg_attr(not(tarpaulin), inline(always))]
fn char_len(&self) -> usize {
(*self).char_len()
}
}
}