1use semver::Version;
5
6fn supported_qt_versions() -> Vec<Version> {
7 vec![
8 Version::new(6, 2, 0),
9 Version::new(6, 3, 0),
10 Version::new(6, 4, 0),
11 Version::new(6, 5, 0),
12 Version::new(6, 6, 0),
13 Version::new(6, 7, 0),
14 Version::new(6, 8, 0),
15 Version::new(6, 9, 0),
16 Version::new(6, 10, 0),
17 ]
18}
19
20fn default_version() -> Option<Version> {
21 if cfg!(feature = "qt_version_default") {
22 Some(Version::new(6, 10, 2))
23 } else {
24 None
25 }
26}
27
28fn exact_version() -> Option<Version> {
29 #[cfg(feature = "qt_version_exact_6_10_2")]
30 {
31 return Some(Version::new(6, 10, 2));
32 }
33
34 #[cfg(feature = "qt_version_exact_6_10_1")]
35 {
36 return Some(Version::new(6, 10, 1));
37 }
38
39 #[cfg(feature = "qt_version_exact_6_10_0")]
40 {
41 return Some(Version::new(6, 10, 0));
42 }
43
44 #[cfg(feature = "qt_version_exact_6_9_3")]
45 {
46 return Some(Version::new(6, 9, 3));
47 }
48
49 #[cfg(feature = "qt_version_exact_6_9_2")]
50 {
51 return Some(Version::new(6, 9, 2));
52 }
53
54 #[cfg(feature = "qt_version_exact_6_9_1")]
55 {
56 return Some(Version::new(6, 9, 1));
57 }
58
59 #[cfg(feature = "qt_version_exact_6_9_0")]
60 {
61 return Some(Version::new(6, 9, 0));
62 }
63
64 #[cfg(feature = "qt_version_exact_6_8_6")]
65 {
66 return Some(Version::new(6, 8, 6));
67 }
68
69 #[cfg(feature = "qt_version_exact_6_8_5")]
70 {
71 return Some(Version::new(6, 8, 5));
72 }
73
74 #[cfg(feature = "qt_version_exact_6_8_4")]
75 {
76 return Some(Version::new(6, 8, 4));
77 }
78
79 #[cfg(feature = "qt_version_exact_6_8_3")]
80 {
81 return Some(Version::new(6, 8, 3));
82 }
83
84 #[cfg(feature = "qt_version_exact_6_8_2")]
85 {
86 return Some(Version::new(6, 8, 2));
87 }
88 #[cfg(feature = "qt_version_exact_6_8_1")]
89 {
90 return Some(Version::new(6, 8, 1));
91 }
92
93 #[cfg(feature = "qt_version_exact_6_8_0")]
94 {
95 return Some(Version::new(6, 8, 0));
96 }
97
98 #[cfg(feature = "qt_version_exact_6_7_0")]
99 {
100 return Some(Version::new(6, 7, 0));
101 }
102
103 #[cfg(feature = "qt_version_exact_6_6_0")]
104 {
105 return Some(Version::new(6, 6, 0));
106 }
107
108 #[cfg(feature = "qt_version_exact_6_5_0")]
109 {
110 return Some(Version::new(6, 5, 0));
111 }
112
113 #[cfg(feature = "qt_version_exact_6_4_0")]
114 {
115 return Some(Version::new(6, 4, 0));
116 }
117
118 #[cfg(feature = "qt_version_exact_6_3_0")]
119 {
120 return Some(Version::new(6, 3, 0));
121 }
122
123 #[cfg(feature = "qt_version_exact_6_2_0")]
124 {
125 return Some(Version::new(6, 2, 0));
126 }
127
128 None
129}
130
131fn min_version() -> Option<Version> {
132 #[cfg(feature = "qt_version_at_least_6_10")]
133 {
134 return Some(Version::new(6, 10, 0));
135 }
136
137 #[cfg(feature = "qt_version_at_least_6_9")]
138 {
139 return Some(Version::new(6, 9, 0));
140 }
141
142 #[cfg(feature = "qt_version_at_least_6_8")]
143 {
144 return Some(Version::new(6, 8, 0));
145 }
146
147 #[cfg(feature = "qt_version_at_least_6_7")]
148 {
149 return Some(Version::new(6, 7, 0));
150 }
151
152 #[cfg(feature = "qt_version_at_least_6_6")]
153 {
154 return Some(Version::new(6, 6, 0));
155 }
156
157 #[cfg(feature = "qt_version_at_least_6_5")]
158 {
159 return Some(Version::new(6, 5, 0));
160 }
161
162 #[cfg(feature = "qt_version_at_least_6_4")]
163 {
164 return Some(Version::new(6, 4, 0));
165 }
166
167 #[cfg(feature = "qt_version_at_least_6_3")]
168 {
169 return Some(Version::new(6, 3, 0));
170 }
171
172 #[cfg(feature = "qt_version_at_least_6_2")]
173 {
174 return Some(Version::new(6, 2, 0));
175 }
176
177 None
178}
179
180fn max_version() -> Option<Version> {
181 #[cfg(feature = "qt_version_at_most_6_2")]
182 {
183 return Some(Version::new(6, 2, 0));
184 }
185
186 #[cfg(feature = "qt_version_at_most_6_3")]
187 {
188 return Some(Version::new(6, 3, 0));
189 }
190
191 #[cfg(feature = "qt_version_at_most_6_4")]
192 {
193 return Some(Version::new(6, 4, 0));
194 }
195
196 #[cfg(feature = "qt_version_at_most_6_5")]
197 {
198 return Some(Version::new(6, 5, 0));
199 }
200
201 #[cfg(feature = "qt_version_at_most_6_6")]
202 {
203 return Some(Version::new(6, 6, 0));
204 }
205
206 #[cfg(feature = "qt_version_at_most_6_7")]
207 {
208 return Some(Version::new(6, 7, 0));
209 }
210
211 #[cfg(feature = "qt_version_at_most_6_8")]
212 {
213 return Some(Version::new(6, 8, 0));
214 }
215
216 #[cfg(feature = "qt_version_at_most_6_9")]
217 {
218 return Some(Version::new(6, 9, 0));
219 }
220
221 #[cfg(feature = "qt_version_at_most_6_10")]
222 {
223 return Some(Version::new(6, 10, 0));
224 }
225
226 None
227}
228
229fn resolve_versions(
230 supported: &[Version],
231 exact: Option<Version>,
232 min: Option<Version>,
233 max: Option<Version>,
234) -> Vec<Version> {
235 if let Some(exact_v) = exact {
236 match min {
237 Some(min_v) if min_v > exact_v => {
238 eprintln!(
239 "Warning: min version {} is later than exact version {}. Returning empty range.",
240 min_v, exact_v
241 );
242 return Vec::new();
243 }
244 _ => {}
245 }
246 match max {
247 Some(max_v) if max_v < exact_v => {
248 eprintln!(
249 "Warning: max version {} is earlier than exact version {}. Returning empty range.",
250 max_v, exact_v
251 );
252 return Vec::new();
253 }
254 _ => {}
255 }
256 return vec![exact_v];
257 }
258
259 if let (Some(min_v), Some(max_v)) = (min.as_ref(), max.as_ref()) {
260 if min_v > max_v {
261 eprintln!(
262 "Warning: min version {} is greater than max version {}. Returning empty range.",
263 min_v, max_v
264 );
265 }
266 }
267 supported
268 .iter()
269 .filter(|&v| {
270 let ok_min = min.as_ref().is_none_or(|m| *v >= *m);
271 let ok_max = max.as_ref().is_none_or(|m| *v <= *m);
272 ok_min && ok_max
273 })
274 .cloned()
275 .collect()
276}
277
278pub fn qt_versions() -> Vec<Version> {
279 let supported = supported_qt_versions();
280 let exact = exact_version().or(default_version());
281 let min = min_version();
282 let max = max_version();
283
284 resolve_versions(&supported, exact, min, max)
285}
286
287#[cfg(test)]
288mod tests {
289 use super::*;
290
291 #[test]
292 fn test_range_filter() {
293 let supported = vec![
294 Version::new(6, 5, 0),
295 Version::new(6, 6, 0),
296 Version::new(6, 7, 0),
297 Version::new(6, 8, 0),
298 Version::new(6, 9, 0),
299 Version::new(6, 10, 0),
300 ];
301
302 let result = resolve_versions(
303 &supported,
304 None,
305 Some(Version::new(6, 7, 0)),
306 Some(Version::new(6, 9, 0)),
307 );
308
309 assert_eq!(
310 result,
311 vec![
312 Version::new(6, 7, 0),
313 Version::new(6, 8, 0),
314 Version::new(6, 9, 0),
315 ]
316 );
317 }
318
319 #[test]
320 fn test_exact() {
321 let supported = vec![
322 Version::new(6, 5, 0),
323 Version::new(6, 6, 0),
324 Version::new(6, 7, 0),
325 Version::new(6, 8, 0),
326 Version::new(6, 9, 0),
327 Version::new(6, 10, 0),
328 ];
329
330 let result = resolve_versions(
331 &supported,
332 Some(Version::new(6, 6, 0)),
333 Some(Version::new(6, 5, 0)),
334 Some(Version::new(6, 7, 0)),
335 );
336
337 assert_eq!(result, vec![Version::new(6, 6, 0)]);
338 }
339
340 #[test]
341 fn test_exact_smaller_than_range() {
342 let supported = vec![
343 Version::new(6, 5, 0),
344 Version::new(6, 6, 0),
345 Version::new(6, 7, 0),
346 Version::new(6, 8, 0),
347 Version::new(6, 9, 0),
348 Version::new(6, 10, 0),
349 ];
350
351 let result = resolve_versions(
352 &supported,
353 Some(Version::new(6, 3, 0)),
354 Some(Version::new(6, 5, 0)),
355 Some(Version::new(6, 7, 0)),
356 );
357
358 assert_eq!(result, vec![]);
359 }
360
361 #[test]
362 fn test_exact_bigger_than_range() {
363 let supported = vec![
364 Version::new(6, 5, 0),
365 Version::new(6, 6, 0),
366 Version::new(6, 7, 0),
367 Version::new(6, 8, 0),
368 Version::new(6, 9, 0),
369 Version::new(6, 10, 0),
370 ];
371
372 let result = resolve_versions(
373 &supported,
374 Some(Version::new(6, 9, 0)),
375 Some(Version::new(6, 5, 0)),
376 Some(Version::new(6, 7, 0)),
377 );
378
379 assert_eq!(result, vec![]);
380 }
381
382 #[test]
383 fn test_empty_range() {
384 let supported = vec![
385 Version::new(6, 5, 0),
386 Version::new(6, 6, 0),
387 Version::new(6, 7, 0),
388 Version::new(6, 8, 0),
389 Version::new(6, 9, 0),
390 Version::new(6, 10, 0),
391 ];
392
393 let result = resolve_versions(
394 &supported,
395 None,
396 Some(Version::new(6, 7, 0)),
397 Some(Version::new(6, 6, 0)),
398 );
399
400 assert_eq!(result, vec![]);
401 }
402
403 #[test]
404 fn test_no_minimum() {
405 let supported = vec![
406 Version::new(6, 5, 0),
407 Version::new(6, 6, 0),
408 Version::new(6, 7, 0),
409 Version::new(6, 8, 0),
410 Version::new(6, 9, 0),
411 Version::new(6, 10, 0),
412 ];
413
414 let result = resolve_versions(&supported, None, None, Some(Version::new(6, 9, 0)));
415
416 assert_eq!(
417 result,
418 vec![
419 Version::new(6, 5, 0),
420 Version::new(6, 6, 0),
421 Version::new(6, 7, 0),
422 Version::new(6, 8, 0),
423 Version::new(6, 9, 0),
424 ]
425 );
426 }
427
428 #[test]
429 fn test_no_maximum() {
430 let supported = vec![
431 Version::new(6, 5, 0),
432 Version::new(6, 6, 0),
433 Version::new(6, 7, 0),
434 Version::new(6, 8, 0),
435 Version::new(6, 9, 0),
436 Version::new(6, 10, 0),
437 ];
438
439 let result = resolve_versions(&supported, None, Some(Version::new(6, 7, 0)), None);
440
441 assert_eq!(
442 result,
443 vec![
444 Version::new(6, 7, 0),
445 Version::new(6, 8, 0),
446 Version::new(6, 9, 0),
447 Version::new(6, 10, 0),
448 ]
449 );
450 }
451}