use crossbeam_channel::{SendError, Sender};
use crate::{
pool_item::PoolItem, request_with_response::RequestWithResponse, sender_couplet::SenderCouplet,
thread_request_response::ThreadRequestResponse,
};
use super::ThreadEndpoint;
impl<P> ThreadEndpoint<P>
where
P: PoolItem,
{
pub fn send<T>(
&self,
sender: &Sender<ThreadRequestResponse<P>>,
request: T,
) -> Result<(), SendError<SenderCouplet<P>>>
where
T: RequestWithResponse<P>,
{
self.sender
.send(SenderCouplet::<P>::new(sender.clone(), request))
}
}
#[cfg(test)]
mod tests {
use std::thread::spawn;
use crossbeam_channel::unbounded;
use crate::{
samples::*, sender_couplet::SenderCouplet, thread_endpoint::ThreadEndpoint,
thread_request_response::*,
};
#[test]
fn pass_echo_message_through_echo_message_received_at_other_end_of_channel() {
let echo_request = ThreadEchoRequest::new(0, "hello".to_string());
let join_handle = spawn(|| 1);
let (to_thread_sender, receiver_from_endpoint) = unbounded::<SenderCouplet<Randoms>>();
let (to_endpoint, from_thread) = unbounded::<ThreadRequestResponse<Randoms>>();
let target = ThreadEndpoint {
sender: to_thread_sender,
join_handle,
};
target.send(&to_endpoint, echo_request.clone()).unwrap();
let sender_couplet = receiver_from_endpoint.recv().unwrap();
assert_eq!(sender_couplet.request(), &(echo_request.into()));
let response = ThreadEchoResponse::new(0, "hello".to_string(), 0);
sender_couplet
.return_to()
.send(response.clone().into())
.unwrap();
let response_result: ThreadEchoResponse = from_thread.recv().unwrap().into();
assert_eq!(response_result, response);
target.join_handle.join().unwrap();
}
}