summaryrefslogtreecommitdiffstats
path: root/vendor/mime_guess/src/impl_phf.rs
blob: 980c31f369f9bc05f16e078e11e7a10574f8ab48 (plain)
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
extern crate phf;

use unicase::UniCase;

include!(concat!(env!("OUT_DIR"), "/mime_types_generated.rs"));

#[cfg(feature = "rev-mappings")]
struct TopLevelExts {
    start: usize,
    end: usize,
    subs: phf::Map<UniCase<&'static str>, (usize, usize)>,
}

pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> {
    map_lookup(&MIME_TYPES, ext).cloned()
}

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<'key, 'map: 'key, V>(
    map: &'map phf::Map<UniCase<&'static str>, V>,
    key: &'key str,
) -> Option<&'map V> {
    // FIXME: this doesn't compile unless we transmute `key` to `UniCase<&'static str>`
    // https://github.com/sfackler/rust-phf/issues/169
    map.get(&UniCase::new(key))
}