cbored/
lib.rs

1//! CBOR exact reader and writer
2//!
3//! ```
4//! use cbored::Reader;
5//! let mut reader = Reader::new(&[0x80]);
6//! let array = reader.array().expect("valid array");
7//! assert_eq!(array.len(), 0);
8//! ```
9//!
10//! ```
11//! use cbored::{Writer, StructureLength, Positive};
12//! let mut writer = Writer::new();
13//! writer.array_build(StructureLength::Indefinite, |writer| {
14//!     writer.positive(Positive::canonical(10));
15//! })
16
17mod context;
18mod prim;
19
20mod reader;
21mod writer;
22
23mod decode;
24mod encode;
25
26pub mod tagged;
27
28mod lowlevel;
29
30pub(crate) mod header;
31pub mod state;
32mod types;
33pub mod validate;
34
35pub use reader::{Reader, ReaderError};
36pub use writer::Writer;
37
38pub use decode::{decode_vec, Decode, DecodeError, DecodeErrorKind};
39pub use encode::{encode_vec, Encode};
40
41pub use prim::{CborDataOf, CborSlice, CborSliceOf};
42pub use types::*;
43
44#[cfg(feature = "derive")]
45pub use cbored_derive::CborRepr;
46
47/// Try to decode bytes into T from its CBOR bytes representation
48pub fn decode_from_bytes<T: Decode>(slice: &[u8]) -> Result<T, DecodeError> {
49    let mut reader = Reader::new(slice);
50    let t = reader.decode()?;
51    reader
52        .expect_finished()
53        .map_err(DecodeErrorKind::ReaderError)
54        .map_err(|e| e.context::<T>())?;
55    Ok(t)
56}
57
58/// Encode an encodable type T into its CBOR bytes representation
59pub fn encode_to_bytes<T: Encode>(t: &T) -> Vec<u8> {
60    let mut writer = Writer::new();
61    t.encode(&mut writer);
62    writer.finalize()
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68
69    #[test]
70    fn test1() {
71        let mut writer = Writer::new();
72        writer.constant(Constant::True);
73        let cbor = writer.finalize();
74
75        let mut reader = Reader::new(&cbor);
76        let con = reader.constant().unwrap();
77        assert_eq!(reader.is_finished(), true);
78        assert_eq!(con, Constant::True);
79    }
80
81    #[test]
82    fn test2() {
83        let mut writer = Writer::new();
84        writer.constant(Constant::True);
85        writer.positive(Positive::canonical(124));
86        let cbor = writer.finalize();
87
88        let mut reader = Reader::new(&cbor);
89        let con = reader.constant().unwrap();
90        let pos = reader.positive().unwrap();
91        assert_eq!(reader.is_finished(), true);
92        assert_eq!(con, Constant::True);
93        assert_eq!(pos.to_u64(), 124);
94    }
95
96    #[test]
97    fn test_err_reading_type() {
98        let mut writer = Writer::new();
99        writer.constant(Constant::True);
100        writer.positive(Positive::canonical(124));
101        let cbor = writer.finalize();
102
103        let mut reader = Reader::new(&cbor);
104        let con = reader.constant().unwrap();
105
106        // try to read a different type than the expected positive should
107        // error, and also not consume anything, so that the next correct reading
108        // will work
109        assert_eq!(reader.negative().is_err(), true);
110
111        let pos = reader.positive().unwrap();
112        assert_eq!(reader.is_finished(), true);
113        assert_eq!(con, Constant::True);
114        assert_eq!(pos.to_u64(), 124);
115    }
116
117    pub struct Inner(u64, bool);
118
119    impl Decode for Inner {
120        fn decode<'a>(reader: &mut Reader<'a>) -> Result<Self, DecodeError> {
121            let a = reader
122                .array()
123                .map_err(DecodeErrorKind::ReaderError)
124                .map_err(|e| e.context::<Self>())?;
125            if a.len() != 2 {
126                return Err(
127                    DecodeErrorKind::Custom(format!("expectig length of 2")).context::<Self>()
128                );
129            }
130
131            let i = a[0].decode().expect("inner integer");
132            let b = a[1].decode().expect("inner bool");
133            Ok(Inner(i, b))
134        }
135    }
136
137    #[test]
138    fn test_decode() {
139        const DATA: &[u8] = &[0x83, 0x1, 0x7, 0x82, 0x1A, 0x41, 0x70, 0xCB, 0x17, 0xF4];
140
141        let mut r = Reader::new(DATA);
142        let a = r.array().expect("array");
143        assert_eq!(a.len(), 3);
144        let e0: u64 = a[0].decode().expect("u64 (1)");
145        assert_eq!(e0, 1);
146
147        let e1: u64 = a[1].decode().expect("u64 (2)");
148        assert_eq!(e1, 7);
149
150        let e2: Inner = a[2].decode().expect("e2");
151        assert_eq!(e2.0, 1097911063);
152        assert_eq!(e2.1, false);
153        assert!(r.is_finished());
154    }
155
156    #[test]
157    fn test_map_array() {
158        const DATA: &[u8] = &[
159            0x83, 0xa4, 0x00, 0x82, 0x82, 0x58, 0x20, 0x3b, 0x40, 0x26, 0x51, 0x11, 0xd8, 0xbb,
160            0x3c, 0x3c, 0x60, 0x8d, 0x95, 0xb3, 0xa0, 0xbf, 0x83, 0x46, 0x1a, 0xce, 0x32, 0xd7,
161            0x93, 0x36, 0x57, 0x9a, 0x19, 0x39, 0xb3, 0xaa, 0xd1, 0xc0, 0xb7, 0x18, 0x2a, 0x82,
162            0x58, 0x20, 0x82, 0x83, 0x9f, 0x82, 0x00, 0xd8, 0x18, 0x58, 0x24, 0x82, 0x58, 0x20,
163            0x3b, 0x40, 0x26, 0x51, 0x11, 0xd8, 0xbb, 0x3c, 0x3c, 0x60, 0x8d, 0x95, 0xb3, 0xa0,
164            0xbf, 0x83, 0x46, 0x1a, 0xce, 0x32, 0x07, 0x01, 0x82, 0x82, 0x58, 0x1d, 0x61, 0x1c,
165            0x61, 0x6f, 0x1a, 0xcb, 0x46, 0x06, 0x68, 0xa9, 0xb2, 0xf1, 0x23, 0xc8, 0x03, 0x72,
166            0xc2, 0xad, 0xad, 0x35, 0x83, 0xb9, 0xc6, 0xcd, 0x2b, 0x1d, 0xee, 0xed, 0x1c, 0x19,
167            0x01, 0x21, 0x82, 0x58, 0x1d, 0x61, 0xbc, 0xd1, 0x8f, 0xcf, 0xfa, 0x79, 0x7c, 0x16,
168            0xc0, 0x07, 0x01, 0x4e, 0x2b, 0x85, 0x53, 0xb8, 0xb9, 0xb1, 0xe9, 0x4c, 0x50, 0x76,
169            0x88, 0x72, 0x62, 0x43, 0xd6, 0x11, 0x1a, 0x34, 0x20, 0x98, 0x9c, 0x02, 0x1a, 0x00,
170            0x16, 0x90, 0x3a, 0x03, 0x19, 0x03, 0xe7, 0xa1, 0x00, 0x82, 0x82, 0x58, 0x20, 0xf9,
171            0xaa, 0x3f, 0xcc, 0xb7, 0xfe, 0x53, 0x9e, 0x47, 0x11, 0x88, 0xcc, 0xc9, 0xee, 0x65,
172            0x51, 0x4c, 0x59, 0x61, 0xc0, 0x70, 0xb0, 0x6c, 0xa1, 0x85, 0x96, 0x24, 0x84, 0xa4,
173            0x81, 0x3b, 0xee, 0x58, 0x40, 0x93, 0x8c, 0xd3, 0xfe, 0xb7, 0x31, 0xfe, 0x67, 0x49,
174            0xc9, 0xb2, 0xb1, 0x27, 0xd3, 0x95, 0x88, 0x21, 0xfc, 0x76, 0x49, 0xb3, 0x37, 0xf4,
175            0xaa, 0xae, 0x10, 0x5b, 0xf5, 0x1a, 0xd7, 0x59, 0x06, 0xae, 0xc0, 0x11, 0x2f, 0xb4,
176            0x0e, 0xcc, 0x2c, 0x2e, 0x7c, 0x00, 0x59, 0x2a, 0x1e, 0xc5, 0xac, 0x59, 0xdd, 0xf3,
177            0x1a, 0xd6, 0x04, 0x88, 0x63, 0x64, 0xf7, 0x8d, 0xbf, 0x6d, 0xa8, 0xfe, 0x0c, 0x82,
178            0x58, 0x20, 0x68, 0x72, 0xb0, 0xa8, 0x74, 0xac, 0xfe, 0x1c, 0xac, 0xe1, 0x2b, 0x20,
179            0xea, 0x34, 0x85, 0x59, 0xa7, 0xec, 0xc9, 0x12, 0xf2, 0xfc, 0x7f, 0x67, 0x4f, 0x43,
180            0x48, 0x1d, 0xf9, 0x73, 0xd9, 0x2c, 0x58, 0x40, 0x2a, 0x44, 0x2f, 0xac, 0xbd, 0xe5,
181            0xb6, 0x7d, 0x7d, 0x15, 0x58, 0x1e, 0x1b, 0x59, 0xee, 0x44, 0xb3, 0x75, 0x0b, 0xd0,
182            0x18, 0xf0, 0x1a, 0x2f, 0xec, 0xb4, 0xbc, 0x82, 0xb5, 0x58, 0xc9, 0x0f, 0x94, 0x6a,
183            0xfc, 0xb9, 0xf0, 0x3f, 0x18, 0xe7, 0xff, 0xb4, 0x0b, 0xd5, 0x9c, 0x47, 0x93, 0x87,
184            0x1b, 0x92, 0x4a, 0xb7, 0x07, 0xcf, 0xfd, 0xfd, 0xa1, 0x0d, 0xd5, 0x59, 0x5e, 0x29,
185            0xe7, 0x09, 0xf6,
186        ];
187
188        let mut r = Reader::new(DATA);
189        let a = r.array().expect("array");
190        assert_eq!(a.len(), 3);
191
192        {
193            let mut r = a[0].reader();
194            let map = r.map().expect("a[0] map");
195            assert_eq!(map.len(), 4);
196
197            {
198                let (k, v) = map[0];
199                {
200                    let mut r = k.reader();
201                    let p = r.positive().expect("positive key[0]");
202                    assert_eq!(p.to_u64(), 0);
203                    assert!(r.is_finished());
204                }
205                {
206                    let mut r = v.reader();
207                    let array = r.array().expect("array value[0]");
208                    assert_eq!(array.len(), 2);
209                    assert!(r.is_finished());
210                }
211            }
212
213            assert!(r.is_finished());
214        }
215
216        {
217            let mut r = a[1].reader();
218            let map = r.map().expect("a[1] map");
219            assert_eq!(map.len(), 1);
220            assert!(r.is_finished());
221        }
222
223        {
224            let mut r = a[2].reader();
225            r.null().expect("byte");
226            assert!(r.is_finished());
227        }
228
229        assert!(r.is_finished());
230    }
231}