@@ -1244,6 +1244,18 @@ impl Mailbox {
1244
1244
)
1245
1245
}
1246
1246
1247
+ /// Bind this message's actor port to this actor's mailbox. This method is
1248
+ /// normally used:
1249
+ /// 1. when we need to intercept a message sent to a handler, and re-route
1250
+ /// that message to the returned receiver;
1251
+ /// 2. mock this message's handler when it is not implemented for this actor
1252
+ /// type, with the returned receiver.
1253
+ pub ( crate ) fn bind_actor_port < M : RemoteMessage > ( & self ) -> ( PortHandle < M > , PortReceiver < M > ) {
1254
+ let ( handle, receiver) = self . open_port ( ) ;
1255
+ handle. bind_actor_port ( ) ;
1256
+ ( handle, receiver)
1257
+ }
1258
+
1247
1259
/// Open a new port with an accumulator with default reduce options.
1248
1260
/// See [`open_accum_port_opts`] for more details.
1249
1261
pub fn open_accum_port < A > ( & self , accum : A ) -> ( PortHandle < A :: Update > , PortReceiver < A :: State > )
@@ -1389,13 +1401,14 @@ impl Mailbox {
1389
1401
PortRef :: attest ( port_id)
1390
1402
}
1391
1403
1392
- fn bind_to < M : RemoteMessage > ( & self , handle : & PortHandle < M > , port_index : u64 ) {
1404
+ fn bind_to_actor_port < M : RemoteMessage > ( & self , handle : & PortHandle < M > ) {
1393
1405
assert_eq ! (
1394
1406
handle. mailbox. actor_id( ) ,
1395
1407
self . actor_id( ) ,
1396
1408
"port does not belong to mailbox"
1397
1409
) ;
1398
1410
1411
+ let port_index = M :: port ( ) ;
1399
1412
let port_id = self . actor_id ( ) . port_id ( port_index) ;
1400
1413
match self . inner . ports . entry ( port_index) {
1401
1414
Entry :: Vacant ( entry) => {
@@ -1625,10 +1638,13 @@ impl<M: RemoteMessage> PortHandle<M> {
1625
1638
)
1626
1639
}
1627
1640
1628
- /// Bind to a specific port index. This is used by [`actor::Binder`] implementations to
1629
- /// bind actor refs. This is not intended for general use.
1630
- pub fn bind_to ( & self , port_index : u64 ) {
1631
- self . mailbox . bind_to ( self , port_index) ;
1641
+ /// Bind to this message's actor port. This method will panic if the handle
1642
+ /// is already bound.
1643
+ ///
1644
+ /// This is used by [`actor::Binder`] implementations to bind actor refs.
1645
+ /// This is not intended for general use.
1646
+ pub ( crate ) fn bind_actor_port ( & self ) {
1647
+ self . mailbox . bind_to_actor_port ( self ) ;
1632
1648
}
1633
1649
}
1634
1650
@@ -3648,8 +3664,7 @@ mod tests {
3648
3664
actor_id. clone ( ) ,
3649
3665
BoxedMailboxSender :: new ( AsyncLoopForwarder ) ,
3650
3666
) ;
3651
- let ( ret_port, mut ret_rx) = mailbox. open_port :: < Undeliverable < MessageEnvelope > > ( ) ;
3652
- ret_port. bind_to ( Undeliverable :: < MessageEnvelope > :: port ( ) ) ;
3667
+ let ( ret_port, mut ret_rx) = mailbox. bind_actor_port :: < Undeliverable < MessageEnvelope > > ( ) ;
3653
3668
3654
3669
// Create a destination not owned by this mailbox to force
3655
3670
// forwarding.
@@ -3696,9 +3711,8 @@ mod tests {
3696
3711
actor_id. clone ( ) ,
3697
3712
BoxedMailboxSender :: new ( PanickingMailboxSender ) ,
3698
3713
) ;
3699
- let ( undeliverable_tx, mut undeliverable_rx) =
3700
- mailbox. open_port :: < Undeliverable < MessageEnvelope > > ( ) ;
3701
- undeliverable_tx. bind_to ( Undeliverable :: < MessageEnvelope > :: port ( ) ) ;
3714
+ let ( _undeliverable_tx, mut undeliverable_rx) =
3715
+ mailbox. bind_actor_port :: < Undeliverable < MessageEnvelope > > ( ) ;
3702
3716
3703
3717
// Open a local user u64 port.
3704
3718
let ( user_port, mut user_rx) = mailbox. open_port :: < u64 > ( ) ;
0 commit comments