# `ucpack` [![docs.rs](https://img.shields.io/docsrs/ucpack?style=flat&label=docs.rs&color=%23B7410E)](https://docs.rs/ucpack)
Rust implementation of the ucpack serialization format used in the Arduino Alvik using [serde](https://docs.rs/serde). This crate does not implement the body API itself, but rather the binary protocol and format it uses to encode its messages. ### The crate This crate exposes a struct called `UcPack` which you can initialize to start encoding and decoding [serde](https://docs.rs/serde) compatible data types and structures. > [!WARNING] > Not every type is compatible with ucpack. Namely any integer above 16 bits, lists and maps. You can also `const` initialize `UcPack` and use it `const`-ly from anywhere if carrying state isn't an option: ```rust const packer: UcPack = UcPack::new(b'A', b'#'); fn main() { packer.serialize_slice(...); // ecc.. } ``` ### The protocol _NOTE: Table gently borrowed from ucpack's c++ repo_ A packet is managed as: | index_byte | message length | message | stop_byte | crc8 | |:--------------------:|:--------------:|:---------------------------:|:--------------------:|:------:| | 1 byte (_default A_) | 1 byte | N bytes from message length | 1 byte (_default #_) | 1 byte | This crate, opposed to the c++ and micropython respectives, is agnostic across the `message` content (referred to by the name `payload` in this crate).