print_raster 0.1.0

A crate for processing print raster images in Rust
Documentation
use super::{CompressedRasterDecoder, UncompressedRasterDecoder};
use crate::decode::RasterDecoder;
use derive_more::From;
use futures::AsyncRead;
use pin_project::pin_project;
use std::{ops::DerefMut, pin::Pin};

#[pin_project(project = CupsRasterDecoderProj)]
#[derive(From)]
pub enum CupsRasterUnifiedDecoder<R> {
    Uncompressed(#[pin] UncompressedRasterDecoder<R>),
    Compressed(#[pin] CompressedRasterDecoder<R>),
}

impl<R> RasterDecoder<R> for CupsRasterUnifiedDecoder<R>
where
    R: DerefMut<Target: AsyncRead>,
{
    fn bytes_remaining(&self) -> u64 {
        match self {
            CupsRasterUnifiedDecoder::Uncompressed(decoder) => decoder.bytes_remaining(),
            CupsRasterUnifiedDecoder::Compressed(decoder) => decoder.bytes_remaining(),
        }
    }

    fn into_pin_mut(self) -> Pin<R> {
        match self {
            CupsRasterUnifiedDecoder::Uncompressed(decoder) => decoder.into_pin_mut(),
            CupsRasterUnifiedDecoder::Compressed(decoder) => decoder.into_pin_mut(),
        }
    }
}

impl<R> AsyncRead for CupsRasterUnifiedDecoder<R>
where
    R: DerefMut<Target: AsyncRead>,
{
    fn poll_read(
        self: std::pin::Pin<&mut Self>,
        cx: &mut std::task::Context,
        buf: &mut [u8],
    ) -> std::task::Poll<std::io::Result<usize>> {
        let this = self.project();
        match this {
            CupsRasterDecoderProj::Uncompressed(decoder) => decoder.poll_read(cx, buf),
            CupsRasterDecoderProj::Compressed(decoder) => decoder.poll_read(cx, buf),
        }
    }
}