pub use mbr_core::errors::*;
#[cfg(feature = "server")]
pub use mbr_server::errors::ServerError;
#[cfg(feature = "gui")]
use thiserror::Error;
#[cfg(feature = "gui")]
#[derive(Debug, Error)]
pub enum BrowserError {
#[error("Failed to create window")]
WindowCreationFailed(#[source] tao::error::OsError),
#[error("Failed to create webview")]
WebViewCreationFailed(#[source] wry::Error),
#[error("Failed to load icon")]
IconLoadFailed(String),
#[error("Failed to create icon from RGBA data")]
IconCreationFailed(#[source] tao::window::BadIcon),
#[error("Server failed to start for new folder")]
ServerStartFailed,
}
#[cfg(feature = "gui")]
#[derive(Debug, Error)]
pub enum ExternalOpenError {
#[error(
"Refusing to open {url}: handing URLs to the operating system is GUI-only, \
and no GUI window is running in this process"
)]
GuiOnly { url: String },
#[error("The system URL parser rejected {url}")]
Malformed { url: String },
#[error("The system refused to open {url}: {reason}")]
LaunchFailed { url: String, reason: String },
}
#[cfg(feature = "gui")]
impl From<BrowserError> for MbrError {
fn from(err: BrowserError) -> Self {
MbrError::Browser(Box::new(err))
}
}
#[cfg(all(test, feature = "gui"))]
mod tests {
use super::*;
#[test]
fn browser_error_keeps_its_message_through_mbr_error() {
let mbr_err: MbrError = BrowserError::ServerStartFailed.into();
assert_eq!(
mbr_err.to_string(),
"Browser error: Server failed to start for new folder"
);
match &mbr_err {
MbrError::Browser(inner) => assert!(matches!(
inner.downcast_ref::<BrowserError>(),
Some(BrowserError::ServerStartFailed)
)),
_ => panic!("Expected MbrError::Browser, got {mbr_err:?}"),
}
}
}