use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ResourcesChoice<T> {
Missing,
Inherit,
Blocks(T),
}
impl<T> ResourcesChoice<T> {
pub fn is_inherited(&self) -> bool {
matches!(self, ResourcesChoice::Inherit)
}
pub fn is_present(&self) -> bool {
!matches!(self, ResourcesChoice::Missing)
}
pub fn to_blocks(&self) -> Result<T, InheritedResources>
where T: Clone + Default {
match self {
ResourcesChoice::Missing => Ok(Default::default()),
ResourcesChoice::Inherit => Err(InheritedResources),
ResourcesChoice::Blocks(ref some) => Ok(some.clone()),
}
}
pub fn map_blocks<U, F>(self, f: F) -> ResourcesChoice<U>
where F: FnOnce(T) -> U {
match self {
ResourcesChoice::Missing => ResourcesChoice::Missing,
ResourcesChoice::Inherit => ResourcesChoice::Inherit,
ResourcesChoice::Blocks(t) => ResourcesChoice::Blocks(f(t))
}
}
}
impl<T: fmt::Display> fmt::Display for ResourcesChoice<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ResourcesChoice::Missing => Ok(()),
ResourcesChoice::Inherit => write!(f, "inherit"),
ResourcesChoice::Blocks(ref inner) => inner.fmt(f)
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct InheritedResources;