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
81pub(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