ofdb-entities 0.12.7

Reusable, agnostic domain entities for OpenFairDB.
Documentation
use num_derive::{FromPrimitive, ToPrimitive};
use num_traits::*;
use strum::{EnumCount, EnumIter, EnumString};
use thiserror::Error;

use crate::{activity::*, revision::*};

pub type ReviewStatusPrimitive = i16;

#[rustfmt::skip]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromPrimitive, ToPrimitive, EnumIter, EnumCount, EnumString)]
#[strum(ascii_case_insensitive)]
pub enum ReviewStatus {
    Rejected  = -1,
    Archived  =  0,
    Created   =  1,
    Confirmed =  2,
}

impl ReviewStatus {
    pub fn exists(self) -> bool {
        self >= Self::Created
    }

    pub const fn default() -> Self {
        Self::Created
    }
}

#[derive(Debug, Error)]
#[error("Invalid review status primitive: {0}")]
pub struct InvalidReviewStatusPrimitive(ReviewStatusPrimitive);

impl TryFrom<i16> for ReviewStatus {
    type Error = InvalidReviewStatusPrimitive;
    fn try_from(from: ReviewStatusPrimitive) -> Result<Self, Self::Error> {
        Self::from_i16(from).ok_or(InvalidReviewStatusPrimitive(from))
    }
}

impl From<ReviewStatus> for ReviewStatusPrimitive {
    fn from(from: ReviewStatus) -> Self {
        from.to_i16().expect("Review status primitive")
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReviewStatusLog {
    pub revision: Revision,
    pub activity: ActivityLog,
    pub status: ReviewStatus,
}