bitsong 0.1.3

Fast `#[no_std]` macro-based serialization/deserialization.
Documentation
use crate::{FromSong, FromSongError, SongSize, ToSong, ToSongError};

impl <T: SongSize, E: SongSize> SongSize for Result<T, E> {
    fn song_size(self: &Self) -> usize {
        match self {
            Ok(item) => item.song_size() + 1,
            Err(err) => err.song_size() + 1
        }
    }
}

impl <T: SongSize + ToSong, E: SongSize + ToSong> ToSong for Result<T, E> {
    fn to_song(&self, buf: &mut [u8]) -> Result<(), super::ToSongError> {
        match self {
            Ok(item) => {
                if buf.len() == 0 {
                    return Err(ToSongError::BufferOverflow)
                }

                buf[0] = 0x12;
                item.to_song(&mut buf[1..])?;
                Ok(())
            },
            Err(err) => {
                if buf.len() == 0 {
                    return Err(ToSongError::BufferOverflow)
                }
                
                buf[0] = 0x34;
                err.to_song(&mut buf[1..])?;
                Ok(())
            }
        }
    }
}

impl <T: SongSize + FromSong, E: SongSize + FromSong> FromSong for Result<T, E> {
    fn from_song(buf: &[u8]) -> Result<Self, super::FromSongError> where Self: Sized {
        if buf.len() == 0 {
            return Err(FromSongError::BufferOverflow)
        }

        match buf[0] {
            0x12 => Ok(Ok(T::from_song(&buf[1..])?)),
            0x34 => Ok(Err(E::from_song(&buf[1..])?)),
            _ => Err(FromSongError::InvalidValue)
        }
    }
}