use serde::{Deserialize, Serialize};
use crate::{
profile::{EdgeProfile, ProfilePreset},
targets::EdgeTarget,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum SchedulerMode {
#[default]
SingleCore,
MultiCore,
}
impl std::fmt::Display for SchedulerMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SchedulerMode::SingleCore => write!(f, "single_core"),
SchedulerMode::MultiCore => write!(f, "multi_core"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EdgeConfig {
pub target: EdgeTarget,
pub profile: EdgeProfile,
pub shm_size_kb: u32,
pub max_processes: u16,
pub scheduler_mode: SchedulerMode,
pub offline_buffer_kb: u32,
}
impl Default for EdgeConfig {
fn default() -> Self {
let preset = EdgeProfile::Minimal.preset();
Self {
target: EdgeTarget::X86_64Linux,
profile: EdgeProfile::Minimal,
shm_size_kb: preset.shm_size_kb,
max_processes: preset.max_processes,
scheduler_mode: preset.scheduler_mode,
offline_buffer_kb: preset.offline_buffer_kb,
}
}
}
impl EdgeConfig {
pub fn from_profile(target: EdgeTarget, profile: EdgeProfile) -> Self {
let preset: ProfilePreset = profile.preset();
Self {
target,
profile,
shm_size_kb: preset.shm_size_kb,
max_processes: preset.max_processes,
scheduler_mode: preset.scheduler_mode,
offline_buffer_kb: preset.offline_buffer_kb,
}
}
pub fn from_yaml(yaml: &str) -> Result<Self, crate::error::EdgeFault> {
serde_yaml::from_str(yaml).map_err(|_| crate::error::EdgeFault::ConfigParseFailed)
}
pub fn to_yaml(&self) -> Result<String, crate::error::EdgeFault> {
serde_yaml::to_string(self).map_err(|_| crate::error::EdgeFault::SerializeFailed)
}
pub fn from_file(path: &std::path::Path) -> Result<Self, crate::error::EdgeFault> {
let content =
std::fs::read_to_string(path).map_err(|_| crate::error::EdgeFault::ConfigReadFailed)?;
Self::from_yaml(&content)
}
pub fn shm_size_mb(&self) -> u32 {
self.shm_size_kb / 1024
}
pub fn validate(&self) -> bool {
self.shm_size_kb > 0 && self.max_processes > 0
}
}