1#![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::*; pub use oasis_cbor_value::*;
14use thiserror::Error;
15
16pub use crate::{
18 decode::Decode,
19 encode::{Encode, EncodeAsMap},
20};
21
22const MAX_NESTING_LEVEL: i8 = 64;
24
25#[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
46pub 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
55pub 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
64pub fn from_value<T>(value: Value) -> Result<T, DecodeError>
68where
69 T: Decode,
70{
71 T::try_from_cbor_value_default(value)
72}
73
74pub 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
84pub fn to_value<T>(value: T) -> Value
88where
89 T: Encode,
90{
91 value.into_cbor_value()
92}