yamux/
error.rs

1// Copyright (c) 2018-2019 Parity Technologies (UK) Ltd.
2//
3// Licensed under the Apache License, Version 2.0 or MIT license, at your option.
4//
5// A copy of the Apache License, Version 2.0 is included in the software as
6// LICENSE-APACHE and a copy of the MIT license is included in the software
7// as LICENSE-MIT. You may also obtain a copy of the Apache License, Version 2.0
8// at https://www.apache.org/licenses/LICENSE-2.0 and a copy of the MIT license
9// at https://opensource.org/licenses/MIT.
10
11use crate::frame::FrameDecodeError;
12
13/// The various error cases a connection may encounter.
14#[non_exhaustive]
15#[derive(Debug)]
16pub enum ConnectionError {
17    /// An underlying I/O error occured.
18    Io(std::io::Error),
19    /// Decoding a Yamux message frame failed.
20    Decode(FrameDecodeError),
21    /// The whole range of stream IDs has been used up.
22    NoMoreStreamIds,
23    /// An operation fails because the connection is closed.
24    Closed,
25    /// Too many streams are open, so no further ones can be opened at this time.
26    TooManyStreams,
27    /// A window update operation was rejected because the supplied credit
28    /// is invalid for the current flow-control window (e.g. overflow).
29    InvalidWindowUpdate,
30}
31
32impl std::fmt::Display for ConnectionError {
33    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
34        match self {
35            ConnectionError::Io(e) => write!(f, "i/o error: {e}"),
36            ConnectionError::Decode(e) => write!(f, "decode error: {e}"),
37            ConnectionError::NoMoreStreamIds => {
38                f.write_str("number of stream ids has been exhausted")
39            }
40            ConnectionError::Closed => f.write_str("connection is closed"),
41            ConnectionError::TooManyStreams => f.write_str("maximum number of streams reached"),
42            ConnectionError::InvalidWindowUpdate => {
43                f.write_str("invalid window update for the current flow control window")
44            }
45        }
46    }
47}
48
49impl std::error::Error for ConnectionError {
50    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
51        match self {
52            ConnectionError::Io(e) => Some(e),
53            ConnectionError::Decode(e) => Some(e),
54            ConnectionError::NoMoreStreamIds
55            | ConnectionError::Closed
56            | ConnectionError::TooManyStreams => None,
57            ConnectionError::InvalidWindowUpdate => None,
58        }
59    }
60}
61
62impl From<std::io::Error> for ConnectionError {
63    fn from(e: std::io::Error) -> Self {
64        ConnectionError::Io(e)
65    }
66}
67
68impl From<FrameDecodeError> for ConnectionError {
69    fn from(e: FrameDecodeError) -> Self {
70        ConnectionError::Decode(e)
71    }
72}
73
74impl From<futures::channel::mpsc::SendError> for ConnectionError {
75    fn from(_: futures::channel::mpsc::SendError) -> Self {
76        ConnectionError::Closed
77    }
78}
79
80impl From<futures::channel::oneshot::Canceled> for ConnectionError {
81    fn from(_: futures::channel::oneshot::Canceled) -> Self {
82        ConnectionError::Closed
83    }
84}