| 1 | use unicase::UniCase;
|
| 2 |
|
| 3 | include!("mime_types.rs" );
|
| 4 | include!(env!("MIME_TYPES_GENERATED_PATH" ));
|
| 5 |
|
| 6 | #[cfg (feature = "rev-mappings" )]
|
| 7 | #[derive (Copy, Clone)]
|
| 8 | struct TopLevelExts {
|
| 9 | start: usize,
|
| 10 | end: usize,
|
| 11 | subs: &'static [(UniCase<&'static str>, (usize, usize))],
|
| 12 | }
|
| 13 |
|
| 14 | pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> {
|
| 15 | let ext: UniCase<&str> = UniCase::new(ext);
|
| 16 |
|
| 17 | map_lookup(map:MIME_TYPES, &ext)
|
| 18 | }
|
| 19 |
|
| 20 | #[cfg (feature = "rev-mappings" )]
|
| 21 | pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> {
|
| 22 | if toplevel == "*" {
|
| 23 | return Some(EXTS);
|
| 24 | }
|
| 25 |
|
| 26 | let top: TopLevelExts = map_lookup(map:REV_MAPPINGS, key:toplevel)?;
|
| 27 |
|
| 28 | if sublevel == "*" {
|
| 29 | return Some(&EXTS[top.start..top.end]);
|
| 30 | }
|
| 31 |
|
| 32 | let sub: (usize, usize) = map_lookup(&top.subs, key:sublevel)?;
|
| 33 | Some(&EXTS[sub.0..sub.1])
|
| 34 | }
|
| 35 |
|
| 36 | fn map_lookup<K, V>(map: &'static [(K, V)], key: &str) -> Option<V>
|
| 37 | where K: Copy + Into<UniCase<&'static str>>, V: Copy {
|
| 38 | mapOption.binary_search_by_key(&UniCase::new(key), |(k: &K, _)| (*k).into())
|
| 39 | .ok()
|
| 40 | .map(|i: usize| map[i].1)
|
| 41 | }
|
| 42 | |