use std::ops::Deref;
use crate::{Error, ErrorCode, Result};
#[derive(Debug, Clone)]
pub(crate) enum ConfigSetting<T: PartialEq> {
Defaulted(T),
Specified(T),
}
impl<T: PartialEq> ConfigSetting<T> {
pub(crate) fn new_default(value: T) -> Self {
ConfigSetting::Defaulted(value)
}
pub(crate) fn new_specified(value: T) -> Self {
ConfigSetting::Specified(value)
}
pub(crate) fn set_specified(&mut self, setting_name: &str, value: T) -> Result<()> {
match self {
ConfigSetting::Defaulted(_) => {
*self = ConfigSetting::Specified(value);
Ok(())
}
ConfigSetting::Specified(curr_value) if *curr_value == value => Ok(()),
_ => Err(Error::new(
ErrorCode::ConfigError,
format!("{setting_name:?} is already specified"),
)),
}
}
}
impl<T: PartialEq> Deref for ConfigSetting<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
match self {
ConfigSetting::Defaulted(v) => v,
ConfigSetting::Specified(v) => v,
}
}
}