A small [CBOR] codec suitable for `no_std` environments.
The crate is organised around the following entities:
- [`Encoder`] and [`Decoder`] for type-directed encoding and decoding
of values.
- [`Encode`] and [`Decode`] traits which can be implemented for any
type that should be encoded to or decoded from CBOR. They are similar
to [serde]'s `Serialize` and `Deserialize` traits but do not abstract
over the encoder/decoder.
As mentioned, encoding and decoding proceeds in a type-directed way, i.e.
by calling methods for expected data item types, e.g. [`Decoder::u32`]
or [`Encoder::str`]. In addition there is support for data type
inspection. The `Decoder` can be queried for the current data type
which returns a [`data::Type`] that can represent every possible CBOR type
and decoding can thus proceed based on this information.
Optionally, `Encode` and `Decode` can be derived for structs and enums
using the respective derive macros. See [`minicbor_derive`] for details.
# Example: generic encoding and decoding
```
use minicbor::{Encode, Decode};
let input = ["hello", "world"];
let mut buffer = [0u8; 128];
minicbor::encode(&input, buffer.as_mut())?;
let output: [&str; 2] = minicbor::decode(buffer.as_ref())?;
assert_eq!(input, output);
# Ok::<_, Box>(())
```
# Example: ad-hoc encoding
```
use minicbor::Encoder;
let mut buffer = [0u8; 128];
let mut encoder = Encoder::new(&mut buffer[..]);
encoder.begin_map()? // using an indefinite map here
.str("hello")?.str("world")?
.str("submap")?.map(2)?
.u8(1)?.bool(true)?
.u8(2)?.bool(false)?
.u16(34234)?.array(3)?.u8(1)?.u8(2)?.u8(3)?
.bool(true)?.null()?
.end()?;
# Ok::<_, Box>(())
```
# Example: ad-hoc decoding
```
use minicbor::{data, Decoder};
let input = [
0xc0, 0x74, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x30,
0x33, 0x2d, 0x32, 0x31, 0x54, 0x32, 0x30, 0x3a,
0x30, 0x34, 0x3a, 0x30, 0x30, 0x5a
];
let mut decoder = Decoder::new(&input[..]);
assert_eq!(data::Tag::DateTime, decoder.tag()?);
assert_eq!("2013-03-21T20:04:00Z", decoder.str()?);
# Ok::<_, Box>(())
```
[CBOR]: https://tools.ietf.org/html/rfc7049
[serde]: https://serde.rs