Write default config if it doesn't exist

This commit is contained in:
Andras Schmelczer 2024-12-08 15:00:57 +00:00
parent 3f5409da60
commit 3c24ad83e1
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C
4 changed files with 35 additions and 6 deletions

View file

@ -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> {
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<Self> {
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")?;

View file

@ -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(),
}
}
}

View file

@ -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(),
}
}
}

View file

@ -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<User>,