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

pub struct Marker;

#[allow(dead_code)]
impl Marker {
    pub const RST0: u16 = 0xffd0;
    pub const RST7: u16 = 0xffd7;
    pub const SOI: u16 = 0xffd8;
    pub const EOI: u16 = 0xffd9;
    pub const SOS: u16 = 0xffda;
    pub const DRI: u16 = 0xffdd;
    pub const APP0: u16 = 0xffe0;
    pub const APP1: u16 = 0xffe1;
    pub const APP2: u16 = 0xffe2;
    pub const APP3: u16 = 0xffe3;
    pub const APP4: u16 = 0xffe4;
    pub const APP5: u16 = 0xffe5;
    pub const APP6: u16 = 0xffe6;
    pub const APP7: u16 = 0xffe7;
    pub const APP8: u16 = 0xffe8;
    pub const APP9: u16 = 0xffe9;
    pub const APP10: u16 = 0xffea;
    pub const APP11: u16 = 0xffeb;
    pub const APP12: u16 = 0xffec;
    pub const APP13: u16 = 0xffed;
    pub const APP14: u16 = 0xffee;
    pub const APP15: u16 = 0xffef;
    pub const COM: u16 = 0xfffe;
}

impl Marker {
    #[allow(clippy::trivially_copy_pass_by_ref)]
    pub fn is_valid(value: &u16) -> bool {
        (*value & 0xff00) == 0xff00
    }
}

#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Chunk {
    pub data: Vec<u8>,
    pub size: usize,
    pub remaining: usize,
}

impl Chunk {
    #[allow(clippy::cast_possible_truncation)]
    pub fn build(((marker, bytes), remaining): ((u16, &[u8]), usize)) -> Self {
        let payload_size = bytes.len();
        let mut data: Vec<u8> = Vec::with_capacity(payload_size + 4);
        data.extend(marker.to_be_bytes());
        if payload_size > 0 {
            let length = payload_size as u16 + 2;
            data.extend(length.to_be_bytes());
            data.append(&mut bytes.to_vec());
        }
        Self {
            data,
            size: payload_size + 4,
            remaining,
        }
    }
}