mod android;
mod desktop;
mod ipad;
mod iphone;
pub use android::*;
pub use desktop::*;
pub use ipad::*;
pub use iphone::*;
use crate::context::ViewportSize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BrowserType {
#[default]
Chromium,
Firefox,
Webkit,
}
#[derive(Debug, Clone)]
pub struct DeviceDescriptor {
pub name: &'static str,
pub user_agent: &'static str,
pub viewport: ViewportSize,
pub device_scale_factor: f64,
pub is_mobile: bool,
pub has_touch: bool,
pub default_browser_type: BrowserType,
}
impl DeviceDescriptor {
pub const fn new(
name: &'static str,
user_agent: &'static str,
viewport: ViewportSize,
device_scale_factor: f64,
is_mobile: bool,
has_touch: bool,
default_browser_type: BrowserType,
) -> Self {
Self {
name,
user_agent,
viewport,
device_scale_factor,
is_mobile,
has_touch,
default_browser_type,
}
}
}
pub fn all_devices() -> Vec<&'static DeviceDescriptor> {
vec![
&IPHONE_14_PRO_MAX,
&IPHONE_14_PRO,
&IPHONE_14,
&IPHONE_13_PRO_MAX,
&IPHONE_13_PRO,
&IPHONE_13,
&IPHONE_13_MINI,
&IPHONE_12_PRO_MAX,
&IPHONE_12_PRO,
&IPHONE_12,
&IPHONE_12_MINI,
&IPHONE_11_PRO_MAX,
&IPHONE_11_PRO,
&IPHONE_11,
&IPHONE_SE_3,
&IPHONE_SE,
&IPHONE_13_LANDSCAPE,
&IPAD_PRO_12_9,
&IPAD_PRO_11,
&IPAD_AIR,
&IPAD,
&IPAD_MINI,
&IPAD_PRO_11_LANDSCAPE,
&PIXEL_7_PRO,
&PIXEL_7,
&PIXEL_6_PRO,
&PIXEL_6,
&PIXEL_5,
&PIXEL_4,
&PIXEL_7_LANDSCAPE,
&GALAXY_S23_ULTRA,
&GALAXY_S23,
&GALAXY_S21,
&GALAXY_TAB_S8,
&DESKTOP_CHROME,
&DESKTOP_CHROME_HIDPI,
&DESKTOP_SAFARI,
&DESKTOP_FIREFOX,
&DESKTOP_EDGE,
]
}
pub fn find_device(name: &str) -> Option<&'static DeviceDescriptor> {
let name_lower = name.to_lowercase();
all_devices()
.into_iter()
.find(|d| d.name.to_lowercase() == name_lower)
}
#[cfg(test)]
mod tests;