specfold_core/model/
lifecycle.rs1pub const STATUSES: [&str; 5] = ["draft", "active", "superseded", "archived", "rejected"];
5
6pub 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}