1mod 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
47pub 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
58pub 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 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}