use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DisplayMode {
#[default]
Link,
Tooltip,
Both,
}
#[derive(Debug, thiserror::Error)]
#[error("invalid display-mode '{value}'; expected 'link', 'tooltip', or 'both'")]
pub struct InvalidDisplayMode {
pub value: String,
}
impl FromStr for DisplayMode {
type Err = InvalidDisplayMode;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"link" => Ok(Self::Link),
"tooltip" => Ok(Self::Tooltip),
"both" => Ok(Self::Both),
other => Err(InvalidDisplayMode {
value: other.to_owned(),
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_each_variant() {
assert_eq!("link".parse::<DisplayMode>().unwrap(), DisplayMode::Link);
assert_eq!(
"tooltip".parse::<DisplayMode>().unwrap(),
DisplayMode::Tooltip
);
assert_eq!("both".parse::<DisplayMode>().unwrap(), DisplayMode::Both);
}
#[test]
fn rejects_unknown_value() {
let err = "nonsense".parse::<DisplayMode>().unwrap_err();
assert_eq!(err.value, "nonsense");
assert!(err.to_string().contains("nonsense"));
}
#[test]
fn rejects_empty() {
assert!("".parse::<DisplayMode>().is_err());
}
#[test]
fn default_is_link() {
assert_eq!(DisplayMode::default(), DisplayMode::Link);
}
}