use std::fmt;
use std::str::FromStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReviewerKind {
Concept,
Quality,
Behavior,
Docs,
Evaluator,
}
impl ReviewerKind {
pub const ALL: [ReviewerKind; 5] = [
Self::Concept,
Self::Quality,
Self::Behavior,
Self::Docs,
Self::Evaluator,
];
pub fn as_str(&self) -> &'static str {
match self {
Self::Concept => "concept",
Self::Quality => "quality",
Self::Behavior => "behavior",
Self::Docs => "docs",
Self::Evaluator => "evaluator",
}
}
pub fn title(&self) -> &'static str {
match self {
Self::Concept => "Concept",
Self::Quality => "Quality",
Self::Behavior => "Behavior",
Self::Docs => "Docs",
Self::Evaluator => "Evaluator",
}
}
}
impl fmt::Display for ReviewerKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl FromStr for ReviewerKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"concept" => Ok(Self::Concept),
"quality" => Ok(Self::Quality),
"behavior" => Ok(Self::Behavior),
"docs" => Ok(Self::Docs),
"evaluator" => Ok(Self::Evaluator),
other => Err(format!(
"unknown reviewer kind `{other}`; expected one of: \
concept, quality, behavior, docs, evaluator"
)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip_all_kinds() {
for k in ReviewerKind::ALL {
assert_eq!(k.as_str().parse::<ReviewerKind>().unwrap(), k);
}
}
#[test]
fn unknown_kind_rejected() {
assert!("eval".parse::<ReviewerKind>().is_err());
assert!("".parse::<ReviewerKind>().is_err());
}
}