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