koala-artifact 1.0.4

Reviewer artifact format and sampling verifier.
Documentation
use std::fmt;
use std::str::FromStr;

/// One of the five reviewer aspects defined by ADR-0003.
#[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());
    }
}