Struct ClientRequest

Source
pub struct ClientRequest<'req, 'sent> {
    stream: &'req mut TcpStream,
    actor_name: &'req str,
    sent: &'sent mut bool,
}
Expand description

Wrapper around a client stream that guarantees request/reply invariants.

Client messages, which are always requests, are dispatched to Actor instances one at a time via crate::Actor::handle_message. Each request must be paired with exactly one reply from the same actor the request was sent to, where a reply is a message with no type (if a message from the server has a type, it’s a notification, not a reply).

Failing to reply to a request will almost always permanently break that actor, because either the client gets stuck waiting for a reply, or the client receives the reply for a subsequent request as if it was the reply for the current request. If an actor fails to reply to a request, we want the dispatcher (crate::ActorRegistry::handle_message) to send an error of type unrecognizedPacketType, to keep the conversation for that actor in sync.

Since replies come in all shapes and sizes, we want to allow Actor types to send replies without having to return them to the dispatcher. This wrapper type allows the dispatcher to check if a valid reply was sent, and guarantees that if the actor tries to send a reply, it’s actually a valid reply (see Self::is_valid_reply).

It does not currently guarantee anything about messages sent via the TcpStream released via Self::try_clone_stream or the return value of Self::reply.

Fields§

§stream: &'req mut TcpStream

Client stream.

§actor_name: &'req str

Expected actor name.

§sent: &'sent mut bool

Sent flag, allowing ActorRegistry to check for unhandled requests.

Implementations§

Source§

impl ClientRequest<'_, '_>

Source

pub fn handle<'req>( client: &'req mut TcpStream, actor_name: &'req str, handler: impl FnOnce(ClientRequest<'req, '_>) -> Result<(), ActorError>, ) -> Result<(), ActorError>

Run the given handler, with a new request that wraps the given client stream and expected actor name.

Returns ActorError::UnrecognizedPacketType if the actor did not send a reply.

Source§

impl<'req> ClientRequest<'req, '_>

Source

pub fn reply<T: Serialize>( self, reply: &T, ) -> Result<&'req mut TcpStream, ActorError>

Send the given reply to the request being handled.

If successful, sets the sent flag and returns the underlying stream, allowing other messages to be sent after replying to a request.

Source

pub fn reply_final<T: Serialize>(self, reply: &T) -> Result<(), ActorError>

Like reply, but for cases where the actor no longer needs the stream.

Source

pub fn try_clone_stream(&self) -> Result<TcpStream>

Source

fn is_valid_reply<T: Serialize>(&self, message: &T) -> bool

Return true iff the given message is a reply (has no type or to), and is from the expected actor.

This incurs a runtime conversion to a BTreeMap, so it should only be used in debug assertions.

Trait Implementations§

Source§

impl JsonPacketStream for ClientRequest<'_, '_>

Actors can also send other messages before replying to a request.

Auto Trait Implementations§

§

impl<'req, 'sent> Freeze for ClientRequest<'req, 'sent>

§

impl<'req, 'sent> RefUnwindSafe for ClientRequest<'req, 'sent>

§

impl<'req, 'sent> Send for ClientRequest<'req, 'sent>

§

impl<'req, 'sent> Sync for ClientRequest<'req, 'sent>

§

impl<'req, 'sent> Unpin for ClientRequest<'req, 'sent>

§

impl<'req, 'sent> !UnwindSafe for ClientRequest<'req, 'sent>

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> MaybeBoxed<Box<T>> for T

Source§

fn maybe_boxed(self) -> Box<T>

Convert
Source§

impl<T> MaybeBoxed<T> for T

Source§

fn maybe_boxed(self) -> T

Convert
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T