use unicase::UniCase; include!("mime_types.rs"); include!(concat!(env!("OUT_DIR"), "/mime_types_generated.rs")); #[cfg(feature = "rev-mappings")] #[derive(Copy, Clone)] struct TopLevelExts { start: usize, end: usize, subs: &'static [(UniCase<&'static str>, (usize, usize))], } pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> { let ext = UniCase::new(ext); map_lookup(MIME_TYPES, &ext) } #[cfg(feature = "rev-mappings")] pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> { if toplevel == "*" { return Some(EXTS); } let top = map_lookup(REV_MAPPINGS, toplevel)?; if sublevel == "*" { return Some(&EXTS[top.start..top.end]); } let sub = map_lookup(&top.subs, sublevel)?; Some(&EXTS[sub.0..sub.1]) } fn map_lookup(map: &'static [(K, V)], key: &str) -> Option where K: Copy + Into>, V: Copy { map.binary_search_by_key(&UniCase::new(key), |(k, _)| (*k).into()) .ok() .map(|i| map[i].1) }