use std::mem;
use rand::{rngs::OsRng, Rng};
use crate::mime::grovel;
#[derive(Debug, Clone, Default)]
pub struct ZstdTrainFetcher(pub Vec<u8>);
impl grovel::Visitor for ZstdTrainFetcher {
type Output = Vec<u8>;
fn header(
&mut self,
raw: &[u8],
name: &str,
_value: &[u8],
) -> Result<(), Self::Output> {
if name.eq_ignore_ascii_case("Content-Type")
|| name.eq_ignore_ascii_case("Content-Transfer-Encoding")
|| name.eq_ignore_ascii_case("Date")
|| name.eq_ignore_ascii_case("Precedence")
|| name.eq_ignore_ascii_case("MIME-Version")
{
self.0.extend_from_slice(raw);
} else {
let rand: [u8; 3] = OsRng.gen();
self.0.extend_from_slice(name.as_bytes());
self.0.extend_from_slice(b": ");
self.0.extend_from_slice(base64::encode(&rand).as_bytes());
self.0.extend_from_slice(b"\r\n");
}
Ok(())
}
fn start_content(&mut self) -> Result<(), Self::Output> {
Err(self.end())
}
fn end(&mut self) -> Self::Output {
mem::take(&mut self.0)
}
}