diff --git a/src/dual.rs b/src/dual.rs index 9286594..7053426 100644 --- a/src/dual.rs +++ b/src/dual.rs @@ -27,7 +27,24 @@ pub enum DualStream Plain(S), } -//pub type Error = openssl::error::ErrorStack; +// We can use dynamic dispatching to prevent the need to check the enum's discriminant each time. (In theory. It might not be that useful unless we add `Unpin` here too. TODO: Check this later.) +impl<'a, S: AsyncWrite> AsRef for DualStream +where S: 'a +{ + fn as_ref(&self) -> &(dyn AsyncWrite + 'a) + { + self.as_dyn() + } +} + +impl<'a, S: AsyncWrite> AsMut for DualStream +where S: 'a +{ + fn as_mut(&mut self) -> &mut (dyn AsyncWrite + 'a) + { + self.as_dyn_mut() + } +} impl<'a, S: AsyncWrite + Unpin> DualStream where S: 'a @@ -72,6 +89,31 @@ where S: 'a Ok(()) } } + +impl<'a, S: AsyncWrite> DualStream +where S: Unpin + 'a +{ + /// As an immutable dynamic object for `Unpin` streams. + pub fn as_dyn_unpin(&self) -> &(dyn AsyncWrite + Unpin + 'a) + { + match self { + Self::Plain(p) => p, + Self::Encrypted(e) => e, + _ => panic!("Poisoned") + } + } + + /// As a mutable dynamic object for `Unpin` streams + pub fn as_dyn_unpin_mut(&mut self) -> &mut (dyn AsyncWrite + Unpin + 'a) + { + match self { + Self::Plain(p) => p, + Self::Encrypted(e) => e, + _ => panic!("Poisoned") + } + } +} + impl<'a, S: AsyncWrite> DualStream where S: 'a { @@ -198,18 +240,18 @@ where S: 'a } } - /// As an immutable dynamic object - pub fn as_dyn(&self) -> &(dyn AsyncWrite + 'a) + /// Consume into the inner (plain) stream + #[inline] pub fn into_inner(self) -> S { match self { Self::Plain(p) => p, - Self::Encrypted(e) => e, + Self::Encrypted(e) => e.into_inner(), _ => panic!("Poisoned") } } - - /// As a mutable dynamic object - pub fn as_dyn_mut(&mut self) -> &mut (dyn AsyncWrite + 'a) + + /// As an immutable dynamic object + pub fn as_dyn(&self) -> &(dyn AsyncWrite + 'a) { match self { Self::Plain(p) => p, @@ -218,12 +260,12 @@ where S: 'a } } - /// Consume into the inner (plain) stream - #[inline] pub fn into_inner(self) -> S + /// As a mutable dynamic object + pub fn as_dyn_mut(&mut self) -> &mut (dyn AsyncWrite + 'a) { match self { Self::Plain(p) => p, - Self::Encrypted(e) => e.into_inner(), + Self::Encrypted(e) => e, _ => panic!("Poisoned") } }