use serde::{Deserialize, Serialize};
use std::net::IpAddr;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NetConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub mesh: MeshConfig,
#[serde(default)]
pub policy: PolicyConfig,
#[serde(default)]
pub observability: ObservabilityConfig,
#[serde(default)]
pub wasi: WasiRuntimeConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeshConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_mesh_subnet")]
pub subnet: String,
#[serde(default = "default_key_path")]
pub key_path: PathBuf,
#[serde(default = "default_wg_port")]
pub listen_port: u16,
}
impl Default for MeshConfig {
fn default() -> Self {
Self {
enabled: false,
subnet: default_mesh_subnet(),
key_path: default_key_path(),
listen_port: default_wg_port(),
}
}
}
fn default_mesh_subnet() -> String {
"10.42.0.0/16".to_string()
}
fn default_key_path() -> PathBuf {
dirs::data_dir()
.unwrap_or_else(|| PathBuf::from("/tmp"))
.join("tatara")
.join("wireguard.key")
}
fn default_wg_port() -> u16 {
51820
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PolicyConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_policy_action")]
pub default_action: String,
}
fn default_policy_action() -> String {
"allow".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ObservabilityConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_flow_capacity")]
pub flow_capacity: usize,
}
fn default_flow_capacity() -> usize {
100_000
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct WasiRuntimeConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_wasi_max_memory")]
pub max_memory_bytes: u64,
#[serde(default = "default_wasi_max_fuel")]
pub max_fuel: u64,
}
fn default_wasi_max_memory() -> u64 {
256 * 1024 * 1024 }
fn default_wasi_max_fuel() -> u64 {
1_000_000_000 }