1use num_derive::{FromPrimitive, ToPrimitive};
2use num_traits::*;
3use strum::{EnumCount, EnumIter, EnumString};
4use thiserror::Error;
5
6use crate::{activity::*, revision::*};
7
8pub type ReviewStatusPrimitive = i16;
9
10#[rustfmt::skip]
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromPrimitive, ToPrimitive, EnumIter, EnumCount, EnumString)]
12#[strum(ascii_case_insensitive)]
13pub enum ReviewStatus {
14 Rejected = -1,
15 Archived = 0,
16 Created = 1,
17 Confirmed = 2,
18}
19
20impl ReviewStatus {
21 pub fn exists(self) -> bool {
22 self >= Self::Created
23 }
24
25 pub const fn default() -> Self {
26 Self::Created
27 }
28}
29
30#[derive(Debug, Error)]
31#[error("Invalid review status primitive: {0}")]
32pub struct InvalidReviewStatusPrimitive(ReviewStatusPrimitive);
33
34impl TryFrom<i16> for ReviewStatus {
35 type Error = InvalidReviewStatusPrimitive;
36 fn try_from(from: ReviewStatusPrimitive) -> Result<Self, Self::Error> {
37 Self::from_i16(from).ok_or(InvalidReviewStatusPrimitive(from))
38 }
39}
40
41impl From<ReviewStatus> for ReviewStatusPrimitive {
42 fn from(from: ReviewStatus) -> Self {
43 from.to_i16().expect("Review status primitive")
44 }
45}
46
47#[derive(Debug, Clone, PartialEq, Eq)]
48pub struct ReviewStatusLog {
49 pub revision: Revision,
50 pub activity: ActivityLog,
51 pub status: ReviewStatus,
52}