browserslist_data/caniuse/
features.rs1use 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
13include!("../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}