web_view/
error.rs

1use std::{
2    error,
3    ffi::NulError,
4    fmt::{self, Debug, Display},
5};
6
7pub trait CustomError: Display + Debug + Send + Sync + 'static {}
8
9impl<T: Display + Debug + Send + Sync + 'static> CustomError for T {}
10
11/// A WebView error.
12#[derive(Debug)]
13pub enum Error {
14    /// While attempting to build a WebView instance, a required field was not initialized.
15    UninitializedField(&'static str),
16    /// An error occurred while initializing a WebView instance.
17    Initialization,
18    /// A nul-byte was found in a provided string.
19    NulByte(NulError),
20    /// An error occurred while evaluating JavaScript in a WebView instance.
21    JsEvaluation,
22    /// An error occurred while injecting CSS into a WebView instance.
23    CssInjection,
24    /// Failure to dispatch a closure to a WebView instance via a handle, likely because the
25    /// WebView was dropped.
26    Dispatch,
27    /// An user-specified error occurred. For use inside invoke and dispatch closures.
28    Custom(Box<dyn CustomError>),
29}
30
31impl Error {
32    /// Creates a custom error from a `T: Display + Debug + Send + Sync + 'static`.
33    pub fn custom<E: CustomError>(error: E) -> Error {
34        Error::Custom(Box::new(error))
35    }
36}
37
38impl error::Error for Error {
39    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
40        match self {
41            Error::NulByte(ref cause) => Some(cause),
42            _ => None,
43        }
44    }
45}
46
47impl Display for Error {
48    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
49        match self {
50            Error::UninitializedField(field) => {
51                write!(f, "Required field uninitialized: {}.", field)
52            }
53            Error::Initialization => write!(f, "Webview failed to initialize."),
54            Error::NulByte(cause) => write!(f, "{}", cause),
55            Error::JsEvaluation => write!(f, "Failed to evaluate JavaScript."),
56            Error::CssInjection => write!(f, "Failed to inject CSS."),
57            Error::Dispatch => write!(
58                f,
59                "Closure could not be dispatched. WebView was likely dropped."
60            ),
61            Error::Custom(e) => write!(f, "Error: {}", e),
62        }
63    }
64}
65
66/// A WebView result.
67pub type WVResult<T = ()> = Result<T, Error>;
68
69impl From<NulError> for Error {
70    fn from(e: NulError) -> Error {
71        Error::NulByte(e)
72    }
73}