use super::session::SessionInner;
use super::{Error, Message, Promise};
use std::sync::Weak;
use std::time::Instant;
#[derive(Clone)]
pub struct Requester {
session: Weak<SessionInner>,
}
impl Requester {
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>) -> Self {
Self { session }
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use crate::protocol::{
DeviceInfoRequest, DeviceInfoResponse, Error, Message, Promise, Requester, Session,
};
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 + Send + Sync + 'static>() {}
shared::<Requester>();
}
}