use std::ops::RangeInclusive;
use crate::{Header, Platform, generated};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Browser {
Chrome,
Edge,
Firefox,
Safari,
}
impl Browser {
pub const ALL: [Self; 4] = [Self::Chrome, Self::Edge, Self::Firefox, Self::Safari];
pub(crate) const fn headers(self) -> &'static [Header] {
match self {
Self::Chrome => generated::CHROME_HEADERS,
Self::Edge => generated::EDGE_HEADERS,
Self::Firefox => generated::FIREFOX_HEADERS,
Self::Safari => generated::SAFARI_HEADERS,
}
}
#[must_use]
pub const fn latest(self) -> u32 {
match self {
Self::Chrome => generated::CHROME_LATEST,
Self::Edge => generated::EDGE_LATEST,
Self::Firefox => generated::FIREFOX_LATEST,
Self::Safari => generated::SAFARI_LATEST,
}
}
#[must_use]
pub const fn platforms(self) -> &'static [Platform] {
match self {
Self::Chrome | Self::Firefox => &[
Platform::Windows,
Platform::MacOs,
Platform::Linux,
Platform::Android,
],
Self::Edge => &[Platform::Windows, Platform::MacOs, Platform::Linux],
Self::Safari => &[Platform::MacOs, Platform::Ios],
}
}
pub(crate) const fn default_share(self) -> u32 {
match self {
Browser::Chrome => 65,
Browser::Safari => 18,
Browser::Edge => 10,
Browser::Firefox => 7,
}
}
pub(crate) fn default_versions(self) -> RangeInclusive<u32> {
let latest = self.latest();
match self {
Browser::Safari => latest..=latest,
_ => latest - 1..=latest,
}
}
pub(crate) const fn share(self, platform: Platform) -> u32 {
match (self, platform) {
(Browser::Chrome | Browser::Firefox, Platform::Windows) => 70,
(Browser::Chrome, Platform::MacOs) => 22,
(Browser::Chrome, Platform::Linux) => 8,
(Browser::Firefox, Platform::MacOs | Platform::Linux) => 15,
(Browser::Edge, Platform::Windows) => 90,
(Browser::Edge, Platform::MacOs) => 9,
(Browser::Edge, Platform::Linux) => 1,
_ => 100,
}
}
}