diff --git a/Cargo.lock b/Cargo.lock index 23efdfa..5b1a057 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2989,6 +2989,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tower" version = "0.5.2" @@ -3084,7 +3090,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml", + "toml 0.9.5", ] [[package]] diff --git a/src/frontend.rs b/src/frontend.rs index 403216c..cc8058a 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -79,6 +79,48 @@ pub enum BrowserConsoleError { UnsupportedTarget } +impl BrowserConsoleError { + /// Returns the contextual message associated with the error, when + /// available. + /// + /// This is primarily useful for surfacing browser-provided diagnostics in + /// higher-level logs or telemetry. + /// + /// # Examples + /// + /// ``` + /// # #[cfg(feature = "frontend")] + /// # { + /// use masterror::frontend::BrowserConsoleError; + /// + /// let err = BrowserConsoleError::ConsoleUnavailable { + /// message: "console missing".to_owned() + /// }; + /// assert_eq!(err.context(), Some("console missing")); + /// + /// let err = BrowserConsoleError::ConsoleMethodNotCallable; + /// assert_eq!(err.context(), None); + /// # } + /// ``` + pub fn context(&self) -> Option<&str> { + match self { + Self::Serialization { + message + } + | Self::ConsoleUnavailable { + message + } + | Self::ConsoleErrorUnavailable { + message + } + | Self::ConsoleInvocation { + message + } => Some(message.as_str()), + Self::ConsoleMethodNotCallable | Self::UnsupportedTarget => None + } + } +} + /// Extensions for serializing errors to JavaScript and logging to the browser /// console. #[cfg_attr(docsrs, doc(cfg(feature = "frontend")))] @@ -181,6 +223,25 @@ mod tests { use super::*; use crate::AppCode; + #[test] + fn context_returns_optional_message() { + let serialization = BrowserConsoleError::Serialization { + message: "encode failed".to_owned() + }; + assert_eq!(serialization.context(), Some("encode failed")); + + let invocation = BrowserConsoleError::ConsoleInvocation { + message: "js error".to_owned() + }; + assert_eq!(invocation.context(), Some("js error")); + + assert_eq!( + BrowserConsoleError::ConsoleMethodNotCallable.context(), + None + ); + assert_eq!(BrowserConsoleError::UnsupportedTarget.context(), None); + } + #[cfg(not(target_arch = "wasm32"))] mod native { use super::*;