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
use std::error;
use std::ffi::{CString, NulError};
use std::fmt;
use crate::get_error;
use crate::sys;
#[derive(Debug, Clone)]
pub enum OpenUrlError {
InvalidUrl(NulError),
SdlError(String),
}
impl fmt::Display for OpenUrlError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::OpenUrlError::*;
match *self {
InvalidUrl(ref e) => write!(f, "Invalid URL: {}", e),
SdlError(ref e) => write!(f, "SDL error: {}", e),
}
}
}
impl error::Error for OpenUrlError {
fn description(&self) -> &str {
use self::OpenUrlError::*;
match *self {
InvalidUrl(_) => "invalid URL",
SdlError(ref e) => e,
}
}
}
#[doc(alias = "SDL_OpenURL")]
pub fn open_url(url: &str) -> Result<(), OpenUrlError> {
use self::OpenUrlError::*;
let result = unsafe {
let url = match CString::new(url) {
Ok(s) => s,
Err(err) => return Err(InvalidUrl(err)),
};
sys::SDL_OpenURL(url.as_ptr())
} == 0;
if result {
Ok(())
} else {
Err(SdlError(get_error()))
}
}