#[cfg(feature = "alloc")]
use crate::{CborError, DecodeLimits};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CanonicalCborRef<'a> {
bytes: &'a [u8],
}
impl<'a> CanonicalCborRef<'a> {
#[inline]
pub(crate) const fn new(bytes: &'a [u8]) -> Self {
Self { bytes }
}
#[inline]
#[must_use]
pub const fn as_bytes(self) -> &'a [u8] {
self.bytes
}
#[inline]
#[must_use]
pub const fn len(self) -> usize {
self.bytes.len()
}
#[inline]
#[must_use]
pub const fn is_empty(self) -> bool {
self.bytes.is_empty()
}
#[cfg(feature = "sha2")]
#[cfg_attr(docsrs, doc(cfg(feature = "sha2")))]
#[must_use]
pub fn sha256(self) -> [u8; 32] {
use sha2::{Digest, Sha256};
let mut h = Sha256::new();
h.update(self.bytes);
let out = h.finalize();
let mut digest = [0u8; 32];
digest.copy_from_slice(out.as_slice());
digest
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[must_use]
pub fn to_owned(self) -> CanonicalCbor {
CanonicalCbor {
bytes: self.bytes.to_vec(),
}
}
}
impl AsRef<[u8]> for CanonicalCborRef<'_> {
fn as_ref(&self) -> &[u8] {
self.bytes
}
}
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CanonicalCbor {
bytes: Vec<u8>,
}
#[cfg(feature = "alloc")]
impl CanonicalCbor {
pub fn from_slice(bytes: &[u8], limits: DecodeLimits) -> Result<Self, CborError> {
let canon = crate::validate_canonical(bytes, limits)?;
Ok(canon.to_owned())
}
#[inline]
#[must_use]
pub fn as_bytes(&self) -> &[u8] {
&self.bytes
}
#[inline]
#[must_use]
pub fn into_bytes(self) -> Vec<u8> {
self.bytes
}
#[cfg(feature = "sha2")]
#[cfg_attr(docsrs, doc(cfg(feature = "sha2")))]
#[must_use]
pub fn sha256(&self) -> [u8; 32] {
CanonicalCborRef::new(&self.bytes).sha256()
}
}
#[cfg(feature = "alloc")]
impl AsRef<[u8]> for CanonicalCbor {
fn as_ref(&self) -> &[u8] {
&self.bytes
}
}