From baba8f82bfab079a1e8f1e36322cecbbb35e78c9 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Mon, 24 Mar 2025 21:57:56 +0000 Subject: [PATCH] Take config path as input --- backend/sync_server/src/cli.rs | 1 + backend/sync_server/src/cli/args.rs | 38 +++++++++++++++++++++ backend/sync_server/src/consts.rs | 2 +- backend/sync_server/src/main.rs | 7 +++- backend/sync_server/src/server.rs | 6 ++-- backend/sync_server/src/server/app_state.rs | 11 +++--- 6 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 backend/sync_server/src/cli.rs create mode 100644 backend/sync_server/src/cli/args.rs diff --git a/backend/sync_server/src/cli.rs b/backend/sync_server/src/cli.rs new file mode 100644 index 0000000..6e10f4a --- /dev/null +++ b/backend/sync_server/src/cli.rs @@ -0,0 +1 @@ +pub mod args; diff --git a/backend/sync_server/src/cli/args.rs b/backend/sync_server/src/cli/args.rs new file mode 100644 index 0000000..ec5739f --- /dev/null +++ b/backend/sync_server/src/cli/args.rs @@ -0,0 +1,38 @@ +use std::ffi::OsString; + +use clap::{Parser, ValueEnum}; + +/// Simple program to greet a person +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +pub struct Args { + #[arg( + long, + require_equals = true, + value_name = "WHEN", + num_args = 0..=1, + default_value_t = ColorWhen::Auto, + default_missing_value = "always", + value_enum + )] + pub color: ColorWhen, + + #[arg(last = true)] + pub config_path: Option, +} + +#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)] +pub enum ColorWhen { + Always, + Auto, + Never, +} + +impl std::fmt::Display for ColorWhen { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.to_possible_value() + .expect("no values are skipped") + .get_name() + .fmt(f) + } +} diff --git a/backend/sync_server/src/consts.rs b/backend/sync_server/src/consts.rs index f38012d..bec936b 100644 --- a/backend/sync_server/src/consts.rs +++ b/backend/sync_server/src/consts.rs @@ -1,4 +1,4 @@ -pub const CONFIG_PATH: &str = "config.yml"; +pub const DEFAULT_CONFIG_PATH: &str = "config.yml"; pub const DEFAULT_DATABASES_DIRECTORY_PATH: &str = "databases"; pub const DEFAULT_HOST: &str = "127.0.0.1"; pub const DEFAULT_PORT: u16 = 3000; diff --git a/backend/sync_server/src/main.rs b/backend/sync_server/src/main.rs index 61f6f2a..2b8abcc 100644 --- a/backend/sync_server/src/main.rs +++ b/backend/sync_server/src/main.rs @@ -1,3 +1,4 @@ +mod cli; mod config; mod consts; mod database; @@ -6,6 +7,8 @@ mod server; mod utils; use anyhow::{Context as _, Result}; +use clap::Parser; +use cli::args::Args; use errors::{SyncServerError, init_error}; use log::info; use server::create_server; @@ -13,6 +16,8 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; #[tokio::main] async fn main() -> Result<(), SyncServerError> { + let args = Args::parse(); + tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| { @@ -33,7 +38,7 @@ async fn main() -> Result<(), SyncServerError> { env!("CARGO_PKG_VERSION") ); - create_server() + create_server(args.config_path) .await .context("Failed to start server") .map_err(init_error) diff --git a/backend/sync_server/src/server.rs b/backend/sync_server/src/server.rs index 511187e..083be5b 100644 --- a/backend/sync_server/src/server.rs +++ b/backend/sync_server/src/server.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{ffi::OsString, sync::Arc}; use aide::{ axum::{ @@ -48,11 +48,11 @@ mod requests; mod responses; mod update_document; -pub async fn create_server() -> Result<()> { +pub async fn create_server(config_path: Option) -> Result<()> { aide::r#gen::on_error(|err| error!("{err}")); aide::r#gen::extract_schemas(true); - let app_state = AppState::try_new() + let app_state = AppState::try_new(config_path) .await .context("Failed to initialise app state")?; diff --git a/backend/sync_server/src/server/app_state.rs b/backend/sync_server/src/server/app_state.rs index 0b02abc..2a8a96e 100644 --- a/backend/sync_server/src/server/app_state.rs +++ b/backend/sync_server/src/server/app_state.rs @@ -1,6 +1,8 @@ +use std::ffi::OsString; + use anyhow::Result; -use crate::{config::Config, consts::CONFIG_PATH, database::Database}; +use crate::{config::Config, consts::DEFAULT_CONFIG_PATH, database::Database}; #[derive(Clone, Debug)] pub struct AppState { @@ -9,10 +11,11 @@ pub struct AppState { } impl AppState { - pub async fn try_new() -> Result { - let path = std::path::Path::new(CONFIG_PATH); + pub async fn try_new(config_path: Option) -> Result { + let config_path = config_path.unwrap_or_else(|| OsString::from(DEFAULT_CONFIG_PATH)); + let path = std::path::PathBuf::from(config_path); - let config = Config::read_or_create(path).await?; + let config = Config::read_or_create(&path).await?; let database = Database::try_new(&config.database).await?; Ok(Self { config, database })