use std::fmt;
#[derive(Debug)]
pub struct VarDescriptor {
pub var_name: &'static str,
pub(crate) description: Option<&'static str>,
pub(crate) default_val_fmt: Option<&'static str>,
}
impl fmt::Display for VarDescriptor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "`{}`", self.var_name)?;
if let Some(desc) = self.description {
write!(f, ": {desc}")?;
}
if let Some(default_val) = self.default_val_fmt {
write!(f, " (default: {default_val})")?;
}
Ok(())
}
}
pub trait ConfigValueDescriptor {
fn get_descriptor(&self) -> &VarDescriptor;
}
impl<T: ConfigValueDescriptor> ConfigValueDescriptor for &T {
#[inline(always)]
fn get_descriptor(&self) -> &VarDescriptor {
<T as ConfigValueDescriptor>::get_descriptor(self)
}
}
pub trait ConfigDescriptor: Sized {
fn define() -> Self;
}