diff options
Diffstat (limited to 'crates/sellershut/src')
| -rw-r--r-- | crates/sellershut/src/config.rs | 26 | ||||
| -rw-r--r-- | crates/sellershut/src/config/port.rs | 18 | ||||
| -rw-r--r-- | crates/sellershut/src/main.rs | 1 |
3 files changed, 42 insertions, 3 deletions
diff --git a/crates/sellershut/src/config.rs b/crates/sellershut/src/config.rs index 65383a6..5a63bcc 100644 --- a/crates/sellershut/src/config.rs +++ b/crates/sellershut/src/config.rs @@ -1,17 +1,22 @@ mod logging; +mod port; -use std::path::PathBuf; +use std::{path::PathBuf, str::FromStr}; use clap::Parser; use logging::LogLevel; +use url::Url; + +use crate::config::port::port_in_range; pub const LOG_LEVEL: &str = "LOG_LEVEL"; +const DEFAULT_DB: &str = "postgres://postgres:password@localhost:5432/postgres"; #[derive(Parser, Debug)] -#[command(version, about, long_about = None)] +#[command(version, about, long_about = None, name = env!("CARGO_PKG_NAME"))] pub struct Cli { /// Sets the port the server listens on - #[arg(short, long, default_value_t = 2210, env = "PORT")] + #[arg(short, long, default_value_t = 2210, env = "PORT", value_parser = port_in_range)] pub port: u16, /// Sets the application log level @@ -25,6 +30,10 @@ pub struct Cli { /// Request timeout duration (in seconds) #[arg(short, long, default_value_t = 10, env = "TIMEOUT_DURATION")] pub timeout_duration: u64, + + /// Database URL + #[arg(short, long, value_name = "DB_URL", env = "DB_URL", default_value_t = Url::from_str(DEFAULT_DB).expect("database_url"))] + pub database_url: Url, } impl Cli { @@ -32,3 +41,14 @@ impl Cli { self.log_level.into() } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn verify_cli() { + use clap::CommandFactory; + Cli::command().debug_assert(); + } +} diff --git a/crates/sellershut/src/config/port.rs b/crates/sellershut/src/config/port.rs new file mode 100644 index 0000000..c7c8d62 --- /dev/null +++ b/crates/sellershut/src/config/port.rs @@ -0,0 +1,18 @@ +use std::ops::RangeInclusive; + +const PORT_RANGE: RangeInclusive<usize> = 1..=65535; + +pub fn port_in_range(s: &str) -> Result<u16, String> { + let port: usize = s + .parse() + .map_err(|_| format!("`{s}` isn't a port number"))?; + if PORT_RANGE.contains(&port) { + Ok(port as u16) + } else { + Err(format!( + "port not in range {}-{}", + PORT_RANGE.start(), + PORT_RANGE.end() + )) + } +} diff --git a/crates/sellershut/src/main.rs b/crates/sellershut/src/main.rs index 07e6193..c6ac12f 100644 --- a/crates/sellershut/src/main.rs +++ b/crates/sellershut/src/main.rs @@ -13,6 +13,7 @@ use crate::logging::initialise_logging; #[tokio::main] async fn main() -> anyhow::Result<()> { let config = config::Cli::parse(); + dbg!(&config); initialise_logging(&config); let app = server::router(&config); |
