oasis_cbor/
lib.rs

1//! Convenience functions for dealing with CBOR encodings.
2#![feature(min_specialization)]
3#![feature(trait_alias)]
4
5pub mod decode;
6pub mod encode;
7#[doc(hidden)]
8pub mod macros;
9#[cfg(feature = "serde")]
10pub mod serde;
11
12pub use oasis_cbor_derive::*; // Re-export the support proc-macros.
13pub use oasis_cbor_value::*;
14use thiserror::Error;
15
16// Re-export traits.
17pub use crate::{
18    decode::Decode,
19    encode::{Encode, EncodeAsMap},
20};
21
22/// Maximum nesting level allowed when decoding from CBOR.
23const MAX_NESTING_LEVEL: i8 = 64;
24
25/// Error encountered during decoding.
26#[derive(Debug, Error)]
27pub enum DecodeError {
28    #[error("parsing failed")]
29    ParsingFailed,
30    #[error("unexpected type")]
31    UnexpectedType,
32    #[error("missing field")]
33    MissingField,
34    #[error("unknown field")]
35    UnknownField,
36    #[error("unexpected integer size")]
37    UnexpectedIntegerSize,
38}
39
40impl From<reader::DecoderError> for DecodeError {
41    fn from(_e: reader::DecoderError) -> Self {
42        DecodeError::ParsingFailed
43    }
44}
45
46/// Convert CBOR-encoded data into the given type.
47pub fn from_slice<T>(data: &[u8]) -> Result<T, DecodeError>
48where
49    T: Decode,
50{
51    let value = reader::read_nested(data, Some(MAX_NESTING_LEVEL))?;
52    T::try_from_cbor_value_default(value)
53}
54
55/// Convert CBOR-encoded data into the given type using non-strict decoding.
56pub fn from_slice_non_strict<T>(data: &[u8]) -> Result<T, DecodeError>
57where
58    T: Decode,
59{
60    let value = reader::read_nested_non_strict(data, Some(MAX_NESTING_LEVEL))?;
61    T::try_from_cbor_value_default(value)
62}
63
64/// Convert high-level CBOR representation into the given type.
65///
66/// This is the same as calling `T::try_from_cbor_value(value)`.
67pub fn from_value<T>(value: Value) -> Result<T, DecodeError>
68where
69    T: Decode,
70{
71    T::try_from_cbor_value_default(value)
72}
73
74/// Convert the given type into its CBOR-encoded representation.
75pub fn to_vec<T>(value: T) -> Vec<u8>
76where
77    T: Encode,
78{
79    let mut data = vec![];
80    writer::write(value.into_cbor_value(), &mut data).unwrap();
81    data
82}
83
84/// Convert the given type into its high-level CBOR representation.
85///
86/// This is the same as calling `value.into_cbor_value()`.
87pub fn to_value<T>(value: T) -> Value
88where
89    T: Encode,
90{
91    value.into_cbor_value()
92}