Struct interchange::Channel

source ·
pub struct Channel<Rq, Rp> { /* private fields */ }
Expand description

Channel used for Request/Response mechanism.

#[derive(Clone, Debug, PartialEq)]
pub enum Request {
    This(u8, u32),
    That(i64),
}

#[derive(Clone, Debug, PartialEq)]
pub enum Response {
    Here(u8, u8, u8),
    There(i16),
}

static CHANNEL: Channel<Request,Response> = Channel::new();

let (mut rq, mut rp) = CHANNEL.split().unwrap();

assert!(rq.state() == State::Idle);

// happy path: no cancelation
let request = Request::This(1, 2);
assert!(rq.request(request).is_ok());

let request = rp.take_request().unwrap();
println!("rp got request: {:?}", request);

let response = Response::There(-1);
assert!(!rp.is_canceled());
assert!(rp.respond(response).is_ok());

let response = rq.take_response().unwrap();
println!("rq got response: {:?}", response);

// early cancelation path
assert!(rq.request(request).is_ok());

let request =  rq.cancel().unwrap().unwrap();
println!("responder could cancel: {:?}", request);

assert!(rp.take_request().is_none());
assert!(State::Idle == rq.state());

// late cancelation
assert!(rq.request(request).is_ok());
let request = rp.take_request().unwrap();

println!("responder could cancel: {:?}", &rq.cancel().unwrap().is_none());
assert!(rp.is_canceled());
assert!(rp.respond(response).is_err());
assert!(rp.acknowledge_cancel().is_ok());
assert!(State::Idle == rq.state());

// building into request buffer
impl Default for Request {
  fn default() -> Self {
    Request::That(0)
  }
}

rq.with_request_mut(|r| *r = Request::This(1,2)).unwrap() ;
assert!(rq.send_request().is_ok());
let request = rp.take_request().unwrap();
assert_eq!(request, Request::This(1, 2));
println!("rp got request: {:?}", request);

// building into response buffer
impl Default for Response {
  fn default() -> Self {
    Response::There(1)
  }
}

rp.with_response_mut(|r| *r = Response::Here(3,2,1)).unwrap();
assert!(rp.send_response().is_ok());
let response = rq.take_response().unwrap();
assert_eq!(response, Response::Here(3,2,1));

Implementations§

source§

impl<Rq, Rp> Channel<Rq, Rp>

source

pub const fn new() -> Self

source

pub fn requester(&self) -> Option<Requester<'_, Rq, Rp>>

Obtain the requester end of the channel if it hasn’t been taken yet.

Can be called again if the previously obtained Requester has been dropped

source

pub fn responder(&self) -> Option<Responder<'_, Rq, Rp>>

Obtain the responder end of the channel if it hasn’t been taken yet.

Can be called again if the previously obtained Responder has been dropped

source

pub fn split(&self) -> Option<(Requester<'_, Rq, Rp>, Responder<'_, Rq, Rp>)>

Obtain both the requester and responder ends of the channel.

Can be called again if the previously obtained Responder and Requester have been dropped

Trait Implementations§

source§

impl<Rq, Rp> Default for Channel<Rq, Rp>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<Rq, Rp> Sync for Channel<Rq, Rp>where Rq: Send + Sync, Rp: Send + Sync,

Auto Trait Implementations§

§

impl<Rq, Rp> !RefUnwindSafe for Channel<Rq, Rp>

§

impl<Rq, Rp> Send for Channel<Rq, Rp>where Rp: Send, Rq: Send,

§

impl<Rq, Rp> Unpin for Channel<Rq, Rp>where Rp: Unpin, Rq: Unpin,

§

impl<Rq, Rp> UnwindSafe for Channel<Rq, Rp>where Rp: UnwindSafe, Rq: UnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

const: unstable · source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

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

const: unstable · 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, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.