enid 0.1.0

A library to parse Encrypted Numeric Identifiers
Documentation
#![cfg(feature = "borsh")]

extern crate alloc;

use crate::enid::{Enid, Enid40, Enid80};
use borsh::io::{Error, ErrorKind, Read, Result, Write};
use borsh::{BorshDeserialize, BorshSerialize};

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshSerialize for Enid40 {
    #[inline]
    fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
        writer.write_all(self.as_bytes())
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshSerialize for Enid80 {
    #[inline]
    fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
        writer.write_all(self.as_bytes())
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshSerialize for Enid {
    fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
        match self {
            Self::Enid40(enid) => {
                writer.write_all(&[0])?;
                enid.serialize(writer)
            }
            Self::Enid80(enid) => {
                writer.write_all(&[1])?;
                enid.serialize(writer)
            }
        }
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshDeserialize for Enid40 {
    #[inline]
    fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
        <[u8; 5]>::deserialize_reader(reader).map(Self::from_bytes)
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshDeserialize for Enid80 {
    #[inline]
    fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
        <[u8; 10]>::deserialize_reader(reader).map(Self::from_bytes)
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl BorshDeserialize for Enid {
    fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
        match u8::deserialize_reader(reader)? {
            0 => Enid40::deserialize_reader(reader).map(Self::Enid40),
            1 => Enid80::deserialize_reader(reader).map(Self::Enid80),
            value => Err(Error::new(
                ErrorKind::InvalidData,
                alloc::format!("Invalid VarEnid80 variant: {value}"),
            )),
        }
    }
}