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
//! The most common usage of SNAFU — an enumeration of possible errors. //! //! Start by looking at the error type [`Error`], then view the //! *context selectors* [`Leaf`] and [`Intermediate`]. use crate::{Snafu, ResultExt}; /// An enumeration of possible errors. /// /// This will create a number of *context selectors*: /// /// - [`Leaf`] /// - [`Intermediate`] /// /// ## Leaf errors /// /// Context selectors for error variants without a `source`, such /// as `Leaf`, have methods to construct them, such as /// [`Leaf::build`] or [`Leaf::fail`]. The [`ensure`] macro also /// accepts these kinds of context selectors. /// /// ``` /// # use snafu::guide::examples::basic::*; /// use snafu::ensure; /// /// fn always_fails() -> Result<(), Error> { /// Leaf { user_id: 42 }.fail() /// } /// /// fn sometimes_fails(user_id: i32) -> Result<(), Error> { /// ensure!(user_id > 0, Leaf { user_id }); /// Ok(()) /// } /// ``` /// /// ## Intermediate errors /// /// Context selectors for error variants with a `source`, such as /// `Intermediate`, are intended to be used with the /// [`ResultExt::context`] family of methods. /// /// ``` /// # use snafu::guide::examples::basic::*; /// use snafu::ResultExt; /// /// fn load_config_file() -> Result<usize, Error> { /// let config = std::fs::read_to_string("/path/to/my/config/file").context(Intermediate)?; /// Ok(config.len()) /// } /// ``` #[derive(Debug, Snafu)] // This line is only needed to generate documentation; it is not // needed in most cases: #[snafu(crate_root(crate), visibility = "pub")] pub enum Error { Leaf { user_id: i32, }, Intermediate { source: std::io::Error, }, }