http_streams_core/
error.rs1use std::fmt;
4
5type BoxedError = Box<dyn std::error::Error + Send + Sync>;
6
7pub struct StreamError {
9 kind: StreamErrorKind,
10 source: Option<BoxedError>,
11 message: Option<String>,
12}
13
14impl StreamError {
15 pub fn new(kind: StreamErrorKind, source: Option<BoxedError>, message: Option<String>) -> Self {
20 Self {
21 kind,
22 source,
23 message,
24 }
25 }
26
27 pub fn kind(&self) -> StreamErrorKind {
29 self.kind
30 }
31
32 pub fn source(&self) -> Option<&BoxedError> {
34 self.source.as_ref()
35 }
36
37 pub fn message(&self) -> Option<&str> {
39 self.message.as_deref()
40 }
41
42 pub fn into_parts(self) -> (StreamErrorKind, Option<BoxedError>, Option<String>) {
49 (self.kind, self.source, self.message)
50 }
51
52 pub fn codec(source: impl Into<BoxedError>) -> Self {
54 Self::new(StreamErrorKind::CodecError, Some(source.into()), None)
55 }
56
57 pub fn io(source: impl Into<BoxedError>) -> Self {
59 Self::new(StreamErrorKind::InputOutputError, Some(source.into()), None)
60 }
61}
62
63#[derive(Clone, Copy, Debug, PartialEq, Eq)]
68#[non_exhaustive]
69pub enum StreamErrorKind {
70 CodecError,
72
73 InputOutputError,
75
76 MaxLenReachedError,
78
79 MaxBodyLenReachedError,
83}
84
85impl StreamErrorKind {
86 pub fn as_str(&self) -> &'static str {
91 match self {
92 StreamErrorKind::CodecError => "codec",
93 StreamErrorKind::InputOutputError => "io",
94 StreamErrorKind::MaxLenReachedError => "max_len",
95 StreamErrorKind::MaxBodyLenReachedError => "max_body_len",
96 }
97 }
98}
99
100impl fmt::Debug for StreamError {
101 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
102 let mut builder = f.debug_struct("StreamError");
103
104 builder.field("kind", &self.kind);
105
106 if let Some(ref source) = self.source {
107 builder.field("source", source);
108 }
109
110 if let Some(ref message) = self.message {
111 builder.field("message", message);
112 }
113
114 builder.finish()
115 }
116}
117
118impl fmt::Display for StreamError {
119 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
120 match self.kind {
121 StreamErrorKind::CodecError => f.write_str("Frame/codec error")?,
122 StreamErrorKind::InputOutputError => f.write_str("I/O error")?,
123 StreamErrorKind::MaxLenReachedError => f.write_str("Max object length reached")?,
124 StreamErrorKind::MaxBodyLenReachedError => f.write_str("Max body length reached")?,
125 };
126
127 if let Some(message) = &self.message {
128 write!(f, ": {}", message)?;
129 }
130
131 if let Some(e) = &self.source {
132 write!(f, ": {}", e)?;
133 }
134
135 Ok(())
136 }
137}
138
139impl std::error::Error for StreamError {}
140
141impl From<std::io::Error> for StreamError {
142 fn from(err: std::io::Error) -> Self {
143 StreamError::new(StreamErrorKind::InputOutputError, Some(Box::new(err)), None)
144 }
145}