1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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<K, V>(map: &'static [(K, V)], key: &str) -> Option<V> where K: Copy + Into<UniCase<&'static str>>, V: Copy { map.binary_search_by_key(&UniCase::new(key), |(k, _)| (*k).into()) .ok() .map(|i| map[i].1) }