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