#![forbid(unsafe_code)]
use crate::generator::generate;
use safe_proc_macro2::{TokenStream, TokenTree};
pub mod generator;
pub mod parser;
#[macro_export]
macro_rules! dprintln {
($($args:tt)+) => {};
}
#[allow(clippy::missing_panics_doc)]
pub fn escape_ascii(input: impl AsRef<[u8]>) -> String {
let mut result = String::new();
for byte in input.as_ref() {
for ascii_byte in core::ascii::escape_default(*byte) {
result.push_str(core::str::from_utf8(&[ascii_byte]).unwrap());
}
}
result
}
pub fn impl_regex(stream: TokenStream) -> Result<TokenStream, String> {
const ERR: &str = "expected a raw byte string, like br\"abc\"";
dprintln!(
"impl_regex {:?}",
stream
.clone()
.into_iter()
.map(|tree| format!("{:?} ", tree))
.collect::<String>()
);
let mut stream_iter = stream.into_iter();
let literal = match stream_iter.next() {
Some(TokenTree::Literal(literal)) => literal,
_ => return Err(ERR.to_string()),
};
if stream_iter.next().is_some() {
return Err(ERR.to_string());
}
let literal_string = literal.to_string();
let raw_byte_string = literal_string
.strip_prefix("br")
.ok_or_else(|| ERR.to_string())?
.trim_start_matches('#')
.trim_start_matches('"')
.trim_end_matches('#')
.trim_end_matches('"');
let final_node = crate::parser::parse(raw_byte_string.as_bytes())?;
Ok(generate(&final_node))
}