Document config

This commit is contained in:
Mo 2023-02-23 17:10:24 +01:00
parent a0c2edba56
commit 7992857e5f
3 changed files with 22 additions and 11 deletions

View file

@ -1,9 +1,8 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use serde::Deserialize; use serde::Deserialize;
use std::env; use std::{env, fs::File, io::BufReader};
use std::fs::File;
use std::io::BufReader;
/// Email server credentials.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct EmailServer { pub struct EmailServer {
pub server_name: String, pub server_name: String,
@ -11,30 +10,35 @@ pub struct EmailServer {
pub password: String, pub password: String,
} }
/// UTC offset for time formatting.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct UtcOffset { pub struct UtcOffset {
pub hours: i8, pub hours: i8,
pub minutes: i8, pub minutes: i8,
} }
/// Error messages for localization.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct ErrorMessages { pub struct ErrorMessages {
pub captcha_error: String, pub captcha_error: String,
pub email_error: String, pub email_error: String,
} }
/// Field localization strings in a form with label and invalid feedback on wrong field input.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Field { pub struct Field {
pub label: String, pub label: String,
pub invalid_feedback: String, pub invalid_feedback: String,
} }
/// Localization strings.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Strings { pub struct Strings {
pub description: String, pub description: String,
pub title: String, pub title: String,
pub name_field: Field, pub name_field: Field,
pub email_field: Field, pub email_field: Field,
/// No invalid feedback because it is optional.
pub telefon_field_label: String, pub telefon_field_label: String,
pub message_field: Field, pub message_field: Field,
pub captcha_field: Field, pub captcha_field: Field,
@ -42,13 +46,19 @@ pub struct Strings {
pub success: String, pub success: String,
} }
/// Configuration.
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Config { pub struct Config {
/// The language tag of the HTML file.
pub lang: String, pub lang: String,
/// The path prefix of all routes.
pub path_prefix: String, pub path_prefix: String,
/// The server socket address including port.
pub socket_address: String, pub socket_address: String,
pub email_server: EmailServer, pub email_server: EmailServer,
/// From mailbox.
pub email_from: String, pub email_from: String,
/// To mailbox.
pub email_to: String, pub email_to: String,
pub log_file: String, pub log_file: String,
pub utc_offset: UtcOffset, pub utc_offset: UtcOffset,
@ -57,16 +67,17 @@ pub struct Config {
} }
impl Config { impl Config {
pub fn new() -> Result<Self> { pub fn build() -> Result<Self> {
// The environment variable with the path to the config file.
let config_file_var = "CF_CONFIG_FILE"; let config_file_var = "CF_CONFIG_FILE";
let config_path = env::var(config_file_var) let config_path = env::var(config_file_var)
.with_context(|| format!("Environment variable {config_file_var} missing!"))?; .with_context(|| format!("Environment variable {config_file_var} missing!"))?;
let config_file = File::open(&config_path) let file = File::open(&config_path)
.with_context(|| format!("Can not open the config file at the path {config_path}"))?; .with_context(|| format!("Can not open the config file at the path {config_path}"))?;
let config_reader = BufReader::new(config_file); let reader = BufReader::new(file);
let config: Self = serde_yaml::from_reader(config_reader) let config =
.context("Can not parse the YAML config file!")?; serde_yaml::from_reader(reader).context("Can not parse the YAML config file!")?;
Ok(config) Ok(config)
} }

View file

@ -13,7 +13,7 @@ pub struct Mailer {
} }
impl Mailer { impl Mailer {
pub fn new(config: &Config) -> Result<Self> { pub fn build(config: &Config) -> Result<Self> {
let creds = Credentials::new( let creds = Credentials::new(
config.email_server.email.clone(), config.email_server.email.clone(),
config.email_server.password.clone(), config.email_server.password.clone(),

View file

@ -13,8 +13,8 @@ pub struct AppState {
impl AppState { impl AppState {
pub fn build() -> Result<Self> { pub fn build() -> Result<Self> {
let config = Config::new()?; let config = Config::build()?;
let mailer = Arc::new(Mailer::new(&config)?); let mailer = Arc::new(Mailer::build(&config)?);
let config = Arc::new(config); let config = Arc::new(config);
let captcha_solutions = Arc::new(Mutex::new(CaptchaSolutions::default())); let captcha_solutions = Arc::new(Mutex::new(CaptchaSolutions::default()));