ofdb_entities/
review.rs

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}