#[cfg(feature = "alloc")]
use alloc::{vec, vec::Vec};
use crate::io::ReadSimple;
use super::Decoder;
pub struct DecoderBuilder<R = (), B = ()> {
reader: R,
buf: B,
}
impl Default for DecoderBuilder {
fn default() -> Self {
Self {
reader: (),
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_reader<R, E>(self, reader: R) -> DecoderBuilder<(R,), B>
where
R: ReadSimple,
{
DecoderBuilder {
reader: (reader,),
buf: self.buf,
}
}
}
impl<R> DecoderBuilder<R, ()> {
pub fn with_buffer<B>(self, buf: B) -> DecoderBuilder<R, (B,)>
where
B: AsMut<[u8]>,
{
DecoderBuilder {
reader: self.reader,
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> DecoderBuilder<(R,), (B,)>
where
R: ReadSimple,
B: AsMut<[u8]>,
{
pub fn build(self) -> Decoder<R, B> {
Decoder::new(self.reader.0, self.buf.0)
}
}