more_itertools/
error.rs

1use std::fmt;
2
3#[derive(Clone)]
4pub struct Error {
5    pub(crate) inner: Box<Inner>,
6}
7
8#[derive(Clone)]
9pub struct Inner {
10    kind: Kind,
11    pub(crate) message: Option<String>
12}
13
14impl Error {
15    pub(crate) fn new(kind: Kind, message: Option<String>) -> Error
16    {
17        Error {
18            inner: Box::new(Inner {
19                kind,
20                message: message,
21            }),
22        }
23    }
24
25    pub fn kind(&self) -> Kind {
26        return self.inner.kind;
27    }
28
29    pub fn message(&self) -> Option<&String> {
30        self.inner.message.as_ref()
31    }
32
33    pub fn message_mut(&mut self) -> Option<&mut String> {
34        self.inner.message.as_mut()
35    }
36}
37
38impl PartialEq for Error {
39    fn eq(&self, other: &Self) -> bool {
40        return self.inner.kind == other.inner.kind && 
41                self.inner.message.eq(&other.inner.message);
42    }
43}
44
45impl fmt::Debug for Error {
46    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
47        let mut builder = f.debug_struct("more-itertools::Error");
48
49        builder.field("kind", &self.inner.kind);
50
51        if let Some(ref message) = self.inner.message {
52            builder.field("message", message);
53        }
54
55        builder.finish()
56    }
57}
58
59#[derive(Debug,Clone,Copy,PartialEq)]
60pub enum Kind {
61    ValueError,
62    TypeError,
63
64    OverflowError,
65
66    ParseIntError,
67
68    IteratorError,
69
70    None
71}
72
73pub(crate) fn value_error(e: String) -> Error {
74    Error::new(Kind::ValueError, Some(e))
75}
76
77pub(crate) fn overflow_error(e: String) -> Error {
78    Error::new(Kind::OverflowError, Some(e))
79}
80
81// pub(crate) fn type_error(e: String) -> Error {
82//     Error::new(Kind::TypeError, Some(e))
83// }
84
85pub(crate) fn any_error(kind: Kind, e: String) -> Error {
86    Error::new(kind, Some(e))
87}
88
89
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94
95    #[test]
96    fn test1() {
97        let err = value_error(String::from("'iterable is not divisible by n.'"));
98        println!("{:?}", err);
99    }
100}
101