Skip to main content

qt_version/
lib.rs

1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only
3
4use 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}