Skip to main content

EstablishedActor

Struct EstablishedActor 

Source
pub struct EstablishedActor<B>{ /* private fields */ }
Expand description

Inert capability for one exact installed concrete behavior.

An established recipient proves the public protocol endpoint. This value additionally preserves which concrete behavior was installed, allowing lifecycle effects to require static evidence about that behavior’s event algebra. It remains inert: no direct send, shutdown, endpoint accessor, or other ambient effect is exposed.

A protocol recipient cannot issue installed-actor authority:

ⓘ
#[derive(Clone, Copy, Eq, PartialEq)]
struct RuntimeAddr;
impl behavior::Address for RuntimeAddr { type Nonce = u8; }
#[derive(Clone)]
struct Endpoint;
struct Installed<B: behavior::Behavior>(Endpoint, std::sync::mpsc::Sender<B::Event>);
impl<B: behavior::Behavior> Clone for Installed<B> {
    fn clone(&self) -> Self { Self(self.0.clone(), self.1.clone()) }
}
impl behavior::EndpointAddress for RuntimeAddr {
    type Established<P> = Endpoint where P: behavior::Protocol<Addr = Self>;
    type Installed<B> = Installed<B>
        where B: behavior::Behavior<Protocol: behavior::Protocol<Addr = Self>>;
    fn recipient<B>(installed: &Self::Installed<B>) -> Endpoint
    where B: behavior::Behavior<Protocol: behavior::Protocol<Addr = Self>> {
        installed.0.clone()
    }
}
struct Worker;
impl behavior::Protocol for Worker { type Addr = RuntimeAddr; type Msg = (); }
impl behavior::Behavior for Worker {
    type Protocol = Self;
    type Event = behavior::User<RuntimeAddr, ()>;
    type Sends = behavior::NoSends;
    type Ph = behavior::Never;
    type Error = behavior::Never;
    type Birth = behavior::NoBirths;
    fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event)
        -> behavior::BehaviorActed<Self> { Ok(behavior::Actions::cont()) }
}
let recipient = behavior::EstablishedRecipient::<Worker>::issued(Endpoint);
let _: behavior::EstablishedActor<Worker> = behavior::EstablishedActor::issued(recipient);

Two behaviors sharing one protocol retain distinct installed authority:

ⓘ
#[derive(Clone, Copy, Eq, PartialEq)]
struct RuntimeAddr;
impl behavior::Address for RuntimeAddr { type Nonce = u8; }
#[derive(Clone)]
struct Endpoint;
struct Installed<B: behavior::Behavior>(Endpoint, std::sync::mpsc::Sender<B::Event>);
impl<B: behavior::Behavior> Clone for Installed<B> {
    fn clone(&self) -> Self { Self(self.0.clone(), self.1.clone()) }
}
impl behavior::EndpointAddress for RuntimeAddr {
    type Established<P> = Endpoint where P: behavior::Protocol<Addr = Self>;
    type Installed<B> = Installed<B>
        where B: behavior::Behavior<Protocol: behavior::Protocol<Addr = Self>>;
    fn recipient<B>(installed: &Self::Installed<B>) -> Endpoint
    where B: behavior::Behavior<Protocol: behavior::Protocol<Addr = Self>> {
        installed.0.clone()
    }
}
struct Shared;
impl behavior::Protocol for Shared { type Addr = RuntimeAddr; type Msg = (); }
struct First;
struct Second;
impl behavior::Behavior for First {
    type Protocol = Shared;
    type Event = behavior::User<RuntimeAddr, ()>;
    type Sends = behavior::NoSends;
    type Ph = behavior::Never;
    type Error = behavior::Never;
    type Birth = behavior::NoBirths;
    fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event)
        -> behavior::BehaviorActed<Self> { Ok(behavior::Actions::cont()) }
}
impl behavior::Behavior for Second {
    type Protocol = Shared;
    type Event = behavior::EventLayer<u8, behavior::User<RuntimeAddr, ()>>;
    type Sends = behavior::NoSends;
    type Ph = behavior::Never;
    type Error = behavior::Never;
    type Birth = behavior::NoBirths;
    fn transition(&mut self, _: behavior::ActiveTurn, _: Self::Event)
        -> behavior::BehaviorActed<Self> { Ok(behavior::Actions::cont()) }
}
let (control, _inbox) = std::sync::mpsc::channel::<<First as behavior::Behavior>::Event>();
let first = behavior::EstablishedActor::<First>::issued(Installed(Endpoint, control));
let _: behavior::EstablishedActor<Second> = first;

Implementations§

Source§

impl<B> EstablishedActor<B>

Source

pub const fn issued( installed: <<B::Protocol as Protocol>::Addr as EndpointAddress>::Installed<B>, ) -> Self

Issue an exact actor capability after successful installation.

This power-user boundary accepts one runtime-owned installed value. Only successful fresh installation and binding commit may issue it. It performs no allocation or validation itself.

Source

pub fn recipient(&self) -> EstablishedRecipient<B::Protocol>

Project the exact public-protocol recipient for this incarnation.

Source

pub fn into_recipient(self) -> EstablishedRecipient<B::Protocol>

Consume the concrete-actor proof and retain its exact protocol recipient.

Source

pub fn interpret_actor<I>(self, interpreter: &mut I) -> I::Output

Transfer the complete installed value with its exact B index.

Trait Implementations§

Source§

impl<B> Clone for EstablishedActor<B>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<B> Debug for EstablishedActor<B>

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<B> PartialEq for EstablishedActor<B>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<B> Eq for EstablishedActor<B>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.