1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
//! A crate for opening URIs, e.g., URLs, `tel:`, `mailto:`, `file://`, etc.
//!
//! ```
//! # use robius_open::Uri;
//! Uri::new("tel:+61 123 456 789")
//! .open()
//! .expect("failed to open telephone URI");
//! ```
//!
//! Supports:
//! - macOS (`NSWorkspace`)
//! - Android (`android/content/Intent`)
//! - Linux (`xdg-open`)
//! - Windows (`start`)
//! - iOS (`UIApplication`)
//!
//! # Android
//! To use the library on Android, you must add the following to the app
//! manifest:
//! ```xml
//! <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
//! tools:ignore="QueryAllPackagesPermission" />
//!
//! <queries>
//! <intent>
//! <action android:name="android.intent.action.MAIN" />
//! </intent>
//! </queries>
//! ```
//! or alternatively, disable the `android-result` feature. However, disabling
//! this feature will make [`Uri::open`] always return `Ok`, regardless of
//! whether the URI was successfully opened.
#![allow(clippy::result_unit_err)]
mod error;
mod sys;
pub use error::{Error, Result};
/// A uniform resource identifier.
pub struct Uri<'a, 'b> {
inner: sys::Uri<'a, 'b>,
}
impl<'a, 'b> Uri<'a, 'b> {
/// Constructs a new URI.
pub fn new(s: &'a str) -> Self {
Self {
inner: sys::Uri::new(s),
}
}
/// Sets the action to perform with this URI.
///
/// This only has an effect on Android, and corresponds to an [action
/// activity][aa]. By default, it is set to `"ACTION_VIEW"`.
///
/// # Examples
///
/// ```
/// # use robius_open::Uri;
/// Uri::new("tel:+61 123 456 789")
/// .action("ACTION_DIAL")
/// .open()
/// .expect("failed to open telephone URI");
/// ```
///
/// [aa]: https://developer.android.com/reference/android/content/Intent#standard-activity-actions
pub fn action(self, action: &'b str) -> Self {
Self {
inner: self.inner.action(action),
}
}
/// Opens the URI.
pub fn open(self) -> Result<()> {
self.inner.open()
}
}