aboutsummaryrefslogtreecommitdiffstats
path: root/mumlib
diff options
context:
space:
mode:
Diffstat (limited to 'mumlib')
-rw-r--r--mumlib/src/config.rs23
-rw-r--r--mumlib/src/error.rs39
2 files changed, 52 insertions, 10 deletions
diff --git a/mumlib/src/config.rs b/mumlib/src/config.rs
index 74b4b9c..9394b85 100644
--- a/mumlib/src/config.rs
+++ b/mumlib/src/config.rs
@@ -1,4 +1,6 @@
+use crate::error::ConfigError;
use crate::DEFAULT_PORT;
+
use log::*;
use serde::{Deserialize, Serialize};
use std::convert::TryFrom;
@@ -21,7 +23,7 @@ pub struct Config {
}
impl Config {
- pub fn write_default_cfg(&self, create: bool) -> Result<(), std::io::Error> {
+ pub fn write_default_cfg(&self, create: bool) -> Result<(), ConfigError> {
let path = default_cfg_path();
// Possible race here. It's fine since it shows when:
@@ -34,13 +36,13 @@ impl Config {
// do anything anyways.
if !create && !path.exists() {
- return Ok(());
+ return Err(ConfigError::WontCreateFile);
}
- fs::write(
+ Ok(fs::write(
&path,
- toml::to_string(&TOMLConfig::from(self.clone())).unwrap(), //TODO handle panic
- )
+ toml::to_string(&TOMLConfig::from(self.clone()))?,
+ )?)
}
}
@@ -139,19 +141,20 @@ impl From<Config> for TOMLConfig {
config
.servers
.into_iter()
- .map(|s| Value::try_from::<ServerConfig>(s).unwrap()) //TODO handle panic
+ // Safe since all ServerConfigs are valid TOML
+ .map(|s| Value::try_from::<ServerConfig>(s).unwrap())
.collect(),
),
}
}
}
-pub fn read_default_cfg() -> Config {
+pub fn read_default_cfg() -> Result<Config, ConfigError> {
let path = default_cfg_path();
match fs::read_to_string(&path) {
Ok(s) => {
- let toml_config: TOMLConfig = toml::from_str(&s).expect("Invalid TOML in config file"); //TODO handle panic
- return Config::try_from(toml_config).expect("Invalid config in TOML"); //TODO handle panic
+ let toml_config: TOMLConfig = toml::from_str(&s)?;
+ Ok(Config::try_from(toml_config)?)
},
Err(e) => {
if matches!(e.kind(), std::io::ErrorKind::NotFound) && !path.exists() {
@@ -159,7 +162,7 @@ pub fn read_default_cfg() -> Config {
} else {
error!("Error reading config file: {}", e);
}
- return Config::default();
+ return Ok(Config::default());
}
}
}
diff --git a/mumlib/src/error.rs b/mumlib/src/error.rs
index f6a02a7..6b7dccd 100644
--- a/mumlib/src/error.rs
+++ b/mumlib/src/error.rs
@@ -42,3 +42,42 @@ impl fmt::Display for ChannelIdentifierError {
}
}
}
+
+pub enum ConfigError {
+ InvalidConfig,
+ TOMLErrorSer(toml::ser::Error),
+ TOMLErrorDe(toml::de::Error),
+
+ WontCreateFile,
+ IOError(std::io::Error),
+}
+
+impl fmt::Display for ConfigError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ ConfigError::InvalidConfig => write!(f, "Invalid configuration"),
+ ConfigError::TOMLErrorSer(e) => write!(f, "Invalid TOML when serializing: {}", e),
+ ConfigError::TOMLErrorDe(e) => write!(f, "Invalid TOML when deserializing: {}", e),
+ ConfigError::WontCreateFile => write!(f, "File does not exist but caller didn't allow creation"),
+ ConfigError::IOError(e) => write!(f, "IO error: {}", e),
+ }
+ }
+}
+
+impl From<std::io::Error> for ConfigError {
+ fn from(e: std::io::Error) -> Self {
+ ConfigError::IOError(e)
+ }
+}
+
+impl From<toml::ser::Error> for ConfigError {
+ fn from(e: toml::ser::Error) -> Self {
+ ConfigError::TOMLErrorSer(e)
+ }
+}
+
+impl From<toml::de::Error> for ConfigError {
+ fn from(e: toml::de::Error) -> Self {
+ ConfigError::TOMLErrorDe(e)
+ }
+}