xref: /third_party/rust/crates/which-rs/src/helper.rs (revision b3ba51a1)
1b3ba51a1Sopenharmony_ciuse std::path::Path;
2b3ba51a1Sopenharmony_ci
3b3ba51a1Sopenharmony_ci/// Check if given path has extension which in the given vector.
4b3ba51a1Sopenharmony_cipub fn has_executable_extension<T: AsRef<Path>, S: AsRef<str>>(path: T, pathext: &[S]) -> bool {
5b3ba51a1Sopenharmony_ci    let ext = path.as_ref().extension().and_then(|e| e.to_str());
6b3ba51a1Sopenharmony_ci    match ext {
7b3ba51a1Sopenharmony_ci        Some(ext) => pathext
8b3ba51a1Sopenharmony_ci            .iter()
9b3ba51a1Sopenharmony_ci            .any(|e| ext.eq_ignore_ascii_case(&e.as_ref()[1..])),
10b3ba51a1Sopenharmony_ci        _ => false,
11b3ba51a1Sopenharmony_ci    }
12b3ba51a1Sopenharmony_ci}
13b3ba51a1Sopenharmony_ci
14b3ba51a1Sopenharmony_ci#[cfg(test)]
15b3ba51a1Sopenharmony_cimod test {
16b3ba51a1Sopenharmony_ci    use super::*;
17b3ba51a1Sopenharmony_ci    use std::path::PathBuf;
18b3ba51a1Sopenharmony_ci
19b3ba51a1Sopenharmony_ci    #[test]
20b3ba51a1Sopenharmony_ci    fn test_extension_in_extension_vector() {
21b3ba51a1Sopenharmony_ci        // Case insensitive
22b3ba51a1Sopenharmony_ci        assert!(has_executable_extension(
23b3ba51a1Sopenharmony_ci            PathBuf::from("foo.exe"),
24b3ba51a1Sopenharmony_ci            &[".COM", ".EXE", ".CMD"]
25b3ba51a1Sopenharmony_ci        ));
26b3ba51a1Sopenharmony_ci
27b3ba51a1Sopenharmony_ci        assert!(has_executable_extension(
28b3ba51a1Sopenharmony_ci            PathBuf::from("foo.CMD"),
29b3ba51a1Sopenharmony_ci            &[".COM", ".EXE", ".CMD"]
30b3ba51a1Sopenharmony_ci        ));
31b3ba51a1Sopenharmony_ci    }
32b3ba51a1Sopenharmony_ci
33b3ba51a1Sopenharmony_ci    #[test]
34b3ba51a1Sopenharmony_ci    fn test_extension_not_in_extension_vector() {
35b3ba51a1Sopenharmony_ci        assert!(!has_executable_extension(
36b3ba51a1Sopenharmony_ci            PathBuf::from("foo.bar"),
37b3ba51a1Sopenharmony_ci            &[".COM", ".EXE", ".CMD"]
38b3ba51a1Sopenharmony_ci        ));
39b3ba51a1Sopenharmony_ci    }
40b3ba51a1Sopenharmony_ci}
41