use bc_components::{
ARID, Digest, PrivateKeyBase, PrivateKeys, PublicKeys, Reference,
SSKRShare, Salt, SealedMessage, Signature, URI, UUID, XID,
};
use dcbor::prelude::*;
use crate::{Envelope, Error, Result};
#[macro_export]
macro_rules! impl_envelope_decodable {
($type:ty) => {
impl TryFrom<Envelope> for $type {
type Error = Error;
fn try_from(envelope: Envelope) -> Result<Self> {
let cbor = envelope.try_leaf()?;
Ok(cbor.try_into()?)
}
}
};
}
impl_envelope_decodable!(String);
impl_envelope_decodable!(u8);
impl_envelope_decodable!(u16);
impl_envelope_decodable!(u32);
impl_envelope_decodable!(u64);
impl_envelope_decodable!(usize);
impl_envelope_decodable!(i8);
impl_envelope_decodable!(i16);
impl_envelope_decodable!(i32);
impl_envelope_decodable!(i64);
impl_envelope_decodable!(bool);
impl_envelope_decodable!(ByteString);
impl_envelope_decodable!(Date);
impl_envelope_decodable!(f64);
impl_envelope_decodable!(f32);
impl_envelope_decodable!(PublicKeys);
impl_envelope_decodable!(PrivateKeys);
impl_envelope_decodable!(PrivateKeyBase);
impl_envelope_decodable!(SealedMessage);
impl_envelope_decodable!(Signature);
impl_envelope_decodable!(SSKRShare);
impl_envelope_decodable!(Digest);
impl_envelope_decodable!(Salt);
impl_envelope_decodable!(ARID);
impl_envelope_decodable!(URI);
impl_envelope_decodable!(UUID);
impl_envelope_decodable!(XID);
impl_envelope_decodable!(Reference);
impl Envelope {
pub fn try_from_cbor(cbor: CBOR) -> dcbor::Result<Self> { cbor.try_into() }
pub fn try_from_cbor_data(data: Vec<u8>) -> dcbor::Result<Self> {
let cbor = CBOR::try_from_data(data)?;
Self::try_from_cbor(cbor)
}
}