browserslist_data/caniuse/
features.rs

1use super::PooledStr;
2use crate::{
3    decode_browser_name,
4    utils::{BinMap, PairU32, U32},
5};
6
7#[derive(Clone, Copy)]
8pub struct Feature(u32, u32);
9
10#[derive(Clone, Copy)]
11pub struct VersionList(PairU32);
12
13// ```rust
14// static FEATURES: &[(PooledStr, Feature)]; // feature name and browsers list
15//
16// static FEATURES_STAT_VERSION_STORE: &[U32]; // version string
17// static FEATURES_STAT_VERSION_INDEX: &[PairU32]; // version range
18//
19// static FEATURES_STAT_FLAGS: &[u8]; // support flag
20// static FEATURES_STAT_BROWSERS: &[u8]; // browser name id
21// ```
22include!("../generated/caniuse-feature-matching.rs");
23
24pub fn get_feature_stat(name: &str) -> Option<Feature> {
25    BinMap(FEATURES).get(name).copied()
26}
27
28impl Feature {
29    pub fn get(&self, browser: &str) -> Option<VersionList> {
30        let range = (self.0 as usize)..(self.1 as usize);
31        let index = FEATURES_STAT_BROWSERS[range.clone()]
32            .binary_search_by_key(&browser, |&k| decode_browser_name(k))
33            .ok()?;
34        let list = FEATURES_STAT_VERSION_INDEX[range][index];
35        Some(VersionList(list))
36    }
37
38    pub fn iter(&self) -> impl Iterator<Item = (&'static str, VersionList)> {
39        let range = (self.0 as usize)..(self.1 as usize);
40        FEATURES_STAT_BROWSERS[range.clone()]
41            .iter()
42            .zip(&FEATURES_STAT_VERSION_INDEX[range])
43            .map(|(&name, &list)| (decode_browser_name(name), VersionList(list)))
44    }
45}
46
47impl VersionList {
48    pub fn get(&self, version: &str) -> Option<u8> {
49        let range = (self.0.0.get() as usize)..(self.0.1.get() as usize);
50        let index = FEATURES_STAT_VERSION_STORE[range.clone()]
51            .binary_search_by_key(&version, |s| PooledStr(s.get()).as_str())
52            .ok()?;
53        Some(FEATURES_STAT_FLAGS[range][index])
54    }
55}