use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AdrStatus {
Draft,
ForReview,
Accepted,
Rejected,
Superseded,
}
#[derive(Debug, thiserror::Error)]
pub enum ParseError {
#[error("unknown ADR status: {0}")]
UnknownStatus(String),
}
impl std::str::FromStr for AdrStatus {
type Err = ParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Draft" => Ok(Self::Draft),
"For Review" => Ok(Self::ForReview),
"Accepted" => Ok(Self::Accepted),
"Rejected" => Ok(Self::Rejected),
"Superseded" => Ok(Self::Superseded),
other => Err(ParseError::UnknownStatus(other.to_owned())),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AdrMeta {
pub id: String,
pub title: String,
pub status: AdrStatus,
}
#[cfg(test)]
mod tests {
use super::AdrStatus;
#[test]
fn parses_all_house_statuses() {
for (s, want) in [
("Draft", AdrStatus::Draft),
("For Review", AdrStatus::ForReview),
("Accepted", AdrStatus::Accepted),
("Rejected", AdrStatus::Rejected),
("Superseded", AdrStatus::Superseded),
] {
assert_eq!(s.parse::<AdrStatus>().expect("parse"), want);
}
}
#[test]
fn rejects_unknown_status() {
assert!("Pending".parse::<AdrStatus>().is_err());
}
}