movable_ref/
error.rs

1//! Error types
2
3/// An error type for when an integer offset cannot be stored
4#[derive(Debug)]
5pub struct IntegerOffsetError(pub(crate) IntegerOffsetErrorImpl);
6
7/// All types of errors, this is internal and so protected
8/// behind a wrapper struct
9#[derive(Debug)]
10pub(crate) enum IntegerOffsetErrorImpl {
11    /// Failed to convert isize to given integer type
12    Conversion(isize),
13    /// Failed to subtract the two usizes (overflowed isize)
14    Sub(usize, usize),
15    /// Got a zero when a non-zero value was expected (for `NonZero*`)
16    InvalidNonZero,
17}
18
19#[cfg(not(feature = "no_std"))]
20impl std::error::Error for IntegerOffsetError {}
21
22mod fmt {
23    use super::*;
24    use std::fmt;
25
26    impl fmt::Display for IntegerOffsetError {
27        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28            match self.0 {
29                IntegerOffsetErrorImpl::Conversion(del) => write!(
30                    f,
31                    "Offset could not be stored (offset of {} is too large)",
32                    del
33                ),
34                IntegerOffsetErrorImpl::Sub(a, b) => {
35                    write!(f, "Difference is beween {} and {} overflows `isize`", a, b)
36                }
37
38                IntegerOffsetErrorImpl::InvalidNonZero => {
39                    write!(
40                        f,
41                        "Difference was zero when a `NonZero*` type was specified"
42                    )
43                }
44            }
45        }
46    }
47}