use std::{io, str};
pub(crate) struct Writer<'io, W>
where
W: ?Sized,
{
inner: &'io mut W,
}
impl<'io> Writer<'io, Vec<u8>> {
pub(crate) fn from_mut_string(s: &'io mut String) -> Self {
unsafe { Writer::new(s.as_mut_vec()) }
}
}
impl<'io, W> Writer<'io, W>
where
W: ?Sized + io::Write,
{
pub(crate) fn new(inner: &'io mut W) -> Self {
Self { inner }
}
pub(crate) fn reborrow(&mut self) -> Writer<'_, W> {
Writer {
inner: &mut *self.inner,
}
}
pub(crate) fn write_str(&mut self, s: &str) -> io::Result<()> {
self.inner.write_all(s.as_bytes())
}
}
#[derive(Clone, Copy)]
pub(crate) struct AsciiPattern {
chars: &'static [u8],
}
impl AsciiPattern {
pub(crate) const fn new(chars: &'static [u8]) -> Self {
#[allow(clippy::blocks_in_if_conditions)]
if {
let mut i = 0;
loop {
if i >= chars.len() {
break false;
} else if chars[i] > 127 {
break true;
}
i += 1;
}
} {
#[allow(unconditional_panic)]
#[allow(clippy::no_effect)]
([] as [u8; 0])[0]; }
Self { chars }
}
pub(crate) fn take_until_match<'a>(self, haystack: &mut &'a str) -> Option<(&'a str, u8)> {
let bytes = haystack.as_bytes();
let chunk_end = bytes.iter().position(|c| self.chars.contains(c))?;
let chunk = unsafe { str::from_utf8_unchecked(&bytes[..chunk_end]) };
let found = bytes[chunk_end];
*haystack = unsafe { str::from_utf8_unchecked(&bytes[chunk_end..][1..]) };
Some((chunk, found))
}
}