use std::{fmt::Debug, hash::Hash};
use serde::{de::DeserializeOwned, Serialize};
use crate::utils::{
automaton::{self, DetAutomaton},
MergeRef,
};
mod byte;
mod char;
pub trait Token: Copy {
type Range: TokenRange<Self>;
type Set: TokenSet<Self>;
const UNICODE: bool;
fn from_u8(b: u8) -> Self;
fn from_char(c: char) -> Option<Self>;
fn from_u32(v: u32) -> Option<Self>;
fn rust_type() -> proc_macro2::TokenStream;
fn rust_string_type() -> proc_macro2::TokenStream;
fn rust_owned_string_type() -> proc_macro2::TokenStream;
fn rust_iterator_method() -> proc_macro2::TokenStream;
fn rust_as_inner_method() -> proc_macro2::TokenStream;
fn rust_into_inner_method() -> proc_macro2::TokenStream;
fn rust_inner_as_bytes_method() -> Option<proc_macro2::TokenStream> {
None
}
fn rust_inner_into_bytes_method() -> Option<proc_macro2::TokenStream> {
None
}
fn is_ascii(_automaton: &DetAutomaton<u32, Self::Set>) -> bool {
false
}
fn rust_inner_as_ascii_method_body() -> Option<proc_macro2::TokenStream> {
None
}
fn rust_empty_string() -> proc_macro2::TokenStream;
}
pub trait TokenRange<T: Token>: Debug + Copy + Ord + Hash {
fn new(a: T, b: T) -> Self;
fn from_u8(b: u8) -> Self {
Self::new(T::from_u8(b), T::from_u8(b))
}
}
pub trait TokenSet<T: Token>:
Debug
+ Default
+ Clone
+ Ord
+ Hash
+ automaton::DeterminizeLabel<Range = T::Range>
+ MergeRef
+ Serialize
+ DeserializeOwned
{
fn singleton(token: T, case_sensitive: bool) -> Self;
fn from_range(range: T::Range) -> Self {
let mut result = Self::default();
result.insert_range(range);
result
}
fn rust_set(&self) -> proc_macro2::TokenStream;
}