Skip to main content

reddb_types/
queue_mode.rs

1//! Queue-mode AST leaf (ADR 0053, RQL Phase 2 S4b).
2//!
3//! [`QueueMode`] is referenced by the canonical SQL AST (`CreateQueueQuery.mode`
4//! and `AlterQueueQuery.mode`). The server's `storage::queue` module keeps a
5//! re-export shim so existing call-sites stay untouched.
6
7#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
8pub enum QueueMode {
9    Fanout,
10    #[default]
11    Work,
12}
13
14impl QueueMode {
15    pub fn as_str(self) -> &'static str {
16        match self {
17            Self::Fanout => "fanout",
18            Self::Work => "work",
19        }
20    }
21
22    pub fn parse(value: &str) -> Option<Self> {
23        match value.to_ascii_uppercase().as_str() {
24            "FANOUT" => Some(Self::Fanout),
25            "WORK" | "STANDARD" | "FIFO" => Some(Self::Work),
26            _ => None,
27        }
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn queue_modes_parse_aliases_and_render_canonical_names() {
37        assert_eq!(QueueMode::default(), QueueMode::Work);
38        assert_eq!(QueueMode::Fanout.as_str(), "fanout");
39        assert_eq!(QueueMode::Work.as_str(), "work");
40
41        assert_eq!(QueueMode::parse("fanout"), Some(QueueMode::Fanout));
42        for alias in ["work", "STANDARD", "fifo"] {
43            assert_eq!(QueueMode::parse(alias), Some(QueueMode::Work), "{alias}");
44        }
45        assert_eq!(QueueMode::parse("broadcast"), None);
46    }
47}