1use crate::get_error;
4use crate::Error;
5use std::error;
6use std::ffi::{CString, NulError};
7use std::fmt;
8use sys::misc::SDL_OpenURL;
9
10#[derive(Debug, Clone)]
11pub enum OpenUrlError {
12 InvalidUrl(NulError),
13 SdlError(Error),
14}
15
16impl fmt::Display for OpenUrlError {
17 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
18 use self::OpenUrlError::*;
19
20 match *self {
21 InvalidUrl(ref e) => write!(f, "Invalid URL: {}", e),
22 SdlError(ref e) => write!(f, "SDL error: {}", e),
23 }
24 }
25}
26
27impl error::Error for OpenUrlError {
28 fn description(&self) -> &str {
29 use self::OpenUrlError::*;
30
31 match *self {
32 InvalidUrl(_) => "invalid URL",
33 SdlError(ref e) => &e.0,
34 }
35 }
36}
37
38#[doc(alias = "SDL_OpenURL")]
57pub fn open_url(url: &str) -> Result<(), OpenUrlError> {
58 use self::OpenUrlError::*;
59 let result = unsafe {
60 let url = match CString::new(url) {
61 Ok(s) => s,
62 Err(err) => return Err(InvalidUrl(err)),
63 };
64 SDL_OpenURL(url.as_ptr())
65 };
66
67 if result {
68 Ok(())
69 } else {
70 Err(SdlError(get_error()))
71 }
72}