# Encoding spec (like capnproto)

bool - 1 bit

u8, u16, u32, u64
i8, i16, i32, i64
f32, f64

data - vec of bytes(u8)
text - utf-8 valid bytes

struct { ... } - состоит из набора полей структуры

enum { ... } - состоит из - значения перечисления (1 байт) и его содержимого (если есть)

Vec<T> - состоит из числа элементов и набора самих элементов.

Option<T> - состоит из 2х значений - первое булево, да или нет, если да, существует второе значение T

HashMap<K, V> - упаковывается в обычный vec<tuple(k, v)>

tuple with 2, 3, 4 elements - по сути та же самая структура с 2,3,4 полями, вместо названия полей - их порядковые номера

Схема хранится где то отдельно от данных

Хранится порядок полей, булевы типы объединять вместе, так они будут занимать меньше памяти при выравнивании?

Какой alignment выбрать? он должен быть больше нуля и степенью двойки... 8 bit (1 byte)?

Схема имеет конечное состояние, то есть все дженерики превращаются в типы данных.

struct B { t: string, k: bool }
struct A { a: bool, b: u32, c: string, d: [] }

Размер векторов меньше 127 элементов можно хранить в 1, 2, 4 байтах, смотреть Varint!

https://github.com/jamesmunns/postcard
https://github.com/google/flatbuffers/tree/master/rust/flexbuffers
https://github.com/iqlusioninc/veriform/

https://github.com/bitvecto-rs/bitvec
https://github.com/dzamlo/rust-bitfield

https://github.com/iqlusioninc/veriform/tree/develop/rust/vint64/ - 1st
https://github.com/dermesser/integer-encoding-rs - 2nd
https://docs.rs/zvariant/2.5.0/zvariant/
https://github.com/paritytech/unsigned-varint
https://bitbucket.org/marshallpierce/stream-vbyte-rust
https://github.com/as-com/varint-simd

https://docs.rs/heapless/0.5.6/heapless/spsc/struct.Queue.html - single producer single consumer lock-free queue
https://docs.rs/heapless/0.5.6/heapless/mpmc/index.html - multiple producer multiple consumer lock-free queue
