anypod/
parse.rs

1#[derive(Debug, PartialEq)]
2pub enum WorkloadType {
3    Any,
4    Deployment,
5    StatefulSet,
6    DaemonSet,
7}
8
9#[derive(Debug)]
10pub struct ParsedQuery {
11    pub workload_type: WorkloadType,
12    pub name: String,
13}
14
15pub fn parse_query(query: &str) -> ParsedQuery {
16    let parts: Vec<&str> = query.split('/').collect();
17
18    match parts.as_slice() {
19        [prefix, name] => {
20            let workload_type = match *prefix {
21                "deployment" => WorkloadType::Deployment,
22                "statefulset" => WorkloadType::StatefulSet,
23                "daemonset" => WorkloadType::DaemonSet,
24                _ => WorkloadType::Any,
25            };
26            ParsedQuery {
27                workload_type,
28                name: name.to_string(),
29            }
30        }
31        [name] => ParsedQuery {
32            workload_type: WorkloadType::Any,
33            name: name.to_string(),
34        },
35        _ => ParsedQuery {
36            workload_type: WorkloadType::Any,
37            name: query.to_string(),
38        },
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_parse_query_simple_name() {
48        let result = parse_query("nginx");
49        assert_eq!(result.workload_type, WorkloadType::Any);
50        assert_eq!(result.name, "nginx");
51    }
52
53    #[test]
54    fn test_parse_query_deployment() {
55        let result = parse_query("deployment/nginx");
56        assert_eq!(result.workload_type, WorkloadType::Deployment);
57        assert_eq!(result.name, "nginx");
58    }
59
60    #[test]
61    fn test_parse_query_statefulset() {
62        let result = parse_query("statefulset/postgresql");
63        assert_eq!(result.workload_type, WorkloadType::StatefulSet);
64        assert_eq!(result.name, "postgresql");
65    }
66
67    #[test]
68    fn test_parse_query_daemonset() {
69        let result = parse_query("daemonset/fluentd");
70        assert_eq!(result.workload_type, WorkloadType::DaemonSet);
71        assert_eq!(result.name, "fluentd");
72    }
73
74    #[test]
75    fn test_parse_query_unknown_prefix() {
76        let result = parse_query("unknown/nginx");
77        assert_eq!(result.workload_type, WorkloadType::Any);
78        assert_eq!(result.name, "nginx");
79    }
80
81    #[test]
82    fn test_parse_query_empty_string() {
83        let result = parse_query("");
84        assert_eq!(result.workload_type, WorkloadType::Any);
85        assert_eq!(result.name, "");
86    }
87
88    #[test]
89    fn test_parse_query_multiple_slashes() {
90        let result = parse_query("deployment/nginx/extra");
91        assert_eq!(result.workload_type, WorkloadType::Any);
92        assert_eq!(result.name, "deployment/nginx/extra");
93    }
94
95    #[test]
96    fn test_parse_query_with_spaces() {
97        let result = parse_query("deployment/nginx app");
98        assert_eq!(result.workload_type, WorkloadType::Deployment);
99        assert_eq!(result.name, "nginx app");
100    }
101
102    #[test]
103    fn test_parse_query_case_sensitive() {
104        let result = parse_query("DEPLOYMENT/nginx");
105        assert_eq!(result.workload_type, WorkloadType::Any);
106        assert_eq!(result.name, "nginx");
107    }
108}