use config::{Config, FileFormat}; use serde::{Deserialize, Serialize}; use snafu::prelude::*; use std::fs::File; use std::io::Write; use tracing::{info, instrument}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AppConfig { pub camera_ip: String, pub camera_port: u32, pub tracker_ip: String, pub tracker_port: u32, pub tracker_refresh_rate_millis: u32, } impl Default for AppConfig { fn default() -> Self { AppConfig { camera_ip: "10.0.0.33".to_string(), camera_port: 8765, tracker_ip: "10.0.0.210".to_string(), tracker_port: 6543, tracker_refresh_rate_millis: 100, } } } pub fn load_config() -> AppConfig { Config::builder() .add_source(config::File::new("./settings.toml", FileFormat::Toml)) .build() .and_then(|val| val.try_deserialize()) .unwrap_or_default() } #[derive(Debug, Snafu)] pub enum SaveConfigError { #[snafu(display("Could not serialize app state: {source}"))] SerdeError { source: toml::ser::Error }, #[snafu(display("Could not write app state to file: {path}"))] IoError { source: std::io::Error, path: String, }, } #[instrument] pub fn save_config(config: &AppConfig) -> Result<(), SaveConfigError> { let toml_str = toml::to_string(&config).context(SerdeSnafu)?; let mut file = File::create("./settings.toml").context(IoSnafu { path: "./settings.toml", })?; file.write_all(toml_str.as_bytes()).context(IoSnafu { path: "./settings.toml", })?; info!("Config file saved successfully"); Ok(()) }