From 93053aa6eb2107ffbf49bad3931a12d29eedd260 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 8 Sep 2023 22:17:29 +0200 Subject: [PATCH] cleanup --- src/main.rs | 2 +- src/proto.rs | 187 ++++++++++++++++++++++++++------------------------- 2 files changed, 95 insertions(+), 94 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9c07119..0cad94e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ // An example program that makes a shitty HTTP/1.1 request. fn main() { tls::ClientConnection::establish(("nilstrieb.dev", 443)).unwrap(); -} \ No newline at end of file +} diff --git a/src/proto.rs b/src/proto.rs index db27bda..09b9a4e 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -9,80 +9,6 @@ use byteorder::{BigEndian as B, ReadBytesExt, WriteBytesExt}; use crate::ErrorKind; // https://datatracker.ietf.org/doc/html/rfc8446#section-4 -macro_rules! proto_enum { - ($(#[$meta:meta])* pub enum $name:ident: $discr_ty:ty { - $( - $KindName:ident $({ - $( - $field_name:ident : $field_ty:ty, - )* - })? = $discriminant:expr, - )* - }) => { - $(#[$meta])* - pub enum $name { - $( - $KindName $({ - $( - $field_name: $field_ty, - )* - })?, - )* - } - - impl Value for $name { - fn write(&self, mut w: W) -> io::Result<()> { - mod discr_consts { - $( - #[allow(non_upper_case_globals)] - pub(super) const $KindName: $discr_ty = $discriminant; - )* - } - - match self { - $( - Self::$KindName $( { - $( $field_name, )* - } )? => { - Value::write(&discr_consts::$KindName, &mut w)?; - $($( - Value::write($field_name, &mut w)?; - )*)? - Ok(()) - } - )* - } - } - - fn read(mut r: R) -> crate::Result { - mod discr_consts { - $( - #[allow(non_upper_case_globals)] - pub(super) const $KindName: $discr_ty = $discriminant; - )* - } - - let kind: $discr_ty = Value::read(&mut r)?; - match kind { - $( - discr_consts::$KindName => { - $(let ( $( $field_name ),* ) = ($( { discard!($field_name); Value::read(&mut r)? } ),*);)? - - Ok(Self::$KindName $({ - $( - $field_name, - )* - })*) - }, - )* - - _ => Err(ErrorKind::InvalidHandshake(Box::new(kind)).into()), - } - } - } - }; -} - proto_enum! { #[derive(Debug, Clone)] pub enum Handshake: u8 { @@ -158,6 +84,81 @@ proto_enum! { } } +macro_rules! proto_enum { + ($(#[$meta:meta])* pub enum $name:ident: $discr_ty:ty { + $( + $KindName:ident $({ + $( + $field_name:ident : $field_ty:ty, + )* + })? = $discriminant:expr, + )* + }) => { + $(#[$meta])* + pub enum $name { + $( + $KindName $({ + $( + $field_name: $field_ty, + )* + })?, + )* + } + + impl Value for $name { + fn write(&self, mut w: &mut W) -> io::Result<()> { + mod discr_consts { + $( + #[allow(non_upper_case_globals)] + pub(super) const $KindName: $discr_ty = $discriminant; + )* + } + + match self { + $( + Self::$KindName $( { + $( $field_name, )* + } )? => { + Value::write(&discr_consts::$KindName, &mut w)?; + $($( + Value::write($field_name, &mut w)?; + )*)? + Ok(()) + } + )* + } + } + + fn read(r: &mut R) -> crate::Result { + mod discr_consts { + $( + #[allow(non_upper_case_globals)] + pub(super) const $KindName: $discr_ty = $discriminant; + )* + } + + let kind: $discr_ty = Value::read(r)?; + match kind { + $( + discr_consts::$KindName => { + $(let ( $( $field_name ),* ) = ($( { discard!($field_name); Value::read(r)? } ),*);)? + + Ok(Self::$KindName $({ + $( + $field_name, + )* + })*) + }, + )* + + _ => Err(ErrorKind::InvalidHandshake(Box::new(kind)).into()), + } + } + } + }; +} +use proto_enum; + #[derive(Clone)] pub struct List(Vec, PhantomData); @@ -174,15 +175,15 @@ impl Debug for List { } impl + TryFrom> Value for List { - fn read(mut r: R) -> crate::Result { - let len: usize = Len::read(&mut r)?.into(); + fn read(r: &mut R) -> crate::Result { + let len: usize = Len::read(r)?.into(); let mut v = Vec::with_capacity(len.max(1000)); for _ in 0..len { - v.push(T::read(&mut r)?); + v.push(T::read(r)?); } Ok(Self(v, PhantomData)) } - fn write(&self, w: W) -> io::Result<()> { + fn write(&self, w: &mut W) -> io::Result<()> { Len::write( &self .0 @@ -203,19 +204,19 @@ pub fn read_handshake(r: &mut R) -> crate::Result { } pub trait Value: Sized + std::fmt::Debug { - fn write(&self, w: W) -> io::Result<()>; - fn read(r: R) -> crate::Result; + fn write(&self, w: &mut W) -> io::Result<()>; + fn read(r: &mut R) -> crate::Result; } impl Value for [V; N] { - fn write(&self, mut w: W) -> io::Result<()> { - self.iter().map(|v| Value::write(v, &mut w)).collect() + fn write(&self, w: &mut W) -> io::Result<()> { + self.iter().try_for_each(|v| Value::write(v, w)) } - fn read(mut r: R) -> crate::Result { + fn read(r: &mut R) -> crate::Result { // ugly :( let mut values = Vec::with_capacity(N); for _ in 0..N { - let value = V::read(&mut r)?; + let value = V::read(r)?; values.push(value); } Ok(values.try_into().unwrap()) @@ -223,32 +224,32 @@ impl Value for [V; N] { } impl Value for u8 { - fn write(&self, mut w: W) -> io::Result<()> { + fn write(&self, w: &mut W) -> io::Result<()> { w.write_u8(*self) } - fn read(mut r: R) -> crate::Result { + fn read(r: &mut R) -> crate::Result { r.read_u8().map_err(Into::into) } } impl Value for u16 { - fn write(&self, mut w: W) -> io::Result<()> { + fn write(&self, w: &mut W) -> io::Result<()> { w.write_u16::(*self) } - fn read(mut r: R) -> crate::Result { + fn read(r: &mut R) -> crate::Result { r.read_u16::().map_err(Into::into) } } impl Value for (T, U) { - fn write(&self, mut w: W) -> io::Result<()> { - T::write(&self.0, &mut w)?; - T::write(&self.0, &mut w)?; + fn write(&self, w: &mut W) -> io::Result<()> { + T::write(&self.0, w)?; + T::write(&self.0, w)?; Ok(()) } - fn read(mut r: R) -> crate::Result { - Ok((T::read(&mut r)?, U::read(&mut r)?)) + fn read(r: &mut R) -> crate::Result { + Ok((T::read(r)?, U::read(r)?)) } }