| use std::path::Path; |
| |
| /// Check if given path has extension which in the given vector. |
| pub fn has_executable_extension<T: AsRef<Path>, S: AsRef<str>>(path: T, pathext: &[S]) -> bool { |
| let ext = path.as_ref().extension().and_then(|e| e.to_str()); |
| match ext { |
| Some(ext) => pathext |
| .iter() |
| .any(|e| ext.eq_ignore_ascii_case(&e.as_ref()[1..])), |
| _ => false, |
| } |
| } |
| |
| #[cfg(test)] |
| mod test { |
| use super::*; |
| use std::path::PathBuf; |
| |
| #[test] |
| fn test_extension_in_extension_vector() { |
| // Case insensitive |
| assert!(has_executable_extension( |
| PathBuf::from("foo.exe"), |
| &[".COM", ".EXE", ".CMD"] |
| )); |
| |
| assert!(has_executable_extension( |
| PathBuf::from("foo.CMD"), |
| &[".COM", ".EXE", ".CMD"] |
| )); |
| } |
| |
| #[test] |
| fn test_extension_not_in_extension_vector() { |
| assert!(!has_executable_extension( |
| PathBuf::from("foo.bar"), |
| &[".COM", ".EXE", ".CMD"] |
| )); |
| } |
| } |