From 6b819d6f2d41cc14a01922634ce39cad0a695a3e Mon Sep 17 00:00:00 2001 From: Charles Hall Date: Thu, 6 Jun 2024 22:44:30 -0700 Subject: [PATCH] move config loading to config module This separates concerns a bit more. We will probably want to extend the logic for config loading in the future, and that stuff should all live in the relevant place. This change points us in the right direction. --- src/config.rs | 24 +++++++++++++++++++++++- src/error.rs | 22 ++++++++++++++++------ src/main.rs | 7 +------ 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/config.rs b/src/config.rs index 990bb865..04e723f4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,8 +1,13 @@ -use std::net::{IpAddr, Ipv4Addr}; +use std::{ + net::{IpAddr, Ipv4Addr}, + path::Path, +}; use ruma::{OwnedServerName, RoomVersionId}; use serde::Deserialize; +use crate::error; + mod proxy; use proxy::ProxyConfig; @@ -153,3 +158,20 @@ fn default_turn_ttl() -> u64 { pub(crate) fn default_default_room_version() -> RoomVersionId { RoomVersionId::V10 } + +/// Load the configuration from the given path +pub(crate) async fn load

(path: P) -> Result +where + P: AsRef, +{ + use error::Config as Error; + + let path = path.as_ref(); + + toml::from_str( + &tokio::fs::read_to_string(path) + .await + .map_err(|e| Error::Read(e, path.to_owned()))?, + ) + .map_err(|e| Error::Parse(e, path.to_owned())) +} diff --git a/src/error.rs b/src/error.rs index f6286c0e..94d9a847 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,6 +1,6 @@ //! Error handling facilities -use std::{fmt, iter}; +use std::{fmt, iter, path::PathBuf}; use thiserror::Error; @@ -38,11 +38,8 @@ impl fmt::Display for DisplayWithSources<'_> { #[allow(missing_docs)] #[derive(Error, Debug)] pub(crate) enum Main { - #[error("failed to read configuration file")] - ConfigRead(#[source] std::io::Error), - - #[error("failed to parse configuration")] - ConfigParse(#[from] toml::de::Error), + #[error("failed to load configuration")] + Config(#[from] Config), #[error("failed to initialize observability")] Observability(#[from] Observability), @@ -74,3 +71,16 @@ pub(crate) enum Observability { #[error("tracing_flame error")] TracingFlame(#[from] tracing_flame::Error), } + +/// Configuration errors +// Missing docs are allowed here since that kind of information should be +// encoded in the error messages themselves anyway. +#[allow(missing_docs)] +#[derive(Error, Debug)] +pub(crate) enum Config { + #[error("failed to read configuration file {1:?}")] + Read(#[source] std::io::Error, PathBuf), + + #[error("failed to parse configuration file {1:?}")] + Parse(#[source] toml::de::Error, PathBuf), +} diff --git a/src/main.rs b/src/main.rs index e71430c4..ba1f9e29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -106,12 +106,7 @@ async fn try_main() -> Result<(), error::Main> { let args = args::parse(); - let config = toml::from_str( - &tokio::fs::read_to_string(&args.config) - .await - .map_err(Error::ConfigRead)?, - ) - .map_err(Error::ConfigParse)?; + let config = config::load(&args.config).await?; let _guard = observability::init(&config);