upgrade::or() requires same Output (#218)

This commit is contained in:
Pierre Krieger 2018-05-24 16:37:12 +02:00 committed by GitHub
parent c7f654a815
commit c1cd10c034
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 36 additions and 22 deletions

View File

@ -222,9 +222,9 @@ extern crate tokio_io;
pub extern crate multiaddr; pub extern crate multiaddr;
mod connection_reuse; mod connection_reuse;
mod either;
mod peer_id; mod peer_id;
pub mod either;
pub mod muxing; pub mod muxing;
pub mod swarm; pub mod swarm;
pub mod transport; pub mod transport;

View File

@ -19,7 +19,6 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
use bytes::Bytes; use bytes::Bytes;
use either::EitherOutput;
use futures::prelude::*; use futures::prelude::*;
use multiaddr::Multiaddr; use multiaddr::Multiaddr;
use std::io::Error as IoError; use std::io::Error as IoError;
@ -39,11 +38,11 @@ pub fn or<A, B>(me: A, other: B) -> OrUpgrade<A, B> {
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct OrUpgrade<A, B>(A, B); pub struct OrUpgrade<A, B>(A, B);
impl<C, A, B> ConnectionUpgrade<C> for OrUpgrade<A, B> impl<C, A, B, O> ConnectionUpgrade<C> for OrUpgrade<A, B>
where where
C: AsyncRead + AsyncWrite, C: AsyncRead + AsyncWrite,
A: ConnectionUpgrade<C>, A: ConnectionUpgrade<C, Output = O>,
B: ConnectionUpgrade<C>, B: ConnectionUpgrade<C, Output = O>,
{ {
type NamesIter = NamesIterChain<A::NamesIter, B::NamesIter>; type NamesIter = NamesIterChain<A::NamesIter, B::NamesIter>;
type UpgradeIdentifier = EitherUpgradeIdentifier<A::UpgradeIdentifier, B::UpgradeIdentifier>; type UpgradeIdentifier = EitherUpgradeIdentifier<A::UpgradeIdentifier, B::UpgradeIdentifier>;
@ -56,7 +55,7 @@ where
} }
} }
type Output = EitherOutput<A::Output, B::Output>; type Output = O;
type Future = EitherConnUpgrFuture<A::Future, B::Future>; type Future = EitherConnUpgrFuture<A::Future, B::Future>;
#[inline] #[inline]
@ -98,12 +97,12 @@ pub enum EitherConnUpgrFuture<A, B> {
Second(B), Second(B),
} }
impl<A, B> Future for EitherConnUpgrFuture<A, B> impl<A, B, O> Future for EitherConnUpgrFuture<A, B>
where where
A: Future<Error = IoError>, A: Future<Error = IoError, Item = O>,
B: Future<Error = IoError>, B: Future<Error = IoError, Item = O>,
{ {
type Item = EitherOutput<A::Item, B::Item>; type Item = O;
type Error = IoError; type Error = IoError;
#[inline] #[inline]
@ -111,11 +110,11 @@ where
match self { match self {
&mut EitherConnUpgrFuture::First(ref mut a) => { &mut EitherConnUpgrFuture::First(ref mut a) => {
let item = try_ready!(a.poll()); let item = try_ready!(a.poll());
Ok(Async::Ready(EitherOutput::First(item))) Ok(Async::Ready(item))
} }
&mut EitherConnUpgrFuture::Second(ref mut b) => { &mut EitherConnUpgrFuture::Second(ref mut b) => {
let item = try_ready!(b.poll()); let item = try_ready!(b.poll());
Ok(Async::Ready(EitherOutput::Second(item))) Ok(Async::Ready(item))
} }
} }
} }

View File

@ -30,7 +30,7 @@ use futures::{Future, Sink, Stream};
use std::env; use std::env;
use libp2p::SimpleProtocol; use libp2p::SimpleProtocol;
use libp2p::core::Transport; use libp2p::core::Transport;
use libp2p::core::upgrade; use libp2p::core::{upgrade, either::EitherOutput};
use libp2p::tcp::TcpConfig; use libp2p::tcp::TcpConfig;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
use tokio_io::AsyncRead; use tokio_io::AsyncRead;
@ -70,7 +70,10 @@ fn main() {
} }
}; };
upgrade::or(plain_text, upgrade::map(secio, |(socket, _)| socket)) upgrade::or(
upgrade::map(plain_text, |pt| EitherOutput::First(pt)),
upgrade::map(secio, |(socket, _)| EitherOutput::Second(socket))
)
}) })
// On top of plaintext or secio, we will use the multiplex protocol. // On top of plaintext or secio, we will use the multiplex protocol.

View File

@ -30,7 +30,7 @@ use futures::{Sink, Stream};
use std::env; use std::env;
use libp2p::SimpleProtocol; use libp2p::SimpleProtocol;
use libp2p::core::Transport; use libp2p::core::Transport;
use libp2p::core::upgrade; use libp2p::core::{upgrade, either::EitherOutput};
use libp2p::tcp::TcpConfig; use libp2p::tcp::TcpConfig;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
use tokio_io::AsyncRead; use tokio_io::AsyncRead;
@ -69,7 +69,10 @@ fn main() {
} }
}; };
upgrade::or(plain_text, upgrade::map(secio, |(socket, _)| socket)) upgrade::or(
upgrade::map(plain_text, |pt| EitherOutput::First(pt)),
upgrade::map(secio, |(socket, _)| EitherOutput::Second(socket))
)
}) })
// On top of plaintext or secio, we will use the multiplex protocol. // On top of plaintext or secio, we will use the multiplex protocol.

View File

@ -30,7 +30,7 @@ extern crate tokio_stdin;
use futures::Stream; use futures::Stream;
use futures::future::Future; use futures::future::Future;
use std::{env, mem}; use std::{env, mem};
use libp2p::core::upgrade; use libp2p::core::{either::EitherOutput, upgrade};
use libp2p::core::{Multiaddr, Transport}; use libp2p::core::{Multiaddr, Transport};
use libp2p::peerstore::PeerId; use libp2p::peerstore::PeerId;
use libp2p::tcp::TcpConfig; use libp2p::tcp::TcpConfig;
@ -69,7 +69,10 @@ fn main() {
} }
}; };
upgrade::or(plain_text, upgrade::map(secio, |(socket, _)| socket)) upgrade::or(
upgrade::map(plain_text, |pt| EitherOutput::First(pt)),
upgrade::map(secio, |(socket, _)| EitherOutput::Second(socket))
)
}) })
// On top of plaintext or secio, we will use the multiplex protocol. // On top of plaintext or secio, we will use the multiplex protocol.

View File

@ -34,7 +34,7 @@ use std::env;
use std::sync::Arc; use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
use libp2p::core::Transport; use libp2p::core::Transport;
use libp2p::core::upgrade; use libp2p::core::{upgrade, either::EitherOutput};
use libp2p::tcp::TcpConfig; use libp2p::tcp::TcpConfig;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
@ -73,7 +73,10 @@ fn main() {
} }
}; };
upgrade::or(plain_text, upgrade::map(secio, |(socket, _)| socket)) upgrade::or(
upgrade::map(plain_text, |pt| EitherOutput::First(pt)),
upgrade::map(secio, |(socket, _)| EitherOutput::Second(socket))
)
}) })
// On top of plaintext or secio, we will use the multiplex protocol. // On top of plaintext or secio, we will use the multiplex protocol.

View File

@ -29,7 +29,7 @@ use futures::Future;
use futures::sync::oneshot; use futures::sync::oneshot;
use std::env; use std::env;
use libp2p::core::Transport; use libp2p::core::Transport;
use libp2p::core::upgrade; use libp2p::core::{upgrade, either::EitherOutput};
use libp2p::tcp::TcpConfig; use libp2p::tcp::TcpConfig;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
@ -61,7 +61,10 @@ fn main() {
} }
}; };
upgrade::or(plain_text, upgrade::map(secio, |(socket, _)| socket)) upgrade::or(
upgrade::map(plain_text, |pt| EitherOutput::First(pt)),
upgrade::map(secio, |(socket, _)| EitherOutput::Second(socket))
)
}) })
// On top of plaintext or secio, we will use the multiplex protocol. // On top of plaintext or secio, we will use the multiplex protocol.