1use std::ops::{Deref, DerefMut};
2
3use crate::format::Message;
4
5#[cfg(doc)]
6use super::Engine;
7
8#[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}