Skip to content

Commit 7aeec11

Browse files
kixelatedclaude
andauthored
Add #[non_exhaustive] to error enums and restore FrameTooLarge (#172)
Mark CapsuleError, ConnectError, and SettingsError as #[non_exhaustive] so adding/removing variants is no longer a semver-breaking change. Restore the FrameTooLarge variants that were removed in the patch release. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 97ff3c8 commit 7aeec11

3 files changed

Lines changed: 17 additions & 8 deletions

File tree

web-transport-proto/src/capsule.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ fn is_grease(val: u64) -> Option<u64> {
204204
}
205205

206206
#[derive(Debug, Clone, thiserror::Error)]
207+
#[non_exhaustive]
207208
pub enum CapsuleError {
208209
#[error("unexpected end of buffer")]
209210
UnexpectedEnd,

web-transport-proto/src/connect.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use thiserror::Error;
1010

1111
// Errors that can occur during the connect request.
1212
#[derive(Error, Debug, Clone)]
13+
#[non_exhaustive]
1314
pub enum ConnectError {
1415
#[error("unexpected end of input")]
1516
UnexpectedEnd,
@@ -53,6 +54,9 @@ pub enum ConnectError {
5354
#[error("structured field error: {0}")]
5455
StructuredFieldError(Arc<sfv::Error>),
5556

57+
#[error("frame too large")]
58+
FrameTooLarge,
59+
5660
#[error("non-200 status: {0:?}")]
5761
ErrorStatus(http::StatusCode),
5862

@@ -385,7 +389,7 @@ async fn read_headers_frame<S: AsyncRead + Unpin>(stream: &mut S) -> Result<Vec<
385389

386390
let size = size.into_inner();
387391
if size > MAX_FRAME_SIZE {
388-
return Err(std::io::Error::other("frame too large"))?;
392+
return Err(ConnectError::FrameTooLarge);
389393
}
390394

391395
let mut payload = stream.take(size);
@@ -551,8 +555,8 @@ mod tests {
551555
let mut cursor = Cursor::new(wire);
552556
let err = ConnectRequest::read(&mut cursor).await.unwrap_err();
553557
assert!(
554-
matches!(err, ConnectError::Io(_)),
555-
"expected Io, got {err:?}"
558+
matches!(err, ConnectError::FrameTooLarge),
559+
"expected FrameTooLarge, got {err:?}"
556560
);
557561
}
558562

@@ -621,8 +625,8 @@ mod tests {
621625
let mut cursor = Cursor::new(wire);
622626
let err = ConnectResponse::read(&mut cursor).await.unwrap_err();
623627
assert!(
624-
matches!(err, ConnectError::Io(_)),
625-
"expected Io, got {err:?}"
628+
matches!(err, ConnectError::FrameTooLarge),
629+
"expected FrameTooLarge, got {err:?}"
626630
);
627631
}
628632

web-transport-proto/src/settings.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ settings! {
8686
}
8787

8888
#[derive(Error, Debug, Clone)]
89+
#[non_exhaustive]
8990
pub enum SettingsError {
9091
#[error("unexpected end of input")]
9192
UnexpectedEnd,
@@ -99,6 +100,9 @@ pub enum SettingsError {
99100
#[error("invalid size")]
100101
InvalidSize,
101102

103+
#[error("frame too large")]
104+
FrameTooLarge,
105+
102106
#[error("io error: {0}")]
103107
Io(Arc<std::io::Error>),
104108
}
@@ -162,7 +166,7 @@ impl Settings {
162166

163167
let size = size.into_inner();
164168
if size > MAX_FRAME_SIZE {
165-
return Err(std::io::Error::other("frame too large"))?;
169+
return Err(SettingsError::FrameTooLarge);
166170
}
167171

168172
let mut payload = stream.take(size);
@@ -377,8 +381,8 @@ mod tests {
377381
let mut cursor = Cursor::new(wire);
378382
let err = Settings::read(&mut cursor).await.unwrap_err();
379383
assert!(
380-
matches!(err, SettingsError::Io(_)),
381-
"expected Io, got {err:?}"
384+
matches!(err, SettingsError::FrameTooLarge),
385+
"expected FrameTooLarge, got {err:?}"
382386
);
383387
}
384388

0 commit comments

Comments
 (0)