Skip to main content

code_moniker_core/core/moniker/
encoding.rs

1//! ```text
2//! [version u8 = 2]
3//! [project_len u16 LE] [project bytes]
4//!   segment[i] := [kind_len u16 LE] [kind bytes] [name_len u16 LE] [name bytes]
5//!   (repeated until end of buffer)
6//! ```
7
8use std::fmt;
9
10pub const VERSION: u8 = 2;
11pub const HEADER_FIXED_LEN: usize = 1 + 2;
12
13#[derive(Copy, Clone, Eq, PartialEq, Debug)]
14pub enum EncodingError {
15	Truncated,
16	UnknownVersion(u8),
17	ProjectOverflow,
18	SegmentOverflow,
19}
20
21impl fmt::Display for EncodingError {
22	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23		match self {
24			Self::Truncated => write!(f, "buffer too short for header"),
25			Self::UnknownVersion(v) => write!(f, "unknown encoding version: {v}"),
26			Self::ProjectOverflow => write!(f, "project bytes extend past buffer"),
27			Self::SegmentOverflow => write!(f, "segment extends past buffer"),
28		}
29	}
30}
31
32impl std::error::Error for EncodingError {}
33
34pub fn read_u16(buf: &[u8], off: usize) -> u16 {
35	u16::from_le_bytes([buf[off], buf[off + 1]])
36}
37
38pub fn write_u16(buf: &mut Vec<u8>, value: u16) {
39	buf.extend_from_slice(&value.to_le_bytes());
40}