use tokio::sync::oneshot::Sender;
pub struct QueueItem<Q, T> {
input: Q,
sender: Sender<T>
}
impl<Q, T> QueueItem<Q, T> {
#[allow(dead_code)]
pub fn new(input: Q, sender: Sender<T>) -> Self {
Self {
input,
sender
}
}
#[allow(dead_code)]
pub fn input(&self) -> &Q {
&self.input
}
#[allow(dead_code)]
pub fn sender(self) -> Sender<T> {
self.sender
}
}
impl<Q, T> AsRef<Sender<T>> for QueueItem<Q, T> {
fn as_ref(&self) -> &Sender<T> {
&self.sender
}
}
#[cfg(test)]
mod tests {
use super::*;
use tokio::sync::oneshot;
#[test]
fn test_new_queue_item() {
let (tx, _rx) = oneshot::channel::<String>();
let input = 42;
let queue_item = QueueItem::new(input, tx);
assert_eq!(*queue_item.input(), 42);
}
#[test]
fn test_input_accessor() {
let (tx, _rx) = oneshot::channel::<String>();
let input = vec![1, 2, 3];
let queue_item = QueueItem::new(input, tx);
let input_ref = queue_item.input();
assert_eq!(input_ref.len(), 3);
assert_eq!(input_ref[0], 1);
assert_eq!(input_ref[1], 2);
assert_eq!(input_ref[2], 3);
}
#[test]
fn test_sender_accessor() {
let (tx, rx) = oneshot::channel::<String>();
let input = "test";
let queue_item = QueueItem::new(input, tx);
let sender = queue_item.sender();
sender.send("result".into()).unwrap();
let result = rx.blocking_recv().unwrap();
assert_eq!(result, "result");
}
#[test]
fn test_as_ref_implementation() {
let (tx, rx) = oneshot::channel::<i32>();
let input = 100;
let queue_item = QueueItem::new(input, tx);
let sender_ref = queue_item.as_ref();
assert!(std::ptr::eq(sender_ref, &queue_item.sender));
let sender = queue_item.sender();
sender.send(42).unwrap();
let result = rx.blocking_recv().unwrap();
assert_eq!(result, 42);
}
#[tokio::test]
async fn test_complete_workflow() {
let (tx, rx) = oneshot::channel::<String>();
let input_data = "process me";
let queue_item = QueueItem::new(input_data, tx);
tokio::spawn(async move {
let input_str = queue_item.input();
let result = format!("{} - processed", input_str);
queue_item.sender().send(result).unwrap();
});
let result = rx.await.unwrap();
assert_eq!(result, "process me - processed");
}
}