use super::envelope::{Http3Frame, Http3FrameBuildError, Http3FrameBuilder};
use super::payload::{Http3FramePayloadParseError, validate_type};
use crate::http3::codepoints::Http3FrameType;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Http3Data<'a> {
frame: Http3Frame<'a>,
}
impl<'a> Http3Data<'a> {
pub(in crate::http3) const fn from_validated(frame: Http3Frame<'a>) -> Self {
Self { frame }
}
pub fn parse(
bytes: &'a [u8],
maximum_payload: usize,
) -> Result<Self, Http3FramePayloadParseError> {
Self::from_frame(
Http3Frame::parse(bytes, maximum_payload)
.map_err(Http3FramePayloadParseError::Frame)?,
)
}
pub fn from_frame(frame: Http3Frame<'a>) -> Result<Self, Http3FramePayloadParseError> {
validate_type(frame, Http3FrameType::DATA)?;
Ok(Self { frame })
}
pub const fn frame(&self) -> Http3Frame<'a> {
self.frame
}
pub const fn as_bytes(&self) -> &'a [u8] {
self.frame.as_bytes()
}
pub fn data(&self) -> &'a [u8] {
self.frame.payload()
}
}
pub struct Http3DataBuilder<'output, 'payload> {
destination: &'output mut [u8],
data: &'payload [u8],
}
impl<'output, 'payload> Http3DataBuilder<'output, 'payload> {
pub fn new(destination: &'output mut [u8], data: &'payload [u8]) -> Self {
Self { destination, data }
}
pub fn build(self) -> Result<Http3Data<'output>, Http3FrameBuildError> {
let frame =
Http3FrameBuilder::new(self.destination, Http3FrameType::DATA, self.data).build()?;
Ok(Http3Data::from_validated(frame))
}
}