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