1use std::{mem, num::NonZeroU16};
2
3use ntex_bytes::{ByteString, Bytes};
4use ntex_router::Path;
5use serde::de::DeserializeOwned;
6use serde_json::Error as JsonError;
7
8use crate::{error::PayloadError, payload::Payload, v3::codec};
9
10#[derive(Debug)]
11pub struct Publish {
13 pkt: codec::Publish,
14 pkt_size: u32,
15 topic: Path<ByteString>,
16 payload: Payload,
17}
18
19impl Publish {
20 #[doc(hidden)]
23 pub fn new(pkt: codec::Publish, payload: Payload, pkt_size: u32) -> Self {
24 Self { topic: Path::new(pkt.topic.clone()), pkt, pkt_size, payload }
25 }
26
27 #[inline]
28 pub fn dup(&self) -> bool {
30 self.pkt.dup
31 }
32
33 #[inline]
34 pub fn retain(&self) -> bool {
35 self.pkt.retain
36 }
37
38 #[inline]
39 pub fn qos(&self) -> codec::QoS {
41 self.pkt.qos
42 }
43
44 #[inline]
45 pub fn publish_topic(&self) -> &str {
47 &self.pkt.topic
48 }
49
50 #[inline]
51 pub fn id(&self) -> Option<NonZeroU16> {
53 self.pkt.packet_id
54 }
55
56 #[inline]
57 pub fn topic(&self) -> &Path<ByteString> {
58 &self.topic
59 }
60
61 #[inline]
62 pub fn topic_mut(&mut self) -> &mut Path<ByteString> {
63 &mut self.topic
64 }
65
66 #[inline]
67 pub fn packet(&self) -> &codec::Publish {
68 &self.pkt
69 }
70
71 #[inline]
72 pub fn packet_mut(&mut self) -> &mut codec::Publish {
73 &mut self.pkt
74 }
75
76 #[inline]
77 pub fn packet_size(&self) -> u32 {
79 self.pkt_size
80 }
81
82 #[inline]
83 pub fn payload_size(&self) -> usize {
85 self.pkt.payload_size as usize
86 }
87
88 #[inline]
89 pub async fn read(&self) -> Result<Option<Bytes>, PayloadError> {
91 self.payload.read().await
92 }
93
94 #[inline]
95 pub async fn read_all(&self) -> Result<Option<Bytes>, PayloadError> {
97 self.payload.read_all().await
98 }
99
100 pub fn take_payload(&mut self) -> Payload {
102 mem::take(&mut self.payload)
103 }
104
105 pub(super) fn into_inner(self) -> (codec::Publish, Payload, u32) {
106 (self.pkt, self.payload, self.pkt_size)
107 }
108}