use std::path::PathBuf;
use core_types::{ErrorCode, ErrorDomain, RtError};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ShmRateLimitConfig {
pub max_bytes_per_sec: u64,
pub burst_bytes: u64,
}
impl ShmRateLimitConfig {
pub fn new(max_bytes_per_sec: u64, burst_bytes: u64) -> Self {
Self {
max_bytes_per_sec,
burst_bytes,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ShmTransportConfig {
pub namespace: String,
pub directory: PathBuf,
pub segment_payload_bytes: usize,
pub segment_count: usize,
pub rate_limit: Option<ShmRateLimitConfig>,
}
impl Default for ShmTransportConfig {
fn default() -> Self {
Self {
namespace: "robotrt-default".to_string(),
directory: std::env::temp_dir().join("robotrt-shm"),
segment_payload_bytes: 8 * 1024 * 1024,
segment_count: 8,
rate_limit: None,
}
}
}
pub(super) fn validate_cfg(cfg: &ShmTransportConfig) -> Result<(), RtError> {
if cfg.segment_payload_bytes == 0 {
return Err(RtError::new(
ErrorCode::InvalidState,
ErrorDomain::Core,
false,
"segment_payload_bytes must be > 0",
));
}
if cfg.segment_count == 0 {
return Err(RtError::new(
ErrorCode::InvalidState,
ErrorDomain::Core,
false,
"segment_count must be > 0",
));
}
if cfg.namespace.is_empty() {
return Err(RtError::new(
ErrorCode::InvalidState,
ErrorDomain::Core,
false,
"namespace must not be empty",
));
}
if let Some(limit) = &cfg.rate_limit
&& (limit.max_bytes_per_sec == 0 || limit.burst_bytes == 0)
{
return Err(RtError::new(
ErrorCode::InvalidState,
ErrorDomain::Core,
false,
"rate limit config requires max_bytes_per_sec > 0 and burst_bytes > 0",
));
}
Ok(())
}