Skip to main content

specfold_core/model/
lifecycle.rs

1//! The status lifecycle shared by every type: draft → active → superseded | archived, and
2//! draft → rejected. No transition goes backwards.
3
4pub const STATUSES: [&str; 5] = ["draft", "active", "superseded", "archived", "rejected"];
5
6/// Statuses that `find` and `context` show by default.
7pub fn is_current(status: &str) -> bool {
8    matches!(status, "draft" | "active")
9}
10
11pub fn transition_allowed(from: &str, to: &str) -> bool {
12    from == to
13        || matches!(
14            (from, to),
15            ("draft", "active")
16                | ("draft", "rejected")
17                | ("draft", "archived")
18                | ("active", "superseded")
19                | ("active", "archived")
20                | ("superseded", "archived")
21        )
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27
28    #[test]
29    fn forward_only() {
30        assert!(transition_allowed("draft", "active"));
31        assert!(transition_allowed("active", "superseded"));
32        assert!(!transition_allowed("active", "draft"));
33        assert!(!transition_allowed("archived", "active"));
34        assert!(!transition_allowed("rejected", "active"));
35    }
36}