#![allow(dead_code)] use futures::prelude::*; use libp2p_core::muxing::StreamMuxer; use libp2p_core::{ connection::{ ConnectionHandler, ConnectionHandlerEvent, Substream, SubstreamEndpoint, }, muxing::StreamMuxerBox, }; use std::{io, pin::Pin, task::Context, task::Poll}; pub struct TestHandler(); impl ConnectionHandler for TestHandler { type InEvent = (); type OutEvent = (); type Error = io::Error; type Substream = Substream; type OutboundOpenInfo = (); fn inject_substream(&mut self, _: Self::Substream, _: SubstreamEndpoint) {} fn inject_event(&mut self, _: Self::InEvent) {} fn poll(&mut self, _: &mut Context) -> Poll, Self::Error>> { Poll::Ready(Ok(ConnectionHandlerEvent::Custom(()))) } } pub struct CloseMuxer { state: CloseMuxerState, } impl CloseMuxer { pub fn new(m: M) -> CloseMuxer { CloseMuxer { state: CloseMuxerState::Close(m) } } } pub enum CloseMuxerState { Close(M), Done, } impl Future for CloseMuxer where M: StreamMuxer, M::Error: From { type Output = Result; fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll { loop { match std::mem::replace(&mut self.state, CloseMuxerState::Done) { CloseMuxerState::Close(muxer) => { if !muxer.close(cx)?.is_ready() { self.state = CloseMuxerState::Close(muxer); return Poll::Pending } return Poll::Ready(Ok(muxer)) } CloseMuxerState::Done => panic!() } } } } impl Unpin for CloseMuxer { }