1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
//! This crate provides `.unwrap_or_log()` and `.expect_or_log()` methods on `Result` and `Option` types that log failed unwraps to a [`slog::Logger`]. This is useful when, for example, you have a [syslog](https://github.com/slog-rs/syslog) drain or a database drain, and you want your unwrap failures to show up there instead of being printed to `stderr`. //! //! Its API aims to mirror Rust's `std` — see all the [supported methods](#methods) below. Failed unwraps are logged at a level of [`Critical`]. //! //! ### Usage //! Add the following to your `Cargo.toml`: //! ```toml //! slog-unwrap = "0.9" //! ``` //! //! Next, bring the [`ResultExt`] and/or [`OptionExt`] traits into scope, and make use of the new logging methods. //! ```should_panic //! use slog_unwrap::ResultExt; //! //! let logger = slog::Logger::root(slog::Discard, slog::o!()); //! let not_great: Result<(), _> = Result::Err("not terrible"); //! //! // Logs the failed unwrap to `logger` and panics //! not_great.unwrap_or_log(&logger); //! ``` //! //! ### Methods //! | `std` method | `slog-unwrap` form | trait | //! |--------------------------------| ----------------------------------------|---------------| //! | [`Result::unwrap()`] | [`Result::unwrap_or_log(&log)`] | [`ResultExt`] | //! | [`Result::expect(msg)`] | [`Result::expect_or_log(&log, msg)`] | [`ResultExt`] | //! | [`Result::unwrap_err()`] | [`Result::unwrap_err_or_log(&log)`] | [`ResultExt`] | //! | [`Result::expect_err(msg)`] | [`Result::expect_err_or_log(&log, msg)`] | [`ResultExt`] | //! | [`Option::unwrap()`] | [`Option::unwrap_or_log(&log)`] | [`OptionExt`] | //! | [`Option::expect(msg)`] | [`Option::expect_or_log(&log, msg)`] | [`OptionExt`] | //! | [`Option::unwrap_none()`]<sup>†</sup> | [`Option::unwrap_none_or_log(&log)`] | [`OptionExt`] | //! | [`Option::expect_none(msg)`]<sup>†</sup> | [`Option::expect_none_or_log(&log, msg)`] | [`OptionExt`] | //! //! *†: unstable in `std`*<br/> //! *Note: enabling the `scope` feature drops the `&log` argument from all methods.* //! //! //! ### Features //! * **`panic-quiet`**: causes failed unwraps to panic with an empty message.<br/> //! This feature is enabled by default — if you'd like the unwrap error message to also show in the panic message, disable default features in your `Cargo.toml` as follows:<br/> //! `slog-unwrap = { version = "0.9", default-features = false }` //! * **`scope`**: adds support for [`slog-scope`](https://github.com/slog-rs/scope), which removes the need to pass a [`slog::Logger`] to the various methods. //! //! //! ### Alternatives //! See [slog-unwraps](https://crates.io/crates/slog_unwraps), another crate with a similar featureset. //! //! [`slog::Logger`]: https://docs.rs/slog/*/slog/struct.Logger.html //! [`ResultExt`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.ResultExt.html //! [`OptionExt`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.OptionExt.html //! [`Critical`]: https://docs.rs/slog/*/slog/enum.Level.html#variant.Critical //! [`Result::unwrap()`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap //! [`Result::expect(msg)`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect //! [`Result::unwrap_err()`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap_err //! [`Result::expect_err(msg)`]: https://doc.rust-lang.org/std/result/enum.Result.html#method.expect_err //! [`Option::unwrap()`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap //! [`Option::expect(msg)`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.expect //! [`Option::unwrap_none()`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap_none //! [`Option::expect_none(msg)`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.expect_none //! [`Result::unwrap_or_log(&log)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.ResultExt.html#tymethod.unwrap_or_log //! [`Result::expect_or_log(&log, msg)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.ResultExt.html#tymethod.expect_or_log //! [`Result::unwrap_err_or_log(&log)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.ResultExt.html#tymethod.unwrap_err_or_log //! [`Result::expect_err_or_log(&log, msg)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.ResultExt.html#tymethod.expect_err_or_log //! [`Option::unwrap_or_log(&log)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.OptionExt.html#tymethod.unwrap_or_log //! [`Option::expect_or_log(&log, msg)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.OptionExt.html#tymethod.expect_or_log //! [`Option::unwrap_none_or_log(&log)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.OptionExt.html#tymethod.unwrap_none_or_log //! [`Option::expect_none_or_log(&log, msg)`]: https://docs.rs/slog-unwrap/*/slog_unwrap/trait.OptionExt.html#tymethod.expect_none_or_log #[cfg(not(feature = "scope"))] mod slog; #[cfg(not(feature = "scope"))] pub use crate::slog::*; #[cfg(feature = "scope")] mod scope; #[cfg(feature = "scope")] pub use crate::scope::*;