use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum EditorialState {
Draft,
Proposed,
InReview,
ChangesRequested,
Approved,
#[default]
Published,
Archived,
Retracted,
}
impl EditorialState {
#[must_use]
pub const fn is_published(self) -> bool {
matches!(self, Self::Published)
}
#[must_use]
pub const fn is_public(self) -> bool {
matches!(self, Self::Published | Self::Archived)
}
#[must_use]
pub const fn is_pre_publication(self) -> bool {
matches!(
self,
Self::Draft | Self::Proposed | Self::InReview | Self::ChangesRequested | Self::Approved
)
}
#[must_use]
pub const fn is_withdrawn(self) -> bool {
matches!(self, Self::Retracted)
}
#[must_use]
pub const fn can_transition_to(self, target: Self) -> bool {
use EditorialState as S;
matches!(
(self, target),
(S::Draft | S::Approved, S::Proposed)
| (S::Proposed, S::InReview | S::Draft)
| (S::InReview, S::ChangesRequested | S::Approved)
| (S::ChangesRequested, S::Proposed | S::Draft)
| (S::Approved | S::Archived, S::Published)
| (S::Published, S::Archived | S::Retracted)
| (S::Retracted, S::Draft)
)
}
}