20
20
21
21
use crate :: {
22
22
muxing:: { StreamMuxer , StreamMuxerEvent } ,
23
- transport:: { ListenerEvent , Transport , TransportError } ,
23
+ transport:: { ListenerId , Transport , TransportError , TransportEvent } ,
24
24
Multiaddr , ProtocolName ,
25
25
} ;
26
26
use futures:: {
@@ -274,48 +274,6 @@ pub enum EitherOutbound<A: StreamMuxer, B: StreamMuxer> {
274
274
B ( B :: OutboundSubstream ) ,
275
275
}
276
276
277
- /// Implements `Stream` and dispatches all method calls to either `First` or `Second`.
278
- #[ pin_project( project = EitherListenStreamProj ) ]
279
- #[ derive( Debug , Copy , Clone ) ]
280
- #[ must_use = "futures do nothing unless polled" ]
281
- pub enum EitherListenStream < A , B > {
282
- First ( #[ pin] A ) ,
283
- Second ( #[ pin] B ) ,
284
- }
285
-
286
- impl < AStream , BStream , AInner , BInner , AError , BError > Stream
287
- for EitherListenStream < AStream , BStream >
288
- where
289
- AStream : TryStream < Ok = ListenerEvent < AInner , AError > , Error = AError > ,
290
- BStream : TryStream < Ok = ListenerEvent < BInner , BError > , Error = BError > ,
291
- {
292
- type Item = Result <
293
- ListenerEvent < EitherFuture < AInner , BInner > , EitherError < AError , BError > > ,
294
- EitherError < AError , BError > ,
295
- > ;
296
-
297
- fn poll_next ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
298
- match self . project ( ) {
299
- EitherListenStreamProj :: First ( a) => match TryStream :: try_poll_next ( a, cx) {
300
- Poll :: Pending => Poll :: Pending ,
301
- Poll :: Ready ( None ) => Poll :: Ready ( None ) ,
302
- Poll :: Ready ( Some ( Ok ( le) ) ) => Poll :: Ready ( Some ( Ok ( le
303
- . map ( EitherFuture :: First )
304
- . map_err ( EitherError :: A ) ) ) ) ,
305
- Poll :: Ready ( Some ( Err ( err) ) ) => Poll :: Ready ( Some ( Err ( EitherError :: A ( err) ) ) ) ,
306
- } ,
307
- EitherListenStreamProj :: Second ( a) => match TryStream :: try_poll_next ( a, cx) {
308
- Poll :: Pending => Poll :: Pending ,
309
- Poll :: Ready ( None ) => Poll :: Ready ( None ) ,
310
- Poll :: Ready ( Some ( Ok ( le) ) ) => Poll :: Ready ( Some ( Ok ( le
311
- . map ( EitherFuture :: Second )
312
- . map_err ( EitherError :: B ) ) ) ) ,
313
- Poll :: Ready ( Some ( Err ( err) ) ) => Poll :: Ready ( Some ( Err ( EitherError :: B ( err) ) ) ) ,
314
- } ,
315
- }
316
- }
317
- }
318
-
319
277
/// Implements `Future` and dispatches all method calls to either `First` or `Second`.
320
278
#[ pin_project( project = EitherFutureProj ) ]
321
279
#[ derive( Debug , Copy , Clone ) ]
@@ -385,11 +343,12 @@ impl<A: ProtocolName, B: ProtocolName> ProtocolName for EitherName<A, B> {
385
343
}
386
344
}
387
345
}
388
-
389
- #[ derive( Debug , Copy , Clone ) ]
346
+ #[ pin_project( project = EitherTransportProj ) ]
347
+ #[ derive( Debug ) ]
348
+ #[ must_use = "transports do nothing unless polled" ]
390
349
pub enum EitherTransport < A , B > {
391
- Left ( A ) ,
392
- Right ( B ) ,
350
+ Left ( # [ pin ] A ) ,
351
+ Right ( # [ pin ] B ) ,
393
352
}
394
353
395
354
impl < A , B > Transport for EitherTransport < A , B >
@@ -399,29 +358,54 @@ where
399
358
{
400
359
type Output = EitherOutput < A :: Output , B :: Output > ;
401
360
type Error = EitherError < A :: Error , B :: Error > ;
402
- type Listener = EitherListenStream < A :: Listener , B :: Listener > ;
403
361
type ListenerUpgrade = EitherFuture < A :: ListenerUpgrade , B :: ListenerUpgrade > ;
404
362
type Dial = EitherFuture < A :: Dial , B :: Dial > ;
405
363
406
- fn listen_on (
407
- & mut self ,
408
- addr : Multiaddr ,
409
- ) -> Result < Self :: Listener , TransportError < Self :: Error > > {
410
- use TransportError :: * ;
411
- match self {
412
- EitherTransport :: Left ( a) => match a. listen_on ( addr) {
413
- Ok ( listener) => Ok ( EitherListenStream :: First ( listener) ) ,
414
- Err ( MultiaddrNotSupported ( addr) ) => Err ( MultiaddrNotSupported ( addr) ) ,
415
- Err ( Other ( err) ) => Err ( Other ( EitherError :: A ( err) ) ) ,
364
+ fn poll (
365
+ self : Pin < & mut Self > ,
366
+ cx : & mut Context < ' _ > ,
367
+ ) -> Poll < TransportEvent < Self :: ListenerUpgrade , Self :: Error > > {
368
+ match self . project ( ) {
369
+ EitherTransportProj :: Left ( a) => match a. poll ( cx) {
370
+ Poll :: Pending => Poll :: Pending ,
371
+ Poll :: Ready ( event) => Poll :: Ready (
372
+ event
373
+ . map_upgrade ( EitherFuture :: First )
374
+ . map_err ( EitherError :: A ) ,
375
+ ) ,
416
376
} ,
417
- EitherTransport :: Right ( b) => match b. listen_on ( addr) {
418
- Ok ( listener) => Ok ( EitherListenStream :: Second ( listener) ) ,
419
- Err ( MultiaddrNotSupported ( addr) ) => Err ( MultiaddrNotSupported ( addr) ) ,
420
- Err ( Other ( err) ) => Err ( Other ( EitherError :: B ( err) ) ) ,
377
+ EitherTransportProj :: Right ( b) => match b. poll ( cx) {
378
+ Poll :: Pending => Poll :: Pending ,
379
+ Poll :: Ready ( event) => Poll :: Ready (
380
+ event
381
+ . map_upgrade ( EitherFuture :: Second )
382
+ . map_err ( EitherError :: B ) ,
383
+ ) ,
421
384
} ,
422
385
}
423
386
}
424
387
388
+ fn remove_listener ( & mut self , id : ListenerId ) -> bool {
389
+ match self {
390
+ EitherTransport :: Left ( t) => t. remove_listener ( id) ,
391
+ EitherTransport :: Right ( t) => t. remove_listener ( id) ,
392
+ }
393
+ }
394
+
395
+ fn listen_on ( & mut self , addr : Multiaddr ) -> Result < ListenerId , TransportError < Self :: Error > > {
396
+ use TransportError :: * ;
397
+ match self {
398
+ EitherTransport :: Left ( a) => a. listen_on ( addr) . map_err ( |e| match e {
399
+ MultiaddrNotSupported ( addr) => MultiaddrNotSupported ( addr) ,
400
+ Other ( err) => Other ( EitherError :: A ( err) ) ,
401
+ } ) ,
402
+ EitherTransport :: Right ( b) => b. listen_on ( addr) . map_err ( |e| match e {
403
+ MultiaddrNotSupported ( addr) => MultiaddrNotSupported ( addr) ,
404
+ Other ( err) => Other ( EitherError :: B ( err) ) ,
405
+ } ) ,
406
+ }
407
+ }
408
+
425
409
fn dial ( & mut self , addr : Multiaddr ) -> Result < Self :: Dial , TransportError < Self :: Error > > {
426
410
use TransportError :: * ;
427
411
match self {
0 commit comments