Skip to main content

rez_next_common/
utils.rs

1//! Utility functions for rez-core
2
3/// Get the number of threads to use for parallel operations
4#[must_use]
5pub fn get_thread_count(config_threads: Option<usize>) -> usize {
6    config_threads.unwrap_or_else(|| {
7        std::thread::available_parallelism()
8            .map(std::num::NonZeroUsize::get)
9            .unwrap_or(4)
10    })
11}
12
13/// Validate a package name
14#[must_use]
15pub fn is_valid_package_name(name: &str) -> bool {
16    !name.is_empty()
17        && name
18            .chars()
19            .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
20        && !name.starts_with('-')
21        && !name.ends_with('-')
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27
28    #[test]
29    fn test_thread_count() {
30        assert!(get_thread_count(None) >= 1);
31        assert_eq!(get_thread_count(Some(8)), 8);
32    }
33
34    #[test]
35    fn test_thread_count_custom_zero_is_accepted() {
36        // Custom value of 0 should be returned as-is (caller responsibility)
37        assert_eq!(get_thread_count(Some(0)), 0);
38    }
39
40    #[test]
41    fn test_thread_count_large_value() {
42        assert_eq!(get_thread_count(Some(256)), 256);
43    }
44
45    #[test]
46    fn test_package_name_validation() {
47        assert!(is_valid_package_name("valid_package"));
48        assert!(is_valid_package_name("valid-package"));
49        assert!(is_valid_package_name("package123"));
50
51        assert!(!is_valid_package_name(""));
52        assert!(!is_valid_package_name("-invalid"));
53        assert!(!is_valid_package_name("invalid-"));
54        assert!(!is_valid_package_name("invalid package"));
55    }
56
57    #[test]
58    fn test_package_name_single_char() {
59        assert!(is_valid_package_name("a"));
60        assert!(is_valid_package_name("1"));
61        assert!(!is_valid_package_name("-"));
62    }
63
64    #[test]
65    fn test_package_name_numbers_only() {
66        assert!(is_valid_package_name("123"));
67    }
68
69    #[test]
70    fn test_package_name_special_chars_rejected() {
71        assert!(!is_valid_package_name("pkg@1"));
72        assert!(!is_valid_package_name("pkg.name"));
73        assert!(!is_valid_package_name("pkg/name"));
74        assert!(!is_valid_package_name("pkg:name"));
75    }
76
77    #[test]
78    fn test_package_name_mixed_valid() {
79        assert!(is_valid_package_name("my_package-1"));
80        assert!(is_valid_package_name("PkgName"));
81        assert!(is_valid_package_name("pkg_2024"));
82    }
83
84    #[test]
85    fn test_package_name_consecutive_hyphens() {
86        // Consecutive hyphens are valid (only start/end restriction)
87        assert!(is_valid_package_name("pkg--name"));
88    }
89}