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#[derive(Debug)]
13pub enum Error {
14 UninitializedField(&'static str),
16 Initialization,
18 NulByte(NulError),
20 JsEvaluation,
22 CssInjection,
24 Dispatch,
27 Custom(Box<dyn CustomError>),
29}
30
31impl Error {
32 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
66pub type WVResult<T = ()> = Result<T, Error>;
68
69impl From<NulError> for Error {
70 fn from(e: NulError) -> Error {
71 Error::NulByte(e)
72 }
73}