#[derive(Debug, Clone)]
pub struct Feature<'a>
{
feature_name: &'a FeatureName,
feature_detail: &'a FeatureDetail,
}
impl<'a> Feature<'a>
{
#[inline(always)]
pub fn feature_name(&self) -> &'a FeatureName
{
self.feature_name
}
#[inline(always)]
pub fn title(&self) -> &'a str
{
&self.feature_detail.title
}
#[inline(always)]
pub fn description(&self) -> &'a str
{
&self.feature_detail.description
}
#[inline(always)]
pub fn specification_url(&self) -> &'a Url
{
&self.feature_detail.specification_url
}
#[inline(always)]
pub fn status(&self) -> &'a Status
{
&self.feature_detail.status
}
#[inline(always)]
pub fn links(&self) -> &'a [Link]
{
&self.feature_detail.links[..]
}
#[inline(always)]
pub fn bugs(&self) -> &'a [Bug]
{
&self.feature_detail.bugs[..]
}
#[inline(always)]
pub fn categories(&self) -> &'a [Category]
{
&self.feature_detail.categories[..]
}
#[inline(always)]
pub fn general_notes(&self) -> &'a str
{
&self.feature_detail.notes
}
#[inline(always)]
pub fn implementations_by_agents(&'a self, agent_name: &AgentName, lower_bound: Bound<&Version>, upper_bound: Bound<&Version>) -> Option<SupportRangeIterator<'a>>
{
match self.feature_detail.implementations_by_agents.get(agent_name)
{
None => None,
Some(entry) => Some
(
SupportRangeIterator
{
feature: self,
range: entry.range((lower_bound, upper_bound)),
}
),
}
}
#[inline(always)]
pub fn implementation(&'a self, agent_name: &AgentName, version: &Version) -> Option<Option<Support<'a>>>
{
match self.feature_detail.implementations_by_agents.get(agent_name)
{
None => None,
Some(entry) =>
{
match entry.get(version)
{
None => Some(None),
Some(support_detail) => Some(Some(Support
{
support_detail,
feature: self,
}))
}
}
}
}
#[inline(always)]
pub fn supported_by_default_usage(&self) -> UsagePercentage
{
self.feature_detail.supported_by_default_usage
}
#[inline(always)]
pub fn almost_supported_usage(&self) -> UsagePercentage
{
self.feature_detail.almost_supported_usage
}
#[inline(always)]
pub fn parent_feature_if_any(&self) -> Option<&'a FeatureName>
{
self.feature_detail.parent.as_ref()
}
#[inline(always)]
pub fn keywords(&self) -> &'a [String]
{
&self.feature_detail.keywords[..]
}
#[inline(always)]
pub fn feature_identifiers(&self, agentName: &AgentName) -> &'a [String]
{
const NoNoneIdentifiers: [String; 0] = [];
use self::AgentName::*;
match *agentName
{
MicrosoftInternetExplorer => self.internet_explorer_feature_identifiers(),
MicrosoftEdge => self.internet_explorer_feature_identifiers(),
MozillaFirefox => self.firefox_feature_identifiers(),
GoogleChrome => self.blink_feature_identifiers(),
AppleSafari => self.webkit_feature_identifiers(),
Opera => &self.feature_detail.blink_feature_identifiers[..],
AppleSafariIOs => self.webkit_feature_identifiers(),
OperaMini => &NoNoneIdentifiers[..],
GoogleAndroidBrowserAndWebComponent => self.webkit_feature_identifiers(),
Blackberry => self.webkit_feature_identifiers(),
OperaMobile => self.blink_feature_identifiers(),
GoogleChromeAndroid => self.blink_feature_identifiers(),
MozillaFirefoxAndroid => self.firefox_feature_identifiers(),
MicrosoftInternetExplorerMobile => self.internet_explorer_feature_identifiers(),
UcBrowserAndroid => self.webkit_feature_identifiers(),
SamsungBrowserAndroid => self.webkit_feature_identifiers(),
QqBrowserAndroid => self.webkit_feature_identifiers(),
BaiduBrowserAndroid => self.webkit_feature_identifiers(),
Unknown(_) => &NoNoneIdentifiers[..],
_ => &NoNoneIdentifiers[..],
}
}
#[inline(always)]
pub fn internet_explorer_feature_identifiers(&self) -> &'a [String]
{
&self.feature_detail.internet_explorer_feature_identifiers[..]
}
#[inline(always)]
pub fn blink_feature_identifiers(&self) -> &'a [String]
{
&self.feature_detail.blink_feature_identifiers[..]
}
#[inline(always)]
pub fn firefox_feature_identifiers(&self) -> &'a [String]
{
&self.feature_detail.firefox_feature_identifiers[..]
}
#[inline(always)]
pub fn webkit_feature_identifiers(&self) -> &'a [String]
{
&self.feature_detail.webkit_feature_identifiers[..]
}
#[inline(always)]
pub fn upper_case_prefix(&self) -> bool
{
self.feature_detail.upper_case_prefix
}
#[inline(always)]
pub fn this_feature_is_not_yet_complete_or_accurate(&self) -> bool
{
!self.feature_detail.shown
}
}