use crate::text::normalize_required_text;
use crate::{Id, Result};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ObjectRef {
#[serde(rename = "ref")]
pub reference: Id,
}
impl ObjectRef {
pub fn new(reference: Id) -> Self {
Self { reference }
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct Description {
pub description: String,
}
impl Description {
pub fn new(description: impl Into<String>) -> Result<Self> {
Ok(Self {
description: normalize_required_text("description", description)?,
})
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum LifecycleStatus {
Candidate,
UnderReview,
Accepted,
Rejected,
Superseded,
}
impl LifecycleStatus {
pub fn is_accepted(self) -> bool {
matches!(self, Self::Accepted)
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ReviewRequirement {
pub required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewer: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub decision_reason: Option<String>,
}
impl ReviewRequirement {
pub fn new(required: bool) -> Self {
Self {
required,
reviewer: None,
decision_reason: None,
}
}
pub fn with_decision_reason(mut self, decision_reason: impl Into<String>) -> Result<Self> {
self.decision_reason = Some(normalize_required_text("decision_reason", decision_reason)?);
Ok(self)
}
}