use std::sync::atomic::AtomicU32;
use serde::{Deserialize, Serialize};
pub const SHM_MAGIC: u32 = 0x534C4231;
pub const SHM_VERSION: u32 = 1;
pub const SLOT_META_SIZE: usize = 128;
pub const SHM_HEADER_SIZE: usize = 64;
pub const SLOT_FREE: u32 = 0;
pub const SLOT_READY: u32 = 1;
pub const SLOT_CLAIMED: u32 = 2;
pub const SLOT_DONE: u32 = 3;
pub const SLOT_WRITING: u32 = 4;
pub const METHOD_GET: u8 = 0;
pub const METHOD_POST: u8 = 1;
pub const METHOD_PUT: u8 = 2;
pub const METHOD_DELETE: u8 = 3;
pub const METHOD_PATCH: u8 = 4;
pub const METHOD_HEAD: u8 = 5;
pub const METHOD_OPTIONS: u8 = 6;
pub fn method_to_u8(method: &str) -> u8 {
match method {
"GET" => METHOD_GET,
"POST" => METHOD_POST,
"PUT" => METHOD_PUT,
"DELETE" => METHOD_DELETE,
"PATCH" => METHOD_PATCH,
"HEAD" => METHOD_HEAD,
"OPTIONS" => METHOD_OPTIONS,
_ => METHOD_GET,
}
}
pub fn u8_to_method(m: u8) -> &'static str {
match m {
METHOD_GET => "GET",
METHOD_POST => "POST",
METHOD_PUT => "PUT",
METHOD_DELETE => "DELETE",
METHOD_PATCH => "PATCH",
METHOD_HEAD => "HEAD",
METHOD_OPTIONS => "OPTIONS",
_ => "GET",
}
}
pub fn compute_layout(num_slots: usize, region_size: usize) -> (usize, usize) {
let heap_offset = SHM_HEADER_SIZE + (num_slots * SLOT_META_SIZE);
let heap_size = region_size.saturating_sub(heap_offset);
(heap_offset, heap_size)
}
#[repr(C)]
pub struct ShmHeader {
pub magic: u32,
pub version: u32,
pub num_slots: u32,
pub heap_offset: u32,
pub heap_size: u32,
pub alloc_head: AtomicU32,
_reserved: [u8; 40],
}
#[repr(C)]
pub struct SlotMeta {
pub status: AtomicU32,
pub req_id: [u8; 36],
pub method: u8,
_pad0: [u8; 3],
pub meta_offset: u32,
pub meta_len: u16,
_pad1: u16,
pub body_offset: u32,
pub body_len: u32,
pub body_overflow: u8,
_pad2: [u8; 3],
pub resp_status: u16,
_pad3: u16,
pub resp_meta_offset: u32,
pub resp_meta_len: u16,
_pad4: u16,
pub resp_body_offset: u32,
pub resp_body_len: u32,
pub resp_body_overflow: u8,
_pad5: [u8; 3],
_reserved: [u8; 40],
}
const _: () = assert!(std::mem::size_of::<ShmHeader>() == SHM_HEADER_SIZE);
const _: () = assert!(std::mem::size_of::<SlotMeta>() == SLOT_META_SIZE);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestMeta {
pub path: String,
pub route_pattern: String,
pub path_params: Vec<(String, String)>,
pub query: Option<String>,
pub headers: Vec<(String, String)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseMeta {
pub content_type: String,
pub headers: Vec<(String, String)>,
}