use std::ops::{Deref, DerefMut};
use tokio::sync::oneshot;
use crate::enquiry::error::Responderror;
#[derive(Debug)]
pub struct Dialogue<Q, A> {
message: Q,
answer_sender: ResponseChannel<A>
}
#[derive(Debug)]
pub struct ResponseChannel<A>(oneshot::Sender<A>);
impl<Q, A> Dialogue<Q,A> {
pub(super) fn new(message: Q, answer_sender: oneshot::Sender<A>) -> Self {
Self {
message,
answer_sender: ResponseChannel(answer_sender)
}
}
pub fn into_parts(self) -> (Q, ResponseChannel<A>) {
(self.message, self.answer_sender)
}
pub fn answer(self, answer: A) -> Result<(), Responderror<A>> {
self.answer_sender.answer(answer)
}
}
impl<A> ResponseChannel<A> {
pub fn answer(self, answer: A) -> Result<(), Responderror<A>> {
self.0.send(answer)
.map_err(Responderror::new)
}
}
impl<Q, A> Deref for Dialogue<Q, A> {
type Target = Q;
fn deref(&self) -> &Self::Target {
&self.message
}
}
impl<Q, A> DerefMut for Dialogue<Q, A> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.message
}
}