use crate::{CoreError, Result};
use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Severity {
Low,
Medium,
High,
Critical,
}
impl Severity {
pub fn as_str(self) -> &'static str {
match self {
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::Critical => "critical",
}
}
pub fn is_at_least(self, minimum: Self) -> bool {
self >= minimum
}
}
impl FromStr for Severity {
type Err = CoreError;
fn from_str(value: &str) -> Result<Self> {
match value {
"low" => Ok(Self::Low),
"medium" => Ok(Self::Medium),
"high" => Ok(Self::High),
"critical" => Ok(Self::Critical),
unknown => Err(CoreError::parse_failure(
"severity",
unknown,
"expected low, medium, high, or critical",
)),
}
}
}
impl TryFrom<&str> for Severity {
type Error = CoreError;
fn try_from(value: &str) -> Result<Self> {
Self::from_str(value)
}
}
impl TryFrom<String> for Severity {
type Error = CoreError;
fn try_from(value: String) -> Result<Self> {
Self::from_str(&value)
}
}
impl fmt::Display for Severity {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
#[serde(rename_all = "snake_case")]
pub enum ReviewStatus {
Candidate,
#[default]
Unreviewed,
Reviewed,
Rejected,
Accepted,
}
impl ReviewStatus {
pub fn as_str(self) -> &'static str {
match self {
Self::Candidate => "candidate",
Self::Unreviewed => "unreviewed",
Self::Reviewed => "reviewed",
Self::Rejected => "rejected",
Self::Accepted => "accepted",
}
}
pub fn is_accepted(self) -> bool {
matches!(self, Self::Accepted)
}
pub fn is_rejected(self) -> bool {
matches!(self, Self::Rejected)
}
pub fn has_review_action(self) -> bool {
!matches!(self, Self::Candidate | Self::Unreviewed)
}
}
impl FromStr for ReviewStatus {
type Err = CoreError;
fn from_str(value: &str) -> Result<Self> {
match value {
"candidate" => Ok(Self::Candidate),
"unreviewed" => Ok(Self::Unreviewed),
"reviewed" => Ok(Self::Reviewed),
"rejected" => Ok(Self::Rejected),
"accepted" => Ok(Self::Accepted),
unknown => Err(CoreError::parse_failure(
"review_status",
unknown,
"expected candidate, unreviewed, reviewed, rejected, or accepted",
)),
}
}
}
impl TryFrom<&str> for ReviewStatus {
type Error = CoreError;
fn try_from(value: &str) -> Result<Self> {
Self::from_str(value)
}
}
impl TryFrom<String> for ReviewStatus {
type Error = CoreError;
fn try_from(value: String) -> Result<Self> {
Self::from_str(&value)
}
}
impl fmt::Display for ReviewStatus {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}