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}