use crate::{Error, Result, parser, template::chunk::Chunk};
use winnow::Parser;
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ImageTemplate {
pub(crate) chunks: Vec<Chunk>,
pub(crate) minimum_size: usize,
}
impl ImageTemplate {
pub fn learn<I: AsRef<[u8]>>(input: I) -> Result<Self> {
let (soi, mut inner_chunks, _) = parser::parse_jpeg
.parse(input.as_ref())
.map_err(|e| Error::parse_error(e.offset(), e.into_inner()))?;
let mut minimum_size = 4;
inner_chunks.retain(|item| {
if item.size == 0 {
return false;
}
minimum_size += item.remaining + item.size;
true
});
let mut chunks = Vec::with_capacity(inner_chunks.len() + 1);
chunks.push(soi);
chunks.append(&mut inner_chunks);
Ok(Self {
chunks,
minimum_size,
})
}
}
impl TryFrom<&[u8]> for ImageTemplate {
type Error = Error;
fn try_from(input: &[u8]) -> Result<Self> {
Self::learn(input)
}
}