print_raster/decode/
cups.rs

1use super::{CompressedRasterDecoder, UncompressedRasterDecoder};
2use crate::decode::RasterDecoder;
3use derive_more::From;
4use futures::AsyncRead;
5use pin_project::pin_project;
6use std::{ops::DerefMut, pin::Pin};
7
8#[pin_project(project = CupsRasterDecoderProj)]
9#[derive(From)]
10pub enum CupsRasterUnifiedDecoder<R> {
11    Uncompressed(#[pin] UncompressedRasterDecoder<R>),
12    Compressed(#[pin] CompressedRasterDecoder<R>),
13}
14
15impl<R> RasterDecoder<R> for CupsRasterUnifiedDecoder<R>
16where
17    R: DerefMut<Target: AsyncRead>,
18{
19    fn bytes_remaining(&self) -> u64 {
20        match self {
21            CupsRasterUnifiedDecoder::Uncompressed(decoder) => decoder.bytes_remaining(),
22            CupsRasterUnifiedDecoder::Compressed(decoder) => decoder.bytes_remaining(),
23        }
24    }
25
26    fn into_pin_mut(self) -> Pin<R> {
27        match self {
28            CupsRasterUnifiedDecoder::Uncompressed(decoder) => decoder.into_pin_mut(),
29            CupsRasterUnifiedDecoder::Compressed(decoder) => decoder.into_pin_mut(),
30        }
31    }
32}
33
34impl<R> AsyncRead for CupsRasterUnifiedDecoder<R>
35where
36    R: DerefMut<Target: AsyncRead>,
37{
38    fn poll_read(
39        self: std::pin::Pin<&mut Self>,
40        cx: &mut std::task::Context,
41        buf: &mut [u8],
42    ) -> std::task::Poll<std::io::Result<usize>> {
43        let this = self.project();
44        match this {
45            CupsRasterDecoderProj::Uncompressed(decoder) => decoder.poll_read(cx, buf),
46            CupsRasterDecoderProj::Compressed(decoder) => decoder.poll_read(cx, buf),
47        }
48    }
49}