async-stream-packed 0.1.2

Asynchronous stream packed.
Documentation
use std::io;

use crate::upgradable::{Inner, UpgradableAsyncStream, Upgrader};

//
//
//
pub trait UpgraderExtRefer<S>: Upgrader<S> {
    fn get_ref(output: &Self::Output) -> &S;
    fn get_mut(output: &mut Self::Output) -> &mut S;
}

impl<S, SU> UpgradableAsyncStream<S, SU>
where
    SU: UpgraderExtRefer<S>,
{
    pub fn get_ref(&self) -> &S {
        match &self.inner {
            Inner::Pending((s, _)) => &s,
            Inner::Upgraded((s, _)) => SU::get_ref(s),
            Inner::None => panic!("never"),
        }
    }

    pub fn get_mut(&mut self) -> &mut S {
        match &mut self.inner {
            Inner::Pending((s, _)) => s,
            Inner::Upgraded((s, _)) => SU::get_mut(s),
            Inner::None => panic!("never"),
        }
    }
}

//
//
//
pub trait UpgraderExtTryIntoS<S>: Upgrader<S> {
    fn try_into_s(output: Self::Output) -> io::Result<S>;
}

impl<S, SU> UpgradableAsyncStream<S, SU>
where
    SU: UpgraderExtTryIntoS<S>,
{
    pub fn try_into_s(self) -> io::Result<S> {
        match self.inner {
            Inner::Pending((s, _)) => Ok(s),
            Inner::Upgraded((s, _)) => SU::try_into_s(s),
            Inner::None => panic!("never"),
        }
    }
}