use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use super::defaults::default_true;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RuntimeConfig {
#[serde(default = "default_callstack_limit")]
pub callstack_limit: usize,
#[serde(default = "default_error_namespace")]
pub error_namespace: String,
#[serde(default)]
pub verbose: bool,
pub snapshot_path: Option<PathBuf>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct JitConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_jit_threshold")]
pub threshold: u32,
#[serde(default)]
pub optimization_level: JitOptLevel,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(deny_unknown_fields)]
pub struct GcConfig {
pub preset: Option<GcPreset>,
pub young_size_mb: Option<usize>,
pub threads: Option<usize>,
#[serde(default)]
pub collect_stats: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum JitOptLevel {
None,
Size,
Speed,
Aggressive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum GcPreset {
LowLatency,
HighThroughput,
LowMemory,
Debug,
}
impl Default for RuntimeConfig {
fn default() -> Self {
Self {
callstack_limit: default_callstack_limit(),
error_namespace: default_error_namespace(),
verbose: false,
snapshot_path: None,
}
}
}
impl Default for JitConfig {
fn default() -> Self {
Self {
enabled: true,
threshold: default_jit_threshold(),
optimization_level: JitOptLevel::Speed,
}
}
}
impl Default for JitOptLevel {
fn default() -> Self {
Self::Speed
}
}
fn default_callstack_limit() -> usize {
200
}
fn default_error_namespace() -> String {
"".to_string()
}
fn default_jit_threshold() -> u32 {
10
}