Skip to main content

lexicon_spec/
mode.rs

1//! Operating mode detection for progressive adoption.
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6/// The operating mode determines which capabilities are available.
7///
8/// Lexicon supports progressive adoption: start with a single repo,
9/// expand to a workspace, then to an ecosystem.
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Default)]
11#[serde(rename_all = "lowercase")]
12pub enum OperatingMode {
13    /// Single repository mode (default).
14    #[default]
15    Repo,
16    /// Multi-crate workspace mode.
17    Workspace,
18    /// Multi-repo ecosystem mode.
19    Ecosystem,
20}
21
22impl fmt::Display for OperatingMode {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match self {
25            Self::Repo => write!(f, "repo"),
26            Self::Workspace => write!(f, "workspace"),
27            Self::Ecosystem => write!(f, "ecosystem"),
28        }
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_display() {
38        assert_eq!(OperatingMode::Repo.to_string(), "repo");
39        assert_eq!(OperatingMode::Workspace.to_string(), "workspace");
40        assert_eq!(OperatingMode::Ecosystem.to_string(), "ecosystem");
41    }
42
43    #[test]
44    fn test_default_is_repo() {
45        assert_eq!(OperatingMode::default(), OperatingMode::Repo);
46    }
47
48    #[test]
49    fn test_serde_roundtrip() {
50        for mode in [
51            OperatingMode::Repo,
52            OperatingMode::Workspace,
53            OperatingMode::Ecosystem,
54        ] {
55            let json = serde_json::to_string(&mode).unwrap();
56            let back: OperatingMode = serde_json::from_str(&json).unwrap();
57            assert_eq!(mode, back);
58        }
59    }
60
61    #[test]
62    fn test_serde_values() {
63        let json = serde_json::to_string(&OperatingMode::Repo).unwrap();
64        assert_eq!(json, "\"repo\"");
65
66        let json = serde_json::to_string(&OperatingMode::Workspace).unwrap();
67        assert_eq!(json, "\"workspace\"");
68
69        let json = serde_json::to_string(&OperatingMode::Ecosystem).unwrap();
70        assert_eq!(json, "\"ecosystem\"");
71    }
72}