#[cfg_attr(target_os = "macos", path = "macos.rs")]
#[cfg_attr(target_os = "android", path = "android.rs")]
#[cfg_attr(target_arch = "wasm32", path = "wasm.rs")]
#[cfg_attr(windows, path = "windows.rs")]
#[cfg_attr(
any(
target_os = "linux",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd",
target_os = "haiku"
),
path = "unix.rs"
)]
mod os;
#[cfg(not(any(
target_os = "android",
target_os = "windows",
target_os = "macos",
target_os = "linux",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd",
target_os = "haiku",
target_arch = "wasm32"
)))]
compile_error!("Only Windows, Mac OS, Linux, *BSD and Haiku and Wasm32 are currently supported");
use std::default::Default;
use std::io::{Error, ErrorKind, Result};
use std::str::FromStr;
use std::{error, fmt};
#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
pub enum Browser {
Default,
Firefox,
InternetExplorer,
Chrome,
Opera,
Safari,
WebPositive,
}
impl Browser {
pub fn is_available() -> bool {
Browser::Default.exists()
}
pub fn exists(&self) -> bool {
open_browser_with_options(
*self,
"https://rootnet.in",
BrowserOptions::new().with_dry_run(true),
)
.is_ok()
}
}
#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
pub struct ParseBrowserError;
impl fmt::Display for ParseBrowserError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("Invalid browser given")
}
}
impl error::Error for ParseBrowserError {
fn description(&self) -> &str {
"invalid browser"
}
}
impl Default for Browser {
fn default() -> Self {
Browser::Default
}
}
impl fmt::Display for Browser {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Browser::Default => f.write_str("Default"),
Browser::Firefox => f.write_str("Firefox"),
Browser::InternetExplorer => f.write_str("Internet Explorer"),
Browser::Chrome => f.write_str("Chrome"),
Browser::Opera => f.write_str("Opera"),
Browser::Safari => f.write_str("Safari"),
Browser::WebPositive => f.write_str("WebPositive"),
}
}
}
impl FromStr for Browser {
type Err = ParseBrowserError;
fn from_str(s: &str) -> ::std::result::Result<Self, Self::Err> {
match s {
"firefox" => Ok(Browser::Firefox),
"default" => Ok(Browser::Default),
"ie" | "internet explorer" | "internetexplorer" => Ok(Browser::InternetExplorer),
"chrome" => Ok(Browser::Chrome),
"opera" => Ok(Browser::Opera),
"safari" => Ok(Browser::Safari),
"webpositive" => Ok(Browser::WebPositive),
_ => Err(ParseBrowserError),
}
}
}
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
pub struct BrowserOptions {
suppress_output: bool,
target_hint: String,
dry_run: bool,
}
impl fmt::Display for BrowserOptions {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_fmt(format_args!(
"BrowserOptions(supress_output={}, target_hint={}, dry_run={})",
self.suppress_output, self.target_hint, self.dry_run
))
}
}
impl std::default::Default for BrowserOptions {
fn default() -> Self {
let target_hint = String::from(option_env!("WEBBROWSER_WASM_TARGET").unwrap_or("_blank"));
BrowserOptions {
suppress_output: true,
target_hint,
dry_run: false,
}
}
}
impl BrowserOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_suppress_output(&mut self, suppress_output: bool) -> &mut Self {
self.suppress_output = suppress_output;
self
}
pub fn with_target_hint(&mut self, target_hint: &str) -> &mut Self {
self.target_hint = target_hint.to_owned();
self
}
pub fn with_dry_run(&mut self, dry_run: bool) -> &mut Self {
self.dry_run = dry_run;
self
}
}
pub fn open(url: &str) -> Result<()> {
open_browser(Browser::Default, url)
}
pub fn open_browser(browser: Browser, url: &str) -> Result<()> {
open_browser_with_options(browser, url, &BrowserOptions::default())
}
pub fn open_browser_with_options(
browser: Browser,
url: &str,
options: &BrowserOptions,
) -> Result<()> {
let url_s: String = match url::Url::parse(url) {
Ok(u) => u.as_str().into(),
Err(_) => url.into(),
};
os::open_browser_internal(browser, &url_s, options)
}
#[test]
#[ignore]
fn test_open_firefox() {
assert!(open_browser(Browser::Firefox, "http://github.com").is_ok());
}
#[test]
#[ignore]
fn test_open_chrome() {
assert!(open_browser(Browser::Chrome, "http://github.com").is_ok());
}
#[test]
#[ignore]
fn test_open_safari() {
assert!(open_browser(Browser::Safari, "http://github.com").is_ok());
}
#[test]
#[ignore]
fn test_open_webpositive() {
assert!(open_browser(Browser::WebPositive, "http://github.com").is_ok());
}