bc_envelope/base/
envelope_decodable.rs1use bc_components::{Digest, PrivateKeyBase, PrivateKeys, PublicKeys, Reference, SSKRShare, Salt, SealedMessage, Signature, ARID, URI, UUID, XID};
2use dcbor::prelude::*;
3
4use crate::Envelope;
5
6#[macro_export]
7macro_rules! impl_envelope_decodable {
8 ($type:ty) => {
9 impl TryFrom<Envelope> for $type {
10 type Error = dcbor::Error;
11
12 fn try_from(envelope: Envelope) -> dcbor::Result<Self> {
13 let cbor = envelope.try_leaf()?;
14 cbor.try_into()
15 }
16 }
17 };
18}
19
20impl_envelope_decodable!(String);
21
22impl_envelope_decodable!(u8);
24impl_envelope_decodable!(u16);
25impl_envelope_decodable!(u32);
26impl_envelope_decodable!(u64);
27impl_envelope_decodable!(usize);
28impl_envelope_decodable!(i8);
29impl_envelope_decodable!(i16);
30impl_envelope_decodable!(i32);
31impl_envelope_decodable!(i64);
32
33impl_envelope_decodable!(bool);
35
36impl_envelope_decodable!(dcbor::ByteString);
38impl_envelope_decodable!(dcbor::Date);
39
40impl_envelope_decodable!(f64);
42impl_envelope_decodable!(f32);
43
44impl_envelope_decodable!(PublicKeys);
46impl_envelope_decodable!(PrivateKeys);
47impl_envelope_decodable!(PrivateKeyBase);
48impl_envelope_decodable!(SealedMessage);
49impl_envelope_decodable!(Signature);
50impl_envelope_decodable!(SSKRShare);
51impl_envelope_decodable!(Digest);
52impl_envelope_decodable!(Salt);
53
54impl_envelope_decodable!(ARID);
56impl_envelope_decodable!(URI);
57impl_envelope_decodable!(UUID);
58impl_envelope_decodable!(XID);
59impl_envelope_decodable!(Reference);
60
61impl Envelope {
63 pub fn try_from_cbor(cbor: CBOR) -> dcbor::Result<Self> {
77 cbor.try_into()
78 }
79
80 pub fn try_from_cbor_data(data: Vec<u8>) -> dcbor::Result<Self> {
95 let cbor = CBOR::try_from_data(data)?;
96 Self::try_from_cbor(cbor)
97 }
98}