rocketmq_common/common/message/
message_body.rs1use bytes::Bytes;
16
17#[derive(Clone, Debug, Default)]
19pub struct MessageBody {
20 raw: Option<Bytes>,
22 compressed: Option<Bytes>,
24}
25
26impl MessageBody {
27 #[inline]
29 pub fn new(data: impl Into<Bytes>) -> Self {
30 Self {
31 raw: Some(data.into()),
32 compressed: None,
33 }
34 }
35
36 #[inline]
38 pub const fn empty() -> Self {
39 Self {
40 raw: None,
41 compressed: None,
42 }
43 }
44
45 #[inline]
47 pub fn from_compressed(raw: Bytes, compressed: Bytes) -> Self {
48 Self {
49 raw: Some(raw),
50 compressed: Some(compressed),
51 }
52 }
53
54 #[inline]
56 pub fn as_slice(&self) -> &[u8] {
57 self.raw.as_ref().map(|b| &b[..]).unwrap_or(&[])
58 }
59
60 #[inline]
62 pub fn raw(&self) -> Option<&Bytes> {
63 self.raw.as_ref()
64 }
65
66 #[inline]
68 pub fn raw_mut(&mut self) -> &mut Option<Bytes> {
69 &mut self.raw
70 }
71
72 #[inline]
74 pub fn compressed(&self) -> Option<&Bytes> {
75 self.compressed.as_ref()
76 }
77
78 #[inline]
80 pub fn compressed_mut(&mut self) -> &mut Option<Bytes> {
81 &mut self.compressed
82 }
83
84 #[inline]
86 pub(crate) fn set_compressed(&mut self, compressed: Bytes) {
87 self.compressed = Some(compressed);
88 }
89
90 #[inline]
92 pub fn is_compressed(&self) -> bool {
93 self.compressed.is_some()
94 }
95
96 #[inline]
98 pub fn into_bytes(self) -> Bytes {
99 self.raw.unwrap_or_default()
100 }
101
102 #[inline]
104 pub fn len(&self) -> usize {
105 self.raw.as_ref().map_or(0, |b| b.len())
106 }
107
108 #[inline]
110 pub fn is_empty(&self) -> bool {
111 let raw_empty = self.raw.as_ref().is_none_or(|b| b.is_empty());
112 let compressed_empty = self.compressed.as_ref().is_none_or(|b| b.is_empty());
113 raw_empty && compressed_empty
114 }
115}
116
117impl AsRef<[u8]> for MessageBody {
118 fn as_ref(&self) -> &[u8] {
119 self.as_slice()
120 }
121}
122
123impl From<Vec<u8>> for MessageBody {
124 fn from(data: Vec<u8>) -> Self {
125 Self::new(data)
126 }
127}
128
129impl From<Bytes> for MessageBody {
130 fn from(data: Bytes) -> Self {
131 Self::new(data)
132 }
133}
134
135impl From<&[u8]> for MessageBody {
136 fn from(data: &[u8]) -> Self {
137 Self::new(Bytes::copy_from_slice(data))
138 }
139}