If the `derive` feature is enabled with `features = ["derive"]`, the crate
provides two derive macros [`FromBytes`](../derive.FromBytes.html) and
[`ToBytes`](../derive.ToBytes.html), which implements the
[`FromBytes`](../trait.FromBytes.html) resp. [`ToBytes`](../trait.ToBytes.html)
trait struct and enum types.

## (De-)serialize a struct

```rust
use nuts_bytes::{FromBytes, Reader, ToBytes, Writer};

#[derive(Debug, FromBytes, PartialEq, ToBytes)]
struct Sample {
    f1: u16,
    f2: u32,
}

// Deserialize the Sample struct

let mut reader = Reader::new([0x00, 0x01, 0x00, 0x00, 0x00, 0x02].as_slice());

let sample: Sample = reader.read().unwrap();
assert_eq!(sample, Sample { f1: 1, f2: 2 });

// Serialize the Sample struct

let mut writer = Writer::new(vec![]);
let n = writer.write(&Sample { f1: 1, f2: 2 }).unwrap();

assert_eq!(n, 6);
assert_eq!(writer.into_target(), [0x00, 0x01, 0x00, 0x00, 0x00, 0x02]);
```

## (De-)serialize an enum

```rust
use nuts_bytes::{FromBytes, Reader, ToBytes, Writer};

#[derive(Debug, FromBytes, PartialEq, ToBytes)]
enum Sample {
    V1,
    V2(u16, u32),
}

const V1: [u8; 4] = [0x00, 0x00, 0x00, 0x00];
const V2: [u8; 10] = [
    0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
];

// Deserialize the Sample::V1 variant

let mut reader = Reader::new(V1.as_slice());

let sample: Sample = reader.read().unwrap();
assert_eq!(sample, Sample::V1);

// Deserialize the Sample::V2 variant

let mut reader = Reader::new(V2.as_slice());

let sample: Sample = reader.read().unwrap();
assert_eq!(sample, Sample::V2(1, 2));

// Serialize the Sample::V1 variant

let mut writer = Writer::new(vec![]);
let n = writer.write(&Sample::V1).unwrap();

assert_eq!(n, 4);
assert_eq!(writer.into_target(), V1);

// Serialize the Sample::V2 variant

let mut writer = Writer::new(vec![]);
let n = writer.write(&Sample::V2(1, 2)).unwrap();

assert_eq!(n, 10);
assert_eq!(writer.into_target(), V2);
```
