From 3c24ad83e11698b7f1bf888d88bc89f2b91db3e7 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sun, 8 Dec 2024 15:00:57 +0000 Subject: [PATCH] Write default config if it doesn't exist --- backend/sync_server/src/config.rs | 20 ++++++++++++++----- .../sync_server/src/config/database_config.rs | 9 +++++++++ .../sync_server/src/config/server_config.rs | 10 ++++++++++ backend/sync_server/src/config/user_config.rs | 2 +- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/backend/sync_server/src/config.rs b/backend/sync_server/src/config.rs index 6582fb7e..07f952af 100644 --- a/backend/sync_server/src/config.rs +++ b/backend/sync_server/src/config.rs @@ -2,6 +2,7 @@ use std::path::Path; use anyhow::{Context, Result}; use database_config::DatabaseConfig; +use log::warn; use serde::{Deserialize, Serialize}; use server_config::ServerConfig; use tokio::fs; @@ -11,24 +12,33 @@ pub mod database_config; pub mod server_config; pub mod user_config; -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, Default)] pub struct Config { + #[serde(default)] pub database: DatabaseConfig, + #[serde(default)] pub server: ServerConfig, + #[serde(default)] pub users: UserConfig, } impl Config { pub async fn read(path: &Path) -> Result { - Self::load_from_file(path) - .await - .with_context(|| format!("Cannot load configuration from disk from ({path:?})")) + if path.exists() { + Self::load_from_file(path).await + } else { + warn!("Configuration file not found, writing default configuration to {path:?}"); + + let config = Config::default(); + config.write(path).await?; + Ok(config) + } } pub async fn load_from_file(path: &Path) -> Result { let contents = fs::read_to_string(path) .await - .context("Failed to read configuration file")?; + .with_context(|| format!("Cannot load configuration from disk from ({path:?})"))?; let config = serde_yaml::from_str(&contents).context("Failed to parse configuration")?; diff --git a/backend/sync_server/src/config/database_config.rs b/backend/sync_server/src/config/database_config.rs index a84d6aa9..3c314023 100644 --- a/backend/sync_server/src/config/database_config.rs +++ b/backend/sync_server/src/config/database_config.rs @@ -21,3 +21,12 @@ fn default_max_connections() -> u32 { debug!("Using default max connections: {}", DEFAULT_MAX_CONNECTIONS); DEFAULT_MAX_CONNECTIONS } + +impl Default for DatabaseConfig { + fn default() -> Self { + Self { + sqlite_url: default_sqlite_url(), + max_connections: default_max_connections(), + } + } +} diff --git a/backend/sync_server/src/config/server_config.rs b/backend/sync_server/src/config/server_config.rs index 94f6b7ef..dd0b06d8 100644 --- a/backend/sync_server/src/config/server_config.rs +++ b/backend/sync_server/src/config/server_config.rs @@ -31,3 +31,13 @@ fn default_max_body_size_mb() -> usize { ); DEFAULT_MAX_BODY_SIZE_MB } + +impl Default for ServerConfig { + fn default() -> Self { + Self { + host: default_host(), + port: default_port(), + max_body_size_mb: default_max_body_size_mb(), + } + } +} diff --git a/backend/sync_server/src/config/user_config.rs b/backend/sync_server/src/config/user_config.rs index 25a08010..5980b746 100644 --- a/backend/sync_server/src/config/user_config.rs +++ b/backend/sync_server/src/config/user_config.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, Default)] pub struct UserConfig { #[serde(default = "Vec::new")] pub users: Vec,