wasm-bus 1.1.0

Invocation bus for web assembly modules
use serde::*;
use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};

use super::*;

#[derive(Debug)]
#[must_use = "you must reply to the caller by invoking 'reply'"]
pub struct Reply<RES, REQ>
where
    REQ: de::DeserializeOwned,
    RES: Serialize,
{
    handle: CallHandle,
    format: SerializationFormat,
    request: REQ,
    _marker2: PhantomData<RES>,
}

impl<RES, REQ> Reply<RES, REQ>
where
    REQ: de::DeserializeOwned,
    RES: Serialize,
{
    pub fn id(&self) -> u32 {
        self.handle.id
    }

    pub fn reply(self, response: RES) {
        super::reply(self.handle, self.format, response)
    }
}

pub trait FireAndForget<REQ>
where
    REQ: de::DeserializeOwned,
{
    fn take(self) -> REQ;
}

impl<REQ> FireAndForget<REQ> for Reply<(), REQ>
where
    REQ: de::DeserializeOwned,
{
    fn take(self) -> REQ {
        super::drop(self.handle);
        self.request
    }
}

impl<RES, REQ> Deref for Reply<RES, REQ>
where
    REQ: de::DeserializeOwned,
    RES: Serialize,
{
    type Target = REQ;

    fn deref(&self) -> &Self::Target {
        &self.request
    }
}

impl<RES, REQ> DerefMut for Reply<RES, REQ>
where
    REQ: de::DeserializeOwned,
    RES: Serialize,
{
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.request
    }
}