1use clap::ValueEnum;
8
9#[derive(Clone, Copy, PartialEq, Eq, Debug, ValueEnum, Default)]
14pub enum ProjectFilter {
15 #[default]
17 All,
18
19 Rust,
21
22 Node,
24
25 Python,
27
28 Go,
30
31 Java,
33
34 Cpp,
36
37 Swift,
39
40 #[value(name = "dotnet")]
42 DotNet,
43
44 Ruby,
46
47 Elixir,
49
50 Deno,
52
53 #[value(name = "php")]
55 Php,
56
57 Haskell,
59
60 Dart,
62
63 Zig,
65
66 Scala,
68}
69
70#[derive(Clone, Debug)]
75pub struct FilterOptions {
76 pub keep_size: String,
78
79 pub keep_days: u32,
81
82 pub name_pattern: Option<String>,
84}
85
86#[derive(Clone, Copy, PartialEq, Eq, Debug, ValueEnum)]
95pub enum SortCriteria {
96 Size,
98
99 Age,
101
102 Name,
104
105 Type,
107}
108
109#[derive(Clone, Debug)]
114pub struct SortOptions {
115 pub criteria: Option<SortCriteria>,
117
118 pub reverse: bool,
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125
126 #[test]
127 fn test_project_filter_equality() {
128 assert_eq!(ProjectFilter::All, ProjectFilter::All);
129 assert_eq!(ProjectFilter::Rust, ProjectFilter::Rust);
130 assert_eq!(ProjectFilter::Node, ProjectFilter::Node);
131 assert_eq!(ProjectFilter::Python, ProjectFilter::Python);
132 assert_eq!(ProjectFilter::Go, ProjectFilter::Go);
133 assert_eq!(ProjectFilter::Java, ProjectFilter::Java);
134 assert_eq!(ProjectFilter::Cpp, ProjectFilter::Cpp);
135 assert_eq!(ProjectFilter::Swift, ProjectFilter::Swift);
136 assert_eq!(ProjectFilter::DotNet, ProjectFilter::DotNet);
137 assert_eq!(ProjectFilter::Ruby, ProjectFilter::Ruby);
138 assert_eq!(ProjectFilter::Elixir, ProjectFilter::Elixir);
139 assert_eq!(ProjectFilter::Deno, ProjectFilter::Deno);
140 assert_eq!(ProjectFilter::Php, ProjectFilter::Php);
141 assert_eq!(ProjectFilter::Haskell, ProjectFilter::Haskell);
142 assert_eq!(ProjectFilter::Dart, ProjectFilter::Dart);
143 assert_eq!(ProjectFilter::Zig, ProjectFilter::Zig);
144 assert_eq!(ProjectFilter::Scala, ProjectFilter::Scala);
145
146 assert_ne!(ProjectFilter::All, ProjectFilter::Rust);
147 assert_ne!(ProjectFilter::Rust, ProjectFilter::Node);
148 assert_ne!(ProjectFilter::Node, ProjectFilter::Python);
149 assert_ne!(ProjectFilter::Python, ProjectFilter::Go);
150 assert_ne!(ProjectFilter::Go, ProjectFilter::Java);
151 assert_ne!(ProjectFilter::Java, ProjectFilter::Cpp);
152 assert_ne!(ProjectFilter::Cpp, ProjectFilter::Swift);
153 assert_ne!(ProjectFilter::Swift, ProjectFilter::DotNet);
154 assert_ne!(ProjectFilter::DotNet, ProjectFilter::Ruby);
155 assert_ne!(ProjectFilter::Ruby, ProjectFilter::Elixir);
156 assert_ne!(ProjectFilter::Elixir, ProjectFilter::Deno);
157 assert_ne!(ProjectFilter::Deno, ProjectFilter::Php);
158 assert_ne!(ProjectFilter::Php, ProjectFilter::Haskell);
159 assert_ne!(ProjectFilter::Haskell, ProjectFilter::Dart);
160 assert_ne!(ProjectFilter::Dart, ProjectFilter::Zig);
161 assert_ne!(ProjectFilter::Zig, ProjectFilter::Scala);
162 }
163
164 #[test]
165 fn test_project_filter_copy() {
166 let original = ProjectFilter::Rust;
167 let copied = original;
168
169 assert_eq!(original, copied);
170 }
171
172 #[test]
173 fn test_project_filter_default() {
174 let default_filter = ProjectFilter::default();
175 assert_eq!(default_filter, ProjectFilter::All);
176 }
177
178 #[test]
179 fn test_filter_options_creation() {
180 let filter_opts = FilterOptions {
181 keep_size: "100MB".to_string(),
182 keep_days: 30,
183 name_pattern: None,
184 };
185
186 assert_eq!(filter_opts.keep_size, "100MB");
187 assert_eq!(filter_opts.keep_days, 30);
188 assert!(filter_opts.name_pattern.is_none());
189 }
190
191 #[test]
192 fn test_filter_options_clone() {
193 let original = FilterOptions {
194 keep_size: "100MB".to_string(),
195 keep_days: 30,
196 name_pattern: None,
197 };
198 let cloned = original.clone();
199
200 assert_eq!(original.keep_size, cloned.keep_size);
201 assert_eq!(original.keep_days, cloned.keep_days);
202 assert_eq!(original.name_pattern, cloned.name_pattern);
203 }
204
205 #[test]
206 fn test_filter_options_name_pattern() {
207 let with_glob = FilterOptions {
208 keep_size: "0".to_string(),
209 keep_days: 0,
210 name_pattern: Some("my-app*".to_string()),
211 };
212 assert_eq!(with_glob.name_pattern.as_deref(), Some("my-app*"));
213
214 let with_regex = FilterOptions {
215 keep_size: "0".to_string(),
216 keep_days: 0,
217 name_pattern: Some("regex:^client-.*".to_string()),
218 };
219 assert_eq!(with_regex.name_pattern.as_deref(), Some("regex:^client-.*"));
220 }
221
222 #[test]
223 fn test_sort_criteria_equality() {
224 assert_eq!(SortCriteria::Size, SortCriteria::Size);
225 assert_eq!(SortCriteria::Age, SortCriteria::Age);
226 assert_eq!(SortCriteria::Name, SortCriteria::Name);
227 assert_eq!(SortCriteria::Type, SortCriteria::Type);
228
229 assert_ne!(SortCriteria::Size, SortCriteria::Age);
230 assert_ne!(SortCriteria::Name, SortCriteria::Type);
231 }
232
233 #[test]
234 fn test_sort_criteria_copy() {
235 let original = SortCriteria::Size;
236 let copied = original;
237 assert_eq!(original, copied);
238 }
239
240 #[test]
241 fn test_sort_options_creation() {
242 let sort_opts = SortOptions {
243 criteria: Some(SortCriteria::Size),
244 reverse: false,
245 };
246 assert_eq!(sort_opts.criteria, Some(SortCriteria::Size));
247 assert!(!sort_opts.reverse);
248 }
249
250 #[test]
251 fn test_sort_options_none_criteria() {
252 let sort_opts = SortOptions {
253 criteria: None,
254 reverse: false,
255 };
256 assert!(sort_opts.criteria.is_none());
257 }
258
259 #[test]
260 fn test_sort_options_clone() {
261 let original = SortOptions {
262 criteria: Some(SortCriteria::Age),
263 reverse: true,
264 };
265 let cloned = original.clone();
266
267 assert_eq!(original.criteria, cloned.criteria);
268 assert_eq!(original.reverse, cloned.reverse);
269 }
270}