pub mod loader;
pub mod runtime;
pub mod schema;
pub mod secrets;
pub mod validator;
use anyhow::{Context, Result};
use loader::{detect_config_path, load_json5};
use runtime::{IntoRuntime, RuntimeConfig};
pub fn load() -> Result<RuntimeConfig> {
let path = detect_config_path().with_context(
|| "no config file found. Run `rsclaw setup` to create one, or set RSCLAW_CONFIG_PATH.",
)?;
tracing::info!(path = %path.display(), "loading config");
load_from_path(&path)
}
pub fn load_quiet() -> Result<RuntimeConfig> {
let path = detect_config_path().with_context(
|| "no config file found. Run `rsclaw setup` to create one, or set RSCLAW_CONFIG_PATH.",
)?;
load_from_path(&path)
}
fn load_from_path(path: &std::path::Path) -> Result<RuntimeConfig> {
let runtime = load_json5(&path)
.with_context(|| format!("failed to load config: {}", path.display()))?
.into_runtime()?;
validator::validate(&runtime)?;
let runtime = apply_env_overrides(runtime);
Ok(runtime)
}
fn apply_env_overrides(mut cfg: RuntimeConfig) -> RuntimeConfig {
if let Ok(port_str) = std::env::var("RSCLAW_PORT")
&& let Ok(port) = port_str.parse::<u16>()
{
cfg.gateway.port = port;
}
cfg
}
pub fn load_from(path: std::path::PathBuf) -> Result<RuntimeConfig> {
let runtime = load_json5(&path)?.into_runtime()?;
validator::validate(&runtime)?;
Ok(runtime)
}