use crate::error::H3Code;
use crate::headers::HeaderBlockId;
pub use crate::headers::HeadersKind;
use crate::stream::{StreamId, UniKind};
use std::ops::Range;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Event {
Headers {
stream: StreamId,
block: HeaderBlockId,
kind: HeadersKind,
},
Finished(StreamId),
StreamAborted {
stream: StreamId,
code: H3Code,
source: AbortSource,
},
SendStopped {
stream: StreamId,
code: H3Code,
},
PeerSettings,
GoAway {
id: u64,
},
UniStream {
stream: StreamId,
ty: u64,
},
Closed {
code: H3Code,
},
}
impl Event {
pub fn retryable(&self) -> bool {
matches!(
self,
Event::StreamAborted {
source: AbortSource::GoAway,
..
} | Event::StreamAborted {
source: AbortSource::Peer,
code: H3Code::REQUEST_REJECTED,
..
}
)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum AbortSource {
Local,
Peer,
GoAway,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Action {
OpenUni(UniKind),
ResetStream {
stream: StreamId,
code: H3Code,
},
StopSending {
stream: StreamId,
code: H3Code,
},
FinishStream(StreamId),
CloseConnection {
code: H3Code,
reason: &'static str,
},
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Recv {
Consumed(usize),
Body {
consumed: usize,
range: Range<usize>,
},
Frame {
consumed: usize,
ty: u64,
range: Range<usize>,
offset: u64,
frame_len: u64,
},
Raw {
consumed: usize,
range: Range<usize>,
},
Paused,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct DataFrame {
pub(crate) bytes: [u8; 9],
pub(crate) len: u8,
}
impl DataFrame {
pub fn prefix(&self) -> &[u8] {
&self.bytes[..usize::from(self.len).min(self.bytes.len())]
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Datagram {
Deliver(StreamId, Range<usize>),
NotYetOpen(StreamId, Range<usize>),
Drop,
}