enid 0.1.0

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

use crate::enid::{Enid, Enid40, Enid80};
use arbitrary::{size_hint, Arbitrary, Result, Unstructured};

#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
impl<'a> Arbitrary<'a> for Enid40 {
    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
        u.arbitrary().map(Self::from_bytes)
    }

    #[inline]
    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
        (5, Some(5))
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
impl<'a> Arbitrary<'a> for Enid80 {
    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
        u.arbitrary().map(Self::from_bytes)
    }

    #[inline]
    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
        (10, Some(10))
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
impl<'a> Arbitrary<'a> for Enid {
    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
        if u.arbitrary()? {
            u.arbitrary().map(Self::Enid40)
        } else {
            u.arbitrary().map(Self::Enid80)
        }
    }

    fn size_hint(depth: usize) -> (usize, Option<usize>) {
        size_hint::and(
            bool::size_hint(depth),
            size_hint::or(Enid40::size_hint(depth), Enid80::size_hint(depth)),
        )
    }
}