Skip to main content

stack_ids/
status.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4/// Shared publication-status primitive for thin governance/profile surfaces.
5///
6/// Domain crates may only use the variants they need, but they should not
7/// redefine the status family locally because that creates schema drift bait.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
9#[serde(rename_all = "snake_case")]
10pub enum SurfaceStatus {
11    AdvisoryOnly,
12    NonAdmitted,
13    Degraded,
14    HorizonOnly,
15}
16
17impl std::fmt::Display for SurfaceStatus {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        let value = match self {
20            Self::AdvisoryOnly => "advisory_only",
21            Self::NonAdmitted => "non_admitted",
22            Self::Degraded => "degraded",
23            Self::HorizonOnly => "horizon_only",
24        };
25        f.write_str(value)
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn display_matches_wire_status_label() {
35        assert_eq!(SurfaceStatus::AdvisoryOnly.to_string(), "advisory_only");
36        assert_eq!(SurfaceStatus::NonAdmitted.to_string(), "non_admitted");
37        assert_eq!(SurfaceStatus::Degraded.to_string(), "degraded");
38        assert_eq!(SurfaceStatus::HorizonOnly.to_string(), "horizon_only");
39    }
40}