use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct AppConfig {
#[serde(default = "default_host")]
pub host: String,
#[serde(default = "default_port")]
pub port: u16,
pub workers: Option<usize>,
#[serde(default)]
pub debug: bool,
#[serde(default = "default_server_name")]
pub server_name: String,
#[serde(default)]
pub nats_url: Option<String>,
#[serde(default = "default_true")]
pub enable_gcp_token_api: bool,
#[serde(default)]
pub disable_metrics: bool,
#[serde(default)]
pub refs_in_state: bool,
#[serde(default)]
pub projector_owns_snapshot: bool,
#[serde(default = "default_true")]
pub auto_recreate_runtime: bool,
#[serde(default = "default_sweep_interval")]
pub runtime_sweep_interval: u64,
#[serde(default = "default_offline_seconds")]
pub runtime_offline_seconds: u64,
#[serde(default)]
pub public_server_url: Option<String>,
#[serde(default)]
pub server_machine_id: Option<u16>,
#[serde(default)]
pub shard_index: Option<u32>,
#[serde(default)]
pub shard_count: Option<u32>,
}
fn default_host() -> String {
"0.0.0.0".to_string()
}
fn default_port() -> u16 {
8082
}
fn default_server_name() -> String {
"noetl-control-plane".to_string()
}
fn default_true() -> bool {
true
}
fn default_sweep_interval() -> u64 {
30
}
fn default_offline_seconds() -> u64 {
60
}
impl AppConfig {
pub fn from_env() -> Result<Self, envy::Error> {
envy::prefixed("NOETL_").from_env::<AppConfig>()
}
pub fn bind_address(&self) -> String {
format!("{}:{}", self.host, self.port)
}
}
impl Default for AppConfig {
fn default() -> Self {
Self {
host: default_host(),
port: default_port(),
workers: None,
debug: false,
server_name: default_server_name(),
nats_url: None,
enable_gcp_token_api: true,
disable_metrics: false,
refs_in_state: false,
projector_owns_snapshot: false,
auto_recreate_runtime: true,
runtime_sweep_interval: default_sweep_interval(),
runtime_offline_seconds: default_offline_seconds(),
public_server_url: None,
server_machine_id: None,
shard_index: None,
shard_count: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = AppConfig::default();
assert_eq!(config.host, "0.0.0.0");
assert_eq!(config.port, 8082);
assert!(!config.debug);
}
#[test]
fn test_bind_address() {
let config = AppConfig::default();
assert_eq!(config.bind_address(), "0.0.0.0:8082");
}
}