cbor_enhanced 0.1.1

Cbor de/serialization library making use of lifetimes to support zero copy deserialization. Several iana tags are supported but need to be activated via feature flags.
Documentation
use num_bigint::{BigInt, BigUint};

use crate::de::{Deserializer, Remaining};
use crate::error::CborError;
use crate::types::IanaTag;
use crate::Deserialize;

impl<'de> Deserializer {
    pub fn take_biguint(&self, data: &'de [u8]) -> Result<(BigUint, Remaining<'de>), CborError> {
        let remaining = self.expect_tag(data, IanaTag::PositiveBigNum)?;
        let (slice, remaining) = self.take_bytes(remaining, true)?;
        let big_uint = BigUint::from_bytes_be(slice);
        Ok((big_uint, remaining))
    }
    pub fn take_bigint(&self, data: &'de [u8]) -> Result<(BigInt, Remaining<'de>), CborError> {
        let remaining = self.expect_tag(data, IanaTag::NegativeBigNum)?;
        let (slice, remaining) = self.take_bytes(remaining, true)?;

        let big_uint = BigUint::from_bytes_be(slice);
        let big_int = BigInt::from(-1) - BigInt::from(big_uint);
        Ok((big_int, remaining))
    }
}

impl<'de> Deserialize<'de> for BigUint {
    fn deserialize(
        deserializer: &mut Deserializer,
        data: &'de [u8],
    ) -> Result<(Self, &'de [u8]), CborError> {
        deserializer
            .take_biguint(data)
            .map(|(v, remaining)| (v, remaining))
    }
}

impl<'de> Deserialize<'de> for BigInt {
    fn deserialize(
        deserializer: &mut Deserializer,
        data: &'de [u8],
    ) -> Result<(Self, &'de [u8]), CborError> {
        deserializer
            .take_bigint(data)
            .map(|(v, remaining)| (v, remaining))
    }
}