#[cfg(feature = "alloc")]
use alloc::{vec, vec::Vec};
use core::fmt::Debug;
#[cfg(feature = "std")]
use std::io::{self, Read};
use super::Decoder;
pub struct DecoderBuilder<R = (), B = ()> {
read: R,
buf: B,
}
impl Default for DecoderBuilder {
fn default() -> Self {
Self { read: (), buf: () }
}
}
impl DecoderBuilder<(), ()> {
#[deprecated = "DecoderBuilder is missing a reader and a buffer, which are required to build a decoder."]
pub fn build(self) -> ! {
panic!("See compilation warning");
}
}
impl<R> DecoderBuilder<(R,), ()> {
#[deprecated = "DecoderBuilder is missing a buffer, which is required to build a decoder."]
pub fn build(self) -> ! {
panic!("See compilation warning");
}
}
impl<B> DecoderBuilder<(), (B,)> {
#[deprecated = "DecoderBuilder is missing a reader, which is required to build a decoder."]
pub fn build(self) -> ! {
panic!("See compilation warning");
}
}
impl<B> DecoderBuilder<(), B> {
pub fn with_read_fn<R, E>(self, read_fn: R) -> DecoderBuilder<(R,), B>
where
R: FnMut(&mut [u8]) -> Result<usize, E>,
E: Debug,
{
DecoderBuilder {
read: (read_fn,),
buf: self.buf,
}
}
#[cfg(feature = "std")]
pub fn with_reader(
self,
mut reader: impl Read,
) -> DecoderBuilder<(impl FnMut(&mut [u8]) -> Result<usize, io::Error>,), B> {
let read = move |buf: &mut [u8]| reader.read(buf);
DecoderBuilder {
read: (read,),
buf: self.buf,
}
}
}
impl<R> DecoderBuilder<R, ()> {
pub fn with_buffer<B>(self, buf: B) -> DecoderBuilder<R, (B,)>
where
B: AsMut<[u8]>,
{
DecoderBuilder {
read: self.read,
buf: (buf,),
}
}
pub fn with_stack_buffer<const SIZE: usize>(self) -> DecoderBuilder<R, ([u8; SIZE],)> {
self.with_buffer([0; SIZE])
}
#[cfg(feature = "alloc")]
pub fn with_heap_buffer(self, size: usize) -> DecoderBuilder<R, (Vec<u8>,)> {
self.with_buffer(vec![0; size])
}
}
impl<R, B, E> DecoderBuilder<(R,), (B,)>
where
R: FnMut(&mut [u8]) -> Result<usize, E>,
E: Debug,
B: AsMut<[u8]>,
{
pub fn build(self) -> Decoder<R, B> {
Decoder::new(self.read.0, self.buf.0)
}
}