use serde::Serialize;
use crate::utils::wire;
pub const DEFAULT_MEMORY_BUDGET_PERCENT_BPS: u16 = 2500;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct FileExecutionSettingsV1 {
pub memory_budget_percent_bps: u16,
pub memory_budget_bytes: u32,
}
impl FileExecutionSettingsV1 {
pub const WIRE_LEN: usize = 16;
#[must_use]
pub const fn default_engine() -> Self {
Self {
memory_budget_percent_bps: 0,
memory_budget_bytes: 0,
}
}
#[must_use]
pub fn from_index_header_tail(tail: &[u8]) -> Self {
debug_assert!(tail.len() >= Self::WIRE_LEN);
Self {
memory_budget_percent_bps: wire::u16_le_at(tail, 0),
memory_budget_bytes: wire::u32_le_at(tail, 4),
}
}
pub fn write_index_header_tail(&self, tail: &mut [u8]) {
debug_assert!(tail.len() >= Self::WIRE_LEN);
let mut o = 0usize;
wire::put_u16_le(tail, &mut o, self.memory_budget_percent_bps);
wire::put_u16_le(tail, &mut o, 0);
wire::put_u32_le(tail, &mut o, self.memory_budget_bytes);
wire::put_u64_le(tail, &mut o, 0);
debug_assert_eq!(o, Self::WIRE_LEN);
}
#[must_use]
pub const fn effective_percent_bps(self) -> u16 {
if self.memory_budget_percent_bps == 0 {
DEFAULT_MEMORY_BUDGET_PERCENT_BPS
} else {
self.memory_budget_percent_bps
}
}
}