use crate::decoder::Decoder;
#[derive(Debug, Clone, Copy)]
pub struct SkipWhitespace(pub Decoder);
impl SkipWhitespace {
pub const fn decode<const N: usize>(self, input: &[u8]) -> [u8; N] {
self.0.do_decode(input, Some(Skipper::Whitespace))
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum Skipper {
Whitespace,
Pem,
}
impl Skipper {
const fn detect_pem_header(input: &[u8], mut i: usize) -> Option<usize> {
if input.len() < i + 5 {
None
} else if input[i] == b'-'
&& input[i + 1] == b'-'
&& input[i + 2] == b'-'
&& input[i + 3] == b'-'
&& input[i + 4] == b'-'
{
i += 5;
while i < input.len() && input[i] != b'\n' {
i += 1;
}
Some(i)
} else {
None
}
}
pub const fn skip(self, input: &[u8], mut in_index: usize) -> usize {
if input[in_index].is_ascii_whitespace() {
in_index += 1;
} else if let Self::Pem = self {
if let Some(new_in_index) = Self::detect_pem_header(input, in_index) {
in_index = new_in_index;
}
}
in_index
}
}
#[derive(Debug, Clone, Copy)]
pub struct Pem;
impl Pem {
pub const fn decode<const N: usize>(input: &[u8]) -> [u8; N] {
Decoder::Base64.do_decode(input, Some(Skipper::Pem))
}
}