Struct ump_ng::Client

source ·
pub struct Client<P, S, R, E>(/* private fields */);
Expand description

Representation of a clonable client object.

Each instantiation of a Client object is itself an isolated client with regards to the server context. By cloning a client a new independent client is created. (“Independent” here meaning that it is still tied to the same server object, but the new client can be passed to a separate thread and can independently make calls to the server).

Implementations§

source§

impl<P, S, R, E> Client<P, S, R, E>
where P: 'static + Send, R: 'static + Send, E: 'static + Send,

source

pub fn post(&self, msg: P) -> Result<(), Error<E>>

Transmit a uni-directional message to the server end-point.

source

pub fn req(&self, out: S) -> Result<R, Error<E>>

Send a message to the server, wait for a reply, and return the reply.

A complete round-trip (the message is delivered to the server, and the server sends a reply) must complete before this function returns success.

This method is currently reentrant: It is safe to use share a single Client among multiple threads. This may change in the future; it’s recommended to not rely on this. The recommended way to send messages to a server from multiple threads is to clone the Client and assign one separate Client to each thread.

Return

On success the function will return Ok(msg).

If the linked server object has been released, or is released while the message is in the server’s queue, Err(Error:ServerDisappeared) will be returned.

If the server never replied to the message and the reply context was dropped Err(Error::NoReply) will be returned.

If an application specific error occurs it will be returned as a Err(Error::App(E)), where E is the error type used when creating the channel.

source

pub fn req_async(&self, out: S) -> Result<WaitReply<R, E>, Error<E>>

Issue a request, immediately returning a context that is used to wait for the server’s reply.

The _async naming is slightly misleading – this method isn’t an async in a language/Future sense, but rather it doesn’t block and wait for a reply before returning. Instead it returns a WaitReply object that is used to wait for the reply.

This can be useful (in place of req() or areq() methods) if the caller knows that the server will take some time to respond to the request and the caller has other tasks it can perform in the meantime.

use std::thread;

use ump_ng::{channel, MsgType};

let (server, client) = channel::<String, String, String, ()>();

let server_thread = thread::spawn(move || {
  // Wait for data to arrive from a client
  println!("Server waiting for message ..");
  let MsgType::Request(data, mut rctx) = server.wait().unwrap() else {
    panic!("Unexpected message type");
  };

  println!("Server received: '{}'", data);

  // Long processing of data from client

  // Reply to client
  let reply = format!("Hello, {}!", data);
  println!("Server replying '{}'", reply);
  rctx.reply(reply);

  println!("Server done");
});

let msg = String::from("Client");
println!("Client sending '{}'", msg);
let wrctx = client.req_async(msg).unwrap();

// .. perform some operation while server is processing the request ..

let reply = wrctx.wait().unwrap();
println!("Client received reply '{}'", reply);
println!("Client done");

server_thread.join().unwrap();
source

pub async fn areq(&self, out: S) -> Result<R, Error<E>>

Same as Client::req() but for use in async contexts.

source

pub fn weak(&self) -> WeakClient<P, S, R, E>

Create a weak Client reference.

Trait Implementations§

source§

impl<P, S, R, E> Clone for Client<P, S, R, E>

source§

fn clone(&self) -> Self

Clone a client.

When a client is cloned the new object will be linked to the same server, but in all other respects the clone is a completely independent client.

This means that a cloned client can be passed to a new thread/task and make new independent calls to the server without any risk of collision between clone and the original client object.

1.0.0 · source§

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

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<P, S, R, E> !RefUnwindSafe for Client<P, S, R, E>

§

impl<P, S, R, E> Send for Client<P, S, R, E>
where E: Send, P: Send, R: Send, S: Send,

§

impl<P, S, R, E> Sync for Client<P, S, R, E>
where E: Send, P: Send, R: Send, S: Send,

§

impl<P, S, R, E> Unpin for Client<P, S, R, E>

§

impl<P, S, R, E> !UnwindSafe for Client<P, S, R, E>

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, 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,

§

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>,

§

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>,

§

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.