Skip to main content

solti_model/domain/selector/
operator.rs

1//! # Selector operators.
2//!
3//! [`SelectorOperator`] defines comparison operators for label-based runner selection.
4
5use std::fmt;
6
7use serde::{Deserialize, Serialize};
8
9/// Set-based operator for [`super::SelectorRequirement`].
10///
11/// | Operator       | Semantics                               |
12/// |----------------|-----------------------------------------|
13/// | `In`           | label value ∈ {values}                  |
14/// | `NotIn`        | label value ∉ {values}                  |
15/// | `Exists`       | label key is present (values ignored)   |
16/// | `DoesNotExist` | label key is absent  (values ignored)   |
17///
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[non_exhaustive]
20pub enum SelectorOperator {
21    /// Label value must be one of `values`.
22    In,
23    /// Label value must NOT be one of `values`.
24    NotIn,
25    /// Label key must exist (values are ignored).
26    Exists,
27    /// Label key must NOT exist (values are ignored).
28    DoesNotExist,
29}
30
31impl fmt::Display for SelectorOperator {
32    #[inline]
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        match self {
35            Self::In => f.write_str("In"),
36            Self::NotIn => f.write_str("NotIn"),
37            Self::Exists => f.write_str("Exists"),
38            Self::DoesNotExist => f.write_str("DoesNotExist"),
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn display() {
49        assert_eq!(SelectorOperator::In.to_string(), "In");
50        assert_eq!(SelectorOperator::NotIn.to_string(), "NotIn");
51        assert_eq!(SelectorOperator::Exists.to_string(), "Exists");
52        assert_eq!(SelectorOperator::DoesNotExist.to_string(), "DoesNotExist");
53    }
54
55    #[test]
56    fn serde_roundtrip() {
57        for op in [
58            SelectorOperator::In,
59            SelectorOperator::NotIn,
60            SelectorOperator::Exists,
61            SelectorOperator::DoesNotExist,
62        ] {
63            let json = serde_json::to_string(&op).unwrap();
64            let back: SelectorOperator = serde_json::from_str(&json).unwrap();
65            assert_eq!(back, op);
66        }
67    }
68}