yengine/engine/
req.rs

1use std::ops::{Deref, DerefMut};
2
3use crate::format::Message;
4
5#[cfg(doc)]
6use super::Engine;
7
8/// A request to process a [`Message`], **MUST** be [`Engine::ack`]'ed.
9#[derive(Debug)]
10#[must_use = "messages must be ack'ed, even if not processed with Engine::ack"]
11pub struct Req {
12    inner: Option<Message>,
13}
14
15impl Req {
16    pub(super) fn new(inner: Message) -> Self {
17        Self { inner: Some(inner) }
18    }
19
20    pub(super) fn into_inner(mut self) -> Message {
21        self.inner.take().expect("Req was already into_inner'ed")
22    }
23}
24
25impl Deref for Req {
26    type Target = Message;
27
28    fn deref(&self) -> &Self::Target {
29        self.inner.as_ref().expect("Req was already into_inner'ed")
30    }
31}
32
33impl DerefMut for Req {
34    fn deref_mut(&mut self) -> &mut Self::Target {
35        self.inner.as_mut().expect("Req was already into_inner'ed")
36    }
37}
38
39impl Drop for Req {
40    fn drop(&mut self) {
41        if let Some(inner) = &self.inner {
42            tracing::error!("message `{inner:?}` was not ack'ed, every message must be ack'ed");
43        }
44    }
45}