use core::num::NonZeroU8;
use crate::iterhelp::ByteSliceIter;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct DateComponentSeparator {
bytes: [u8; 6],
len: NonZeroU8,
}
impl DateComponentSeparator {
#[allow(clippy::len_without_is_empty)] pub fn len(&self) -> NonZeroU8 {
self.len
}
pub fn as_bytes(&self) -> &[u8] {
&self.bytes[0..self.len.get() as usize]
}
pub fn as_str(&self) -> &str {
str::from_utf8(self.as_bytes()).expect("Separator is ASCII only")
}
pub(crate) fn is_single_slash(&self) -> bool {
let mut slash_found = false;
for i in 0..self.len.get() as usize {
let x = self.bytes[i];
if x == b' ' {
continue;
}
if x != b'/' {
return false;
}
if slash_found {
return false;
}
slash_found = true;
}
true
}
pub(crate) fn parse(i: &mut ByteSliceIter) -> Option<Self> {
let mut len: usize = 0;
let mut data: [u8; 6] = [0; 6];
loop {
let Some(peeked) = i.peek() else {
break;
};
if peeked.is_ascii_alphanumeric() {
break;
}
if peeked == b'-'
&& len != 0
&& let Some(x) = i.peek_n(1)
&& x.is_ascii_alphanumeric()
{
break;
}
if len >= data.len() {
return None;
}
data[len] = peeked;
len += 1;
_ = i.next();
}
Some(Self {
len: NonZeroU8::new(len as u8)?,
bytes: data,
})
}
}