use super::session::SessionInner;
use super::{Error, Message, Promise};
use darkbio_clock::Clock;
use std::sync::Weak;
use std::time::Instant;
#[derive(Clone, Debug)]
pub struct Requester {
clock: Clock,
session: Weak<SessionInner>,
}
impl Requester {
pub fn clock(&self) -> Clock {
self.clock.clone()
}
pub fn request(
&self,
request: impl Into<Message>,
deadline: Instant,
) -> Result<Promise<Message>, Error> {
self.session
.upgrade()
.ok_or(Error::Closed)?
.request(request.into(), deadline)
}
pub(super) fn new(session: Weak<SessionInner>, clock: &Clock) -> Self {
Self {
session,
clock: clock.clone(),
}
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use crate::protocol::schema::{DeviceInfoRequest, DeviceInfoResponse};
use crate::protocol::{Error, Message, Promise, Requester, Session};
use std::fmt::Debug;
use std::time::Instant;
#[allow(dead_code)]
fn pipeline(session: &Session, deadline: Instant) -> Result<(), Error> {
let requester: Requester = session.requester();
let first: Promise<Message> = requester.request(DeviceInfoRequest {}, deadline)?;
let second = requester.request(DeviceInfoRequest {}, deadline)?;
drop(requester.request(DeviceInfoRequest {}, deadline)?);
let _: DeviceInfoResponse = second.wait()?;
let _ = first.wait::<DeviceInfoResponse>()?;
let _: Message = requester.request(DeviceInfoRequest {}, deadline)?.wait()?;
Ok(())
}
#[test]
fn test_thread_capabilities() {
fn shared<T: Clone + Debug + Send + Sync + 'static>() {}
shared::<Requester>();
}
}