wtx 0.50.0

A collection of different transport implementations and related tools focused primarily on web technologies.
Documentation
// https://datatracker.ietf.org/doc/html/rfc9846#section-5.1

use crate::{
  codec::Encode,
  misc::counter_writer::{CounterWriterBytesTy, u16_write},
  tls::{
    de::De,
    protocol::{protocol_version::ProtocolVersion, record_content_type::RecordContentType},
    tls_encode_wrapper::TlsEncodeWrapper,
  },
};

#[derive(Debug)]
pub(crate) struct Record<T> {
  ty: RecordContentType,
  legacy_record_version: ProtocolVersion,
  opaque: T,
}

impl<T> Record<T> {
  pub(crate) fn new(
    ty: RecordContentType,
    legacy_record_version: ProtocolVersion,
    opaque: T,
  ) -> Self {
    Self { ty, legacy_record_version, opaque }
  }
}

impl<T> Encode<De> for Record<T>
where
  T: Encode<De>,
{
  #[inline]
  fn encode(&self, ew: &mut TlsEncodeWrapper<'_>) -> crate::Result<()> {
    let _ = ew.buffer().extend_from_copyable_slices([
      &[u8::from(self.ty)][..],
      &u16::from(self.legacy_record_version).to_be_bytes(),
    ])?;
    u16_write(CounterWriterBytesTy::IgnoresLen, None, ew, |local_ew| self.opaque.encode(local_ew))
  }
}