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* [`LeafSnafu`] and [`IntermediateSnafu`].
use crate::{Snafu, ResultExt};
/// An enumeration of possible errors.
///
/// This will create a number of *context selectors*:
///
/// - [`LeafSnafu`]
/// - [`IntermediateSnafu`]
///
/// ## Leaf errors
///
/// Context selectors for error variants without a `source`, such
/// as [`LeafSnafu`], have methods to construct them, such as
/// [`LeafSnafu::build`] or [`LeafSnafu::fail`]. The [`ensure`] macro also
/// accepts these kinds of context selectors.
///
/// ```
/// # use snafu::guide::examples::basic::*;
/// use snafu::prelude::*;
///
/// fn always_fails() -> Result<(), Error> {
/// LeafSnafu { user_id: 42 }.fail()
/// }
///
/// fn sometimes_fails(user_id: i32) -> Result<(), Error> {
/// ensure!(user_id > 0, LeafSnafu { user_id });
/// Ok(())
/// }
/// ```
///
/// ## Intermediate errors
///
/// Context selectors for error variants with a `source`, such as
/// [`IntermediateSnafu`], are intended to be used with the
/// [`ResultExt::context`] family of methods.
///
/// ```
/// # use snafu::guide::examples::basic::*;
/// use snafu::prelude::*;
///
/// fn load_config_file() -> Result<usize, Error> {
/// let config = std::fs::read_to_string("/path/to/my/config/file").context(IntermediateSnafu)?;
/// 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,
},
}