Both [`Serialise`] and [`Deserialise`] can be
derived for structures and enumerations:
[`Serialise`]: derive@oct::serdes::Serialise
[`Deserialise`]: derive@oct::serdes::Deserialise
```rust
use oct::serdes::{Deserialise, Serialise};
#[derive(Debug, Deserialise, PartialEq, Serialise)]
struct Struct0 {
pub field0: char,
pub field1: bool,
pub field2: f64,
}
#[derive(Debug, Deserialise, PartialEq, Serialise)]
struct Struct1(pub i128);
#[derive(Debug, Deserialise, PartialEq, Serialise)]
struct Struct2;
#[derive(Debug, Deserialise, PartialEq, Serialise)]
enum Enum {
Variant0 {
field0: char,
field1: bool,
field2: f64,
},
Variant1(i128),
Variant2,
}
const STRUCT0: Struct0 = Struct0 {
field0: char::MAX,
field1: true,
field2: f64::MAX
};
const STRUCT1: Struct1 = Struct1(i128::MAX);
const STRUCT2: Struct2 = Struct2;
const ENUM_VARIANT0: Enum = Enum::Variant0 {
field0: char::MAX,
field1: true,
field2: f64::MAX
};
const ENUM_VARIANT1: Enum = Enum::Variant1(i128::MAX);
const ENUM_VARIANT2: Enum = Enum::Variant2;
let mut buf = [0; 1024];
let mut output = buf.as_mut_slice();
STRUCT0.serialise(&mut output).unwrap();
STRUCT1.serialise(&mut output).unwrap();
STRUCT2.serialise(&mut output).unwrap();
ENUM_VARIANT0.serialise(&mut output).unwrap();
ENUM_VARIANT1.serialise(&mut output).unwrap();
ENUM_VARIANT2.serialise(&mut output).unwrap();
let mut input = buf.as_slice();
assert_eq!(Struct0::deserialise(&mut input).unwrap(), STRUCT0);
assert_eq!(Struct1::deserialise(&mut input).unwrap(), STRUCT1);
assert_eq!(Struct2::deserialise(&mut input).unwrap(), STRUCT2);
assert_eq!(Enum::deserialise(&mut input).unwrap(), ENUM_VARIANT0);
assert_eq!(Enum::deserialise(&mut input).unwrap(), ENUM_VARIANT1);
assert_eq!(Enum::deserialise(&mut input).unwrap(), ENUM_VARIANT2);
```
Untagged unions, however, cannot derive them:
```rust,compile_fail
use oct::io::{Deserialise, Serialise};
#[derive(Deserialise, Serialise)]
union Union {}
```