From e3423c7786dc7143eb3f8cd6df2f1d7d700bee90 Mon Sep 17 00:00:00 2001 From: Nadja Reitzenstein Date: Sun, 24 Jul 2022 17:51:12 +0200 Subject: [PATCH] Improve error messages on missing config --- bffhd/config/dhall.rs | 26 +++++++++++----------- bffhd/config/mod.rs | 52 ++++++++++++++++++++++++++++++++++++++----- bin/bffhd/main.rs | 2 +- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/bffhd/config/dhall.rs b/bffhd/config/dhall.rs index 8e3e873..b933a0b 100644 --- a/bffhd/config/dhall.rs +++ b/bffhd/config/dhall.rs @@ -12,8 +12,8 @@ use crate::authorization::roles::Role; use crate::capnp::{Listen, TlsListen}; use crate::logging::LogConfig; -use std::path::Path; use miette::IntoDiagnostic; +use std::path::Path; #[derive(Debug)] struct DhallConfig<'a> { @@ -36,23 +36,23 @@ pub struct MachineDescription { /// An optional description of the Machine. #[serde( - default, - skip_serializing_if = "Option::is_none", - deserialize_with = "deser_option" + default, + skip_serializing_if = "Option::is_none", + deserialize_with = "deser_option" )] pub description: Option, #[serde( - default, - skip_serializing_if = "Option::is_none", - deserialize_with = "deser_option" + default, + skip_serializing_if = "Option::is_none", + deserialize_with = "deser_option" )] pub wiki: Option, #[serde( - default, - skip_serializing_if = "Option::is_none", - deserialize_with = "deser_option" + default, + skip_serializing_if = "Option::is_none", + deserialize_with = "deser_option" )] pub category: Option, @@ -111,9 +111,9 @@ pub struct ModuleConfig { } pub(crate) fn deser_option<'de, D, T>(d: D) -> std::result::Result, D::Error> - where - D: serde::Deserializer<'de>, - T: serde::Deserialize<'de>, +where + D: serde::Deserializer<'de>, + T: serde::Deserialize<'de>, { Ok(T::deserialize(d).ok()) } diff --git a/bffhd/config/mod.rs b/bffhd/config/mod.rs index 3adabb9..dfce376 100644 --- a/bffhd/config/mod.rs +++ b/bffhd/config/mod.rs @@ -1,10 +1,50 @@ -mod dhall; -pub use dhall::read_config_file as read; -pub use dhall::{Config, ModuleConfig, MachineDescription}; +use std::path::Path; + +use miette::Diagnostic; +use thiserror::Error; + pub(crate) use dhall::deser_option; +pub use dhall::{Config, MachineDescription, ModuleConfig}; +mod dhall; -struct ConfigBuilder; -impl ConfigBuilder { - +#[derive(Debug, Error, Diagnostic)] +pub enum ConfigError { + #[error("The config file '{0}' does not exist or is not readable")] + #[diagnostic( + code(config::notfound), + help("Make sure the config file and the directory it's in are readable by the user running bffh") + )] + NotFound(String), + #[error("The path '{0}' does not point to a file")] + #[diagnostic( + code(config::notafile), + help("The config must be a file in the dhall format") + )] + NotAFile(String), + #[error("failed to parse config: {0}")] + #[diagnostic(code(config::parse))] + Parse( + #[from] + #[source] + serde_dhall::Error, + ), } +pub fn read(file: impl AsRef) -> Result { + let path = file.as_ref(); + if !path.exists() { + return Err(ConfigError::NotFound(path.to_string_lossy().to_string())); + } + if !path.is_file() { + return Err(ConfigError::NotAFile(path.to_string_lossy().to_string())); + } + let mut config = dhall::read_config_file(file)?; + for (envvar, value) in std::env::vars() { + match envvar.as_str() { + // Do things like this? + // "BFFH_LOG" => config.logging.filter = Some(value), + _ => {} + } + } + Ok(config) +} diff --git a/bin/bffhd/main.rs b/bin/bffhd/main.rs index d52cbca..fff25b7 100644 --- a/bin/bffhd/main.rs +++ b/bin/bffhd/main.rs @@ -135,7 +135,7 @@ fn main() -> miette::Result<()> { } } - let mut config = config::read(&PathBuf::from_str(configpath).unwrap()).unwrap(); + let mut config = config::read(&PathBuf::from_str(configpath).unwrap())?; if matches.is_present("dump") { return Err(miette::miette!("DB Dumping is currently not implemented, except for the users db, using `--dump-users`"));