Expand description
§rawcode
Welcome to rawcode 🎉
rawcode is a no-std-compatible, simple as-is coding. The idea is similar to
bincode, but the format is even more primitive: No variable length coding, no
references – just a few fixed-length types: bytes, booleans, integers, (nested) arrays/lists and StrArray.
§Types
There’s built-in support for:
u8: Bytes are encoded as-is (i.e. 8 bit, network bit order)bool: Booleans are encoded asu8wheretrue => 0xFFandfalse => 0x00i8,u16,i16,u32,i32,u64,i64,u128,i128: Integers are encoded as two’s-complement in little-endian representation and always use their full width (i.e.u16= 2 bytes,i128= 16 bytes)structs andarrays: Fields are concatenated and encoded in order of declaration and without any padding inbetweenStrArray<LEN>: This is a special wrapper around[u8; LEN]which ensures that it’s contents are always valid UTF-8
However please note that you can also easily implement the basic traits RawcodeConstSize + RawcodeEncode +
RawcodeDecode to provide encoding and derivation for your own types/wrappers.
§Example
ⓘ
use rawcode::{Rawcode, RawcodeConstSize, RawcodeDecode, RawcodeEncode, StrArray};
/// A named test struct
#[derive(Debug, PartialEq, Eq, Rawcode)]
struct Named {
boolean: bool,
i128_: i128,
list: [u64; 7],
strarray: StrArray<9>,
}
/// An unnamed test struct
#[derive(Debug, PartialEq, Eq, Rawcode)]
struct Unnamed(bool, i128, [u64; 7], StrArray<9>);
// Create test struct and target buffer
let raw = Named {
boolean: true,
i128_: -170141183460469231731687303715884105728,
list: [0, 1, 2, 3, 4, 5, 6],
strarray: StrArray::new(b"Testolope"),
};
// Encode the named struct
let mut buf = [0; Named::SIZE];
raw.encode(&mut buf).expect("Failed to encode struct");
let decoded = Unnamed::decode(&buf).expect("Failed to decode struct");
// Validate the decoding
assert_eq!(raw.boolean, decoded.0);
assert_eq!(raw.i128_, decoded.1);
assert_eq!(raw.list, decoded.2);
assert_eq!(raw.strarray, decoded.3);Re-exports§
pub use coding::*;