Skip to main content

memlink_protocol/
types.rs

1//! Type aliases and enumerations.
2//!
3//! Defines core types including RequestId, ModuleId, StatusCode, Priority,
4//! and MessageType enums used throughout the protocol.
5
6pub type RequestId = u64;
7
8pub type ModuleId = u64;
9
10pub type MethodHash = u32;
11
12pub type TraceId = u128;
13
14pub type SpanId = u64;
15
16#[repr(u8)]
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
18pub enum StatusCode {
19    Success = 0,
20    ModuleNotFound = 1,
21    MethodNotFound = 2,
22    ExecutionError = 3,
23    Timeout = 4,
24    QuotaExceeded = 5,
25    BackpressureRejection = 6,
26}
27
28impl StatusCode {
29    pub fn from_u8(value: u8) -> Option<Self> {
30        match value {
31            0 => Some(StatusCode::Success),
32            1 => Some(StatusCode::ModuleNotFound),
33            2 => Some(StatusCode::MethodNotFound),
34            3 => Some(StatusCode::ExecutionError),
35            4 => Some(StatusCode::Timeout),
36            5 => Some(StatusCode::QuotaExceeded),
37            6 => Some(StatusCode::BackpressureRejection),
38            _ => None,
39        }
40    }
41
42    pub fn as_u8(self) -> u8 {
43        self as u8
44    }
45
46    pub fn is_success(self) -> bool {
47        matches!(self, StatusCode::Success)
48    }
49
50    pub fn is_error(self) -> bool {
51        !self.is_success()
52    }
53}
54
55#[repr(u8)]
56#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, serde::Serialize, serde::Deserialize)]
57pub enum Priority {
58    Low = 0,
59    #[default]
60    Normal = 1,
61    High = 2,
62    Critical = 3,
63}
64
65impl Priority {
66    pub fn from_u8(value: u8) -> Option<Self> {
67        match value {
68            0 => Some(Priority::Low),
69            1 => Some(Priority::Normal),
70            2 => Some(Priority::High),
71            3 => Some(Priority::Critical),
72            _ => None,
73        }
74    }
75
76    pub fn as_u8(self) -> u8 {
77        self as u8
78    }
79}
80
81#[repr(u8)]
82#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
83pub enum MessageType {
84    Request = 0,
85    Response = 1,
86    Error = 2,
87    StreamHandle = 3,
88    HealthCheck = 16,
89    LoadModule = 32,
90    UnloadModule = 33,
91    Stats = 48,
92    Event = 96,
93}
94
95impl MessageType {
96    pub fn from_u8(value: u8) -> Option<Self> {
97        match value {
98            0 => Some(MessageType::Request),
99            1 => Some(MessageType::Response),
100            2 => Some(MessageType::Error),
101            3 => Some(MessageType::StreamHandle),
102            16 => Some(MessageType::HealthCheck),
103            32 => Some(MessageType::LoadModule),
104            33 => Some(MessageType::UnloadModule),
105            48 => Some(MessageType::Stats),
106            96 => Some(MessageType::Event),
107            _ => None,
108        }
109    }
110
111    pub fn as_u8(self) -> u8 {
112        self as u8
113    }
114
115    pub fn expects_response(self) -> bool {
116        matches!(
117            self,
118            MessageType::Request
119                | MessageType::HealthCheck
120                | MessageType::LoadModule
121                | MessageType::UnloadModule
122                | MessageType::Stats
123        )
124    }
125}