bitsong 0.1.3

Fast `#[no_std]` macro-based serialization/deserialization.
Documentation
use super::*;

impl <T: SongSize> SongSize for Option<T> {
    fn song_size(self: &Self) -> usize {
        match &self {
            Some(val) => val.song_size() + 1,
            None => 1
        }
    }
}

impl <T: ToSong> ToSong for Option<T> {
    fn to_song(&self, buf: &mut [u8]) -> Result<(), ToSongError> {
        if buf.len() < self.song_size() {
            return Err(ToSongError::BufferOverflow)
        }

        match &self {
            Some(val) => {
                buf[0] = 0x01;
                val.to_song(&mut buf[1..])
            }
            None => {
                buf[0] = 0;
                Ok(())
            }
        }
    }
}

impl <T: FromSong> FromSong for Option<T> {
    fn from_song(buf: &[u8]) -> Result<Self, FromSongError> where Self: Sized {
        if buf.len() < 1 {
            return Err(FromSongError::BufferOverflow)
        }

        match buf[0] {
            0x00 => Ok(None),
            0x01 => Ok(Some(T::from_song(&buf[1..])?)),
            _ => Err(FromSongError::InvalidValue)
        }
    }
}