1#![allow(unused)]
6
7use std::borrow::Borrow;
8use std::collections::BTreeMap;
9
10use anyhow::{bail, Result};
11use bytes::Bytes;
12use uuid::Uuid;
13
14use crate::protocol::{
15 buf::{ByteBuf, ByteBufMut},
16 compute_unknown_tagged_fields_size, types, write_unknown_tagged_fields, Decodable, Decoder,
17 Encodable, Encoder, HeaderVersion, Message, StrBytes, VersionRange,
18};
19
20#[non_exhaustive]
22#[derive(Debug, Clone, PartialEq)]
23pub struct LeaveGroupRequest {
24 pub group_id: super::GroupId,
28
29 pub member_id: StrBytes,
33
34 pub members: Vec<MemberIdentity>,
38
39 pub unknown_tagged_fields: BTreeMap<i32, Bytes>,
41}
42
43impl LeaveGroupRequest {
44 pub fn with_group_id(mut self, value: super::GroupId) -> Self {
50 self.group_id = value;
51 self
52 }
53 pub fn with_member_id(mut self, value: StrBytes) -> Self {
59 self.member_id = value;
60 self
61 }
62 pub fn with_members(mut self, value: Vec<MemberIdentity>) -> Self {
68 self.members = value;
69 self
70 }
71 pub fn with_unknown_tagged_fields(mut self, value: BTreeMap<i32, Bytes>) -> Self {
73 self.unknown_tagged_fields = value;
74 self
75 }
76 pub fn with_unknown_tagged_field(mut self, key: i32, value: Bytes) -> Self {
78 self.unknown_tagged_fields.insert(key, value);
79 self
80 }
81}
82
83#[cfg(feature = "client")]
84impl Encodable for LeaveGroupRequest {
85 fn encode<B: ByteBufMut>(&self, buf: &mut B, version: i16) -> Result<()> {
86 if version >= 4 {
87 types::CompactString.encode(buf, &self.group_id)?;
88 } else {
89 types::String.encode(buf, &self.group_id)?;
90 }
91 if version <= 2 {
92 types::String.encode(buf, &self.member_id)?;
93 } else {
94 if !self.member_id.is_empty() {
95 bail!("A field is set that is not available on the selected protocol version");
96 }
97 }
98 if version >= 3 {
99 if version >= 4 {
100 types::CompactArray(types::Struct { version }).encode(buf, &self.members)?;
101 } else {
102 types::Array(types::Struct { version }).encode(buf, &self.members)?;
103 }
104 } else {
105 if !self.members.is_empty() {
106 bail!("A field is set that is not available on the selected protocol version");
107 }
108 }
109 if version >= 4 {
110 let num_tagged_fields = self.unknown_tagged_fields.len();
111 if num_tagged_fields > std::u32::MAX as usize {
112 bail!(
113 "Too many tagged fields to encode ({} fields)",
114 num_tagged_fields
115 );
116 }
117 types::UnsignedVarInt.encode(buf, num_tagged_fields as u32)?;
118
119 write_unknown_tagged_fields(buf, 0.., &self.unknown_tagged_fields)?;
120 }
121 Ok(())
122 }
123 fn compute_size(&self, version: i16) -> Result<usize> {
124 let mut total_size = 0;
125 if version >= 4 {
126 total_size += types::CompactString.compute_size(&self.group_id)?;
127 } else {
128 total_size += types::String.compute_size(&self.group_id)?;
129 }
130 if version <= 2 {
131 total_size += types::String.compute_size(&self.member_id)?;
132 } else {
133 if !self.member_id.is_empty() {
134 bail!("A field is set that is not available on the selected protocol version");
135 }
136 }
137 if version >= 3 {
138 if version >= 4 {
139 total_size +=
140 types::CompactArray(types::Struct { version }).compute_size(&self.members)?;
141 } else {
142 total_size +=
143 types::Array(types::Struct { version }).compute_size(&self.members)?;
144 }
145 } else {
146 if !self.members.is_empty() {
147 bail!("A field is set that is not available on the selected protocol version");
148 }
149 }
150 if version >= 4 {
151 let num_tagged_fields = self.unknown_tagged_fields.len();
152 if num_tagged_fields > std::u32::MAX as usize {
153 bail!(
154 "Too many tagged fields to encode ({} fields)",
155 num_tagged_fields
156 );
157 }
158 total_size += types::UnsignedVarInt.compute_size(num_tagged_fields as u32)?;
159
160 total_size += compute_unknown_tagged_fields_size(&self.unknown_tagged_fields)?;
161 }
162 Ok(total_size)
163 }
164}
165
166#[cfg(feature = "broker")]
167impl Decodable for LeaveGroupRequest {
168 fn decode<B: ByteBuf>(buf: &mut B, version: i16) -> Result<Self> {
169 let group_id = if version >= 4 {
170 types::CompactString.decode(buf)?
171 } else {
172 types::String.decode(buf)?
173 };
174 let member_id = if version <= 2 {
175 types::String.decode(buf)?
176 } else {
177 Default::default()
178 };
179 let members = if version >= 3 {
180 if version >= 4 {
181 types::CompactArray(types::Struct { version }).decode(buf)?
182 } else {
183 types::Array(types::Struct { version }).decode(buf)?
184 }
185 } else {
186 Default::default()
187 };
188 let mut unknown_tagged_fields = BTreeMap::new();
189 if version >= 4 {
190 let num_tagged_fields = types::UnsignedVarInt.decode(buf)?;
191 for _ in 0..num_tagged_fields {
192 let tag: u32 = types::UnsignedVarInt.decode(buf)?;
193 let size: u32 = types::UnsignedVarInt.decode(buf)?;
194 let unknown_value = buf.try_get_bytes(size as usize)?;
195 unknown_tagged_fields.insert(tag as i32, unknown_value);
196 }
197 }
198 Ok(Self {
199 group_id,
200 member_id,
201 members,
202 unknown_tagged_fields,
203 })
204 }
205}
206
207impl Default for LeaveGroupRequest {
208 fn default() -> Self {
209 Self {
210 group_id: Default::default(),
211 member_id: Default::default(),
212 members: Default::default(),
213 unknown_tagged_fields: BTreeMap::new(),
214 }
215 }
216}
217
218impl Message for LeaveGroupRequest {
219 const VERSIONS: VersionRange = VersionRange { min: 0, max: 5 };
220 const DEPRECATED_VERSIONS: Option<VersionRange> = None;
221}
222
223#[non_exhaustive]
225#[derive(Debug, Clone, PartialEq)]
226pub struct MemberIdentity {
227 pub member_id: StrBytes,
231
232 pub group_instance_id: Option<StrBytes>,
236
237 pub reason: Option<StrBytes>,
241
242 pub unknown_tagged_fields: BTreeMap<i32, Bytes>,
244}
245
246impl MemberIdentity {
247 pub fn with_member_id(mut self, value: StrBytes) -> Self {
253 self.member_id = value;
254 self
255 }
256 pub fn with_group_instance_id(mut self, value: Option<StrBytes>) -> Self {
262 self.group_instance_id = value;
263 self
264 }
265 pub fn with_reason(mut self, value: Option<StrBytes>) -> Self {
271 self.reason = value;
272 self
273 }
274 pub fn with_unknown_tagged_fields(mut self, value: BTreeMap<i32, Bytes>) -> Self {
276 self.unknown_tagged_fields = value;
277 self
278 }
279 pub fn with_unknown_tagged_field(mut self, key: i32, value: Bytes) -> Self {
281 self.unknown_tagged_fields.insert(key, value);
282 self
283 }
284}
285
286#[cfg(feature = "client")]
287impl Encodable for MemberIdentity {
288 fn encode<B: ByteBufMut>(&self, buf: &mut B, version: i16) -> Result<()> {
289 if version >= 3 {
290 if version >= 4 {
291 types::CompactString.encode(buf, &self.member_id)?;
292 } else {
293 types::String.encode(buf, &self.member_id)?;
294 }
295 } else {
296 if !self.member_id.is_empty() {
297 bail!("A field is set that is not available on the selected protocol version");
298 }
299 }
300 if version >= 3 {
301 if version >= 4 {
302 types::CompactString.encode(buf, &self.group_instance_id)?;
303 } else {
304 types::String.encode(buf, &self.group_instance_id)?;
305 }
306 } else {
307 if !self.group_instance_id.is_none() {
308 bail!("A field is set that is not available on the selected protocol version");
309 }
310 }
311 if version >= 5 {
312 types::CompactString.encode(buf, &self.reason)?;
313 }
314 if version >= 4 {
315 let num_tagged_fields = self.unknown_tagged_fields.len();
316 if num_tagged_fields > std::u32::MAX as usize {
317 bail!(
318 "Too many tagged fields to encode ({} fields)",
319 num_tagged_fields
320 );
321 }
322 types::UnsignedVarInt.encode(buf, num_tagged_fields as u32)?;
323
324 write_unknown_tagged_fields(buf, 0.., &self.unknown_tagged_fields)?;
325 }
326 Ok(())
327 }
328 fn compute_size(&self, version: i16) -> Result<usize> {
329 let mut total_size = 0;
330 if version >= 3 {
331 if version >= 4 {
332 total_size += types::CompactString.compute_size(&self.member_id)?;
333 } else {
334 total_size += types::String.compute_size(&self.member_id)?;
335 }
336 } else {
337 if !self.member_id.is_empty() {
338 bail!("A field is set that is not available on the selected protocol version");
339 }
340 }
341 if version >= 3 {
342 if version >= 4 {
343 total_size += types::CompactString.compute_size(&self.group_instance_id)?;
344 } else {
345 total_size += types::String.compute_size(&self.group_instance_id)?;
346 }
347 } else {
348 if !self.group_instance_id.is_none() {
349 bail!("A field is set that is not available on the selected protocol version");
350 }
351 }
352 if version >= 5 {
353 total_size += types::CompactString.compute_size(&self.reason)?;
354 }
355 if version >= 4 {
356 let num_tagged_fields = self.unknown_tagged_fields.len();
357 if num_tagged_fields > std::u32::MAX as usize {
358 bail!(
359 "Too many tagged fields to encode ({} fields)",
360 num_tagged_fields
361 );
362 }
363 total_size += types::UnsignedVarInt.compute_size(num_tagged_fields as u32)?;
364
365 total_size += compute_unknown_tagged_fields_size(&self.unknown_tagged_fields)?;
366 }
367 Ok(total_size)
368 }
369}
370
371#[cfg(feature = "broker")]
372impl Decodable for MemberIdentity {
373 fn decode<B: ByteBuf>(buf: &mut B, version: i16) -> Result<Self> {
374 let member_id = if version >= 3 {
375 if version >= 4 {
376 types::CompactString.decode(buf)?
377 } else {
378 types::String.decode(buf)?
379 }
380 } else {
381 Default::default()
382 };
383 let group_instance_id = if version >= 3 {
384 if version >= 4 {
385 types::CompactString.decode(buf)?
386 } else {
387 types::String.decode(buf)?
388 }
389 } else {
390 None
391 };
392 let reason = if version >= 5 {
393 types::CompactString.decode(buf)?
394 } else {
395 None
396 };
397 let mut unknown_tagged_fields = BTreeMap::new();
398 if version >= 4 {
399 let num_tagged_fields = types::UnsignedVarInt.decode(buf)?;
400 for _ in 0..num_tagged_fields {
401 let tag: u32 = types::UnsignedVarInt.decode(buf)?;
402 let size: u32 = types::UnsignedVarInt.decode(buf)?;
403 let unknown_value = buf.try_get_bytes(size as usize)?;
404 unknown_tagged_fields.insert(tag as i32, unknown_value);
405 }
406 }
407 Ok(Self {
408 member_id,
409 group_instance_id,
410 reason,
411 unknown_tagged_fields,
412 })
413 }
414}
415
416impl Default for MemberIdentity {
417 fn default() -> Self {
418 Self {
419 member_id: Default::default(),
420 group_instance_id: None,
421 reason: None,
422 unknown_tagged_fields: BTreeMap::new(),
423 }
424 }
425}
426
427impl Message for MemberIdentity {
428 const VERSIONS: VersionRange = VersionRange { min: 0, max: 5 };
429 const DEPRECATED_VERSIONS: Option<VersionRange> = None;
430}
431
432impl HeaderVersion for LeaveGroupRequest {
433 fn header_version(version: i16) -> i16 {
434 if version >= 4 {
435 2
436 } else {
437 1
438 }
439 }
440}