fakejpeg 0.2.0

Rust port of Alun Jones' fakejpeg library
Documentation
// SPDX-FileCopyrightText: Alun Jones
// SPDX-FileCopyrightText: Gergely Nagy
// SPDX-FileContributor: Gergely Nagy
//
// SPDX-License-Identifier: MIT

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)
    }
}