use std::sync::Mutex;
use tokio::sync::mpsc::UnboundedSender;
use crate::bindings::{Discriminator, Request, RequestContent};
use super::EventVariant;
pub struct Event {
content: EventVariant,
confirm: Mutex<Option<(u32, UnboundedSender<Request>)>>,
#[cfg(feature = "layout")]
layout_confirm: Mutex<Option<(UnboundedSender<Request>, Discriminator)>>,
}
impl Event {
pub fn new(
content: EventVariant,
sender: UnboundedSender<Request>,
confirm: u32,
#[cfg(feature = "layout")] self_discrim: Discriminator,
#[cfg(feature = "layout")] is_layout: bool,
) -> Self {
Self {
content,
confirm: Mutex::new(Some((confirm, sender.clone()))),
#[cfg(feature = "layout")]
layout_confirm: Mutex::new(if is_layout {
Some((sender, self_discrim))
} else {
None
}),
}
}
pub fn done(&self, pass: bool) {
if let Some((id, sender)) = std::mem::take(&mut *self.confirm.lock().unwrap()) {
sender
.send(Request::new(
Discriminator::default(),
RequestContent::ConfirmRecieve { id, pass },
))
.unwrap();
}
#[cfg(feature = "layout")]
{
let mut layout_confirm = self.layout_confirm.lock().unwrap();
if let Some((sender, discrim)) = std::mem::take(&mut *layout_confirm) {
sender
.send(Request::new(
discrim,
RequestContent::SetEntry {
label: crate::features::layout::LAYOUT_CONFIRM.to_string(),
value: serde_json::Value::Null,
},
))
.unwrap();
}
}
}
pub fn get(&self) -> &EventVariant {
&self.content
}
}
impl Drop for Event {
fn drop(&mut self) {
self.done(true)
}
}