Skip to main content

orchestrator_config/
crd_scope.rs

1use serde::{Deserialize, Serialize};
2
3/// Defines the scope of a CRD — how instances are organized.
4#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
5#[serde(rename_all = "snake_case")]
6pub enum CrdScope {
7    /// Project-scoped (Agent, Workflow, Workspace)
8    Namespaced,
9    /// Global multi-instance (Project, StepTemplate, EnvStore, SecretStore)
10    #[default]
11    Cluster,
12    /// Singleton resources such as RuntimePolicy.
13    Singleton,
14}
15
16#[cfg(test)]
17mod tests {
18    use super::*;
19
20    #[test]
21    fn default_is_cluster() {
22        assert_eq!(CrdScope::default(), CrdScope::Cluster);
23    }
24
25    #[test]
26    fn serde_round_trip() {
27        for scope in [CrdScope::Namespaced, CrdScope::Cluster, CrdScope::Singleton] {
28            let json = serde_json::to_string(&scope).expect("serialize");
29            let back: CrdScope = serde_json::from_str(&json).expect("deserialize");
30            assert_eq!(scope, back);
31        }
32    }
33
34    #[test]
35    fn deserializes_from_snake_case() {
36        let s: CrdScope = serde_json::from_str("\"namespaced\"").unwrap();
37        assert_eq!(s, CrdScope::Namespaced);
38        let s: CrdScope = serde_json::from_str("\"cluster\"").unwrap();
39        assert_eq!(s, CrdScope::Cluster);
40        let s: CrdScope = serde_json::from_str("\"singleton\"").unwrap();
41        assert_eq!(s, CrdScope::Singleton);
42    }
43}