midi-codec 0.4.0

Tools for encoding and decoding a stream of MIDI messages.
Documentation
#[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>(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)
    }
}