Skip to main content

soma_gateway/gateway/
catalog.rs

1use std::collections::BTreeMap;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub struct GatewayAction {
5    pub name: &'static str,
6    pub admin_required: bool,
7    pub destructive: bool,
8    pub discovery: bool,
9    pub spawn_validation_required: bool,
10}
11
12#[derive(Debug, Clone, Default)]
13pub struct GatewayActionCatalog {
14    actions: BTreeMap<&'static str, GatewayAction>,
15}
16
17impl GatewayActionCatalog {
18    #[must_use]
19    pub fn standard() -> Self {
20        let mut catalog = Self::default();
21        for &action in STANDARD_ACTIONS {
22            catalog.actions.insert(action.name, action);
23        }
24        catalog
25    }
26
27    #[must_use]
28    pub fn get(&self, name: &str) -> Option<GatewayAction> {
29        self.actions.get(name).copied()
30    }
31
32    #[must_use]
33    pub fn list(&self) -> Vec<GatewayAction> {
34        self.actions.values().copied().collect()
35    }
36}
37
38const STANDARD_ACTIONS: &[GatewayAction] = &[
39    GatewayAction {
40        name: "gateway.list",
41        admin_required: false,
42        destructive: false,
43        discovery: true,
44        spawn_validation_required: false,
45    },
46    GatewayAction {
47        name: "gateway.config.view",
48        admin_required: false,
49        destructive: false,
50        discovery: true,
51        spawn_validation_required: false,
52    },
53    GatewayAction {
54        name: "gateway.test",
55        admin_required: true,
56        destructive: false,
57        discovery: false,
58        spawn_validation_required: true,
59    },
60    GatewayAction {
61        name: "gateway.add",
62        admin_required: true,
63        destructive: false,
64        discovery: false,
65        spawn_validation_required: true,
66    },
67    GatewayAction {
68        name: "gateway.update",
69        admin_required: true,
70        destructive: false,
71        discovery: false,
72        spawn_validation_required: true,
73    },
74    GatewayAction {
75        name: "gateway.import.approve",
76        admin_required: true,
77        destructive: false,
78        discovery: false,
79        spawn_validation_required: true,
80    },
81    GatewayAction {
82        name: "gateway.remove",
83        admin_required: true,
84        destructive: true,
85        discovery: false,
86        spawn_validation_required: false,
87    },
88    GatewayAction {
89        name: "gateway.reload",
90        admin_required: true,
91        destructive: false,
92        discovery: false,
93        spawn_validation_required: false,
94    },
95    GatewayAction {
96        name: "gateway.oauth.start",
97        admin_required: true,
98        destructive: false,
99        discovery: false,
100        spawn_validation_required: false,
101    },
102    GatewayAction {
103        name: "gateway.oauth.status",
104        admin_required: true,
105        destructive: false,
106        discovery: true,
107        spawn_validation_required: false,
108    },
109    GatewayAction {
110        name: "gateway.oauth.clear",
111        admin_required: true,
112        destructive: true,
113        discovery: false,
114        spawn_validation_required: false,
115    },
116];
117
118#[cfg(test)]
119#[path = "catalog_tests.rs"]
120mod tests;