1use crate::{coding, message};
2
3#[derive(thiserror::Error, Debug, Clone)]
5pub enum Error {
6 #[error("webtransport error: {0}")]
7 WebTransport(#[from] web_transport::Error),
8
9 #[error("decode error: {0}")]
10 Decode(#[from] coding::DecodeError),
11
12 #[error("unsupported versions: client={0:?} server={1:?}")]
14 Version(message::Versions, message::Versions),
15
16 #[error("extension required: {0}")]
18 RequiredExtension(u64),
19
20 #[error("unexpected stream: {0:?}")]
22 UnexpectedStream(message::ControlType),
23
24 #[error("varint bounds exceeded")]
26 BoundsExceeded(#[from] coding::BoundsExceeded),
27
28 #[error("duplicate")]
31 Duplicate,
32
33 #[error("cancelled")]
35 Cancel,
36
37 #[error("timeout")]
39 Timeout,
40
41 #[error("old")]
43 Old,
44
45 #[error("app code={0}")]
47 App(u32),
48
49 #[error("not found")]
50 NotFound,
51
52 #[error("wrong frame size")]
53 WrongSize,
54
55 #[error("protocol violation")]
56 ProtocolViolation,
57
58 #[error("unauthorized")]
59 Unauthorized,
60}
61
62impl Error {
63 pub fn to_code(&self) -> u32 {
65 match self {
66 Self::Cancel => 0,
67 Self::RequiredExtension(_) => 1,
68 Self::Old => 2,
69 Self::Timeout => 3,
70 Self::WebTransport(_) => 4,
71 Self::Decode(_) => 5,
72 Self::Unauthorized => 6,
73 Self::Version(..) => 9,
74 Self::UnexpectedStream(_) => 10,
75 Self::BoundsExceeded(_) => 11,
76 Self::Duplicate => 12,
77 Self::NotFound => 13,
78 Self::WrongSize => 14,
79 Self::ProtocolViolation => 15,
80 Self::App(app) => *app + 64,
81 }
82 }
83}
84
85pub type Result<T> = std::result::Result<T, Error>;