1use crate::proto::Error;
2
3use std::{error, fmt, io};
4
5#[derive(Debug)]
7pub enum SendError {
8 Connection(Error),
9 User(UserError),
10}
11
12#[derive(Debug)]
14pub enum UserError {
15 InactiveStreamId,
17
18 UnexpectedFrameType,
20
21 PayloadTooBig,
23
24 Rejected,
26
27 ReleaseCapacityTooBig,
29
30 OverflowedStreamId,
34
35 MalformedHeaders,
37
38 MissingUriSchemeAndAuthority,
40
41 PollResetAfterSendResponse,
43
44 SendPingWhilePending,
46
47 SendSettingsWhilePending,
49
50 PeerDisabledServerPush,
52
53 InvalidInformationalStatusCode,
55}
56
57impl error::Error for SendError {}
60
61impl fmt::Display for SendError {
62 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
63 match *self {
64 Self::Connection(ref e) => e.fmt(fmt),
65 Self::User(ref e) => e.fmt(fmt),
66 }
67 }
68}
69
70impl From<io::Error> for SendError {
71 fn from(src: io::Error) -> Self {
72 Self::Connection(src.into())
73 }
74}
75
76impl From<UserError> for SendError {
77 fn from(src: UserError) -> Self {
78 SendError::User(src)
79 }
80}
81
82impl error::Error for UserError {}
85
86impl fmt::Display for UserError {
87 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
88 use self::UserError::*;
89
90 fmt.write_str(match *self {
91 InactiveStreamId => "inactive stream",
92 UnexpectedFrameType => "unexpected frame type",
93 PayloadTooBig => "payload too big",
94 Rejected => "rejected",
95 ReleaseCapacityTooBig => "release capacity too big",
96 OverflowedStreamId => "stream ID overflowed",
97 MalformedHeaders => "malformed headers",
98 MissingUriSchemeAndAuthority => "request URI missing scheme and authority",
99 PollResetAfterSendResponse => "poll_reset after send_response is illegal",
100 SendPingWhilePending => "send_ping before received previous pong",
101 SendSettingsWhilePending => "sending SETTINGS before received previous ACK",
102 PeerDisabledServerPush => "sending PUSH_PROMISE to peer who disabled server push",
103 InvalidInformationalStatusCode => "invalid informational status code",
104 })
105 }
106}