kafka_protocol/messages/
list_groups_request.rs1#![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 ListGroupsRequest {
24 pub states_filter: Vec<StrBytes>,
28
29 pub types_filter: Vec<StrBytes>,
33
34 pub unknown_tagged_fields: BTreeMap<i32, Bytes>,
36}
37
38impl ListGroupsRequest {
39 pub fn with_states_filter(mut self, value: Vec<StrBytes>) -> Self {
45 self.states_filter = value;
46 self
47 }
48 pub fn with_types_filter(mut self, value: Vec<StrBytes>) -> Self {
54 self.types_filter = value;
55 self
56 }
57 pub fn with_unknown_tagged_fields(mut self, value: BTreeMap<i32, Bytes>) -> Self {
59 self.unknown_tagged_fields = value;
60 self
61 }
62 pub fn with_unknown_tagged_field(mut self, key: i32, value: Bytes) -> Self {
64 self.unknown_tagged_fields.insert(key, value);
65 self
66 }
67}
68
69#[cfg(feature = "client")]
70impl Encodable for ListGroupsRequest {
71 fn encode<B: ByteBufMut>(&self, buf: &mut B, version: i16) -> Result<()> {
72 if version < 0 || version > 5 {
73 bail!("specified version not supported by this message type");
74 }
75 if version >= 4 {
76 types::CompactArray(types::CompactString).encode(buf, &self.states_filter)?;
77 } else {
78 if !self.states_filter.is_empty() {
79 bail!("A field is set that is not available on the selected protocol version");
80 }
81 }
82 if version >= 5 {
83 types::CompactArray(types::CompactString).encode(buf, &self.types_filter)?;
84 } else {
85 if !self.types_filter.is_empty() {
86 bail!("A field is set that is not available on the selected protocol version");
87 }
88 }
89 if version >= 3 {
90 let num_tagged_fields = self.unknown_tagged_fields.len();
91 if num_tagged_fields > std::u32::MAX as usize {
92 bail!(
93 "Too many tagged fields to encode ({} fields)",
94 num_tagged_fields
95 );
96 }
97 types::UnsignedVarInt.encode(buf, num_tagged_fields as u32)?;
98
99 write_unknown_tagged_fields(buf, 0.., &self.unknown_tagged_fields)?;
100 }
101 Ok(())
102 }
103 fn compute_size(&self, version: i16) -> Result<usize> {
104 let mut total_size = 0;
105 if version >= 4 {
106 total_size +=
107 types::CompactArray(types::CompactString).compute_size(&self.states_filter)?;
108 } else {
109 if !self.states_filter.is_empty() {
110 bail!("A field is set that is not available on the selected protocol version");
111 }
112 }
113 if version >= 5 {
114 total_size +=
115 types::CompactArray(types::CompactString).compute_size(&self.types_filter)?;
116 } else {
117 if !self.types_filter.is_empty() {
118 bail!("A field is set that is not available on the selected protocol version");
119 }
120 }
121 if version >= 3 {
122 let num_tagged_fields = self.unknown_tagged_fields.len();
123 if num_tagged_fields > std::u32::MAX as usize {
124 bail!(
125 "Too many tagged fields to encode ({} fields)",
126 num_tagged_fields
127 );
128 }
129 total_size += types::UnsignedVarInt.compute_size(num_tagged_fields as u32)?;
130
131 total_size += compute_unknown_tagged_fields_size(&self.unknown_tagged_fields)?;
132 }
133 Ok(total_size)
134 }
135}
136
137#[cfg(feature = "broker")]
138impl Decodable for ListGroupsRequest {
139 fn decode<B: ByteBuf>(buf: &mut B, version: i16) -> Result<Self> {
140 if version < 0 || version > 5 {
141 bail!("specified version not supported by this message type");
142 }
143 let states_filter = if version >= 4 {
144 types::CompactArray(types::CompactString).decode(buf)?
145 } else {
146 Default::default()
147 };
148 let types_filter = if version >= 5 {
149 types::CompactArray(types::CompactString).decode(buf)?
150 } else {
151 Default::default()
152 };
153 let mut unknown_tagged_fields = BTreeMap::new();
154 if version >= 3 {
155 let num_tagged_fields = types::UnsignedVarInt.decode(buf)?;
156 for _ in 0..num_tagged_fields {
157 let tag: u32 = types::UnsignedVarInt.decode(buf)?;
158 let size: u32 = types::UnsignedVarInt.decode(buf)?;
159 let unknown_value = buf.try_get_bytes(size as usize)?;
160 unknown_tagged_fields.insert(tag as i32, unknown_value);
161 }
162 }
163 Ok(Self {
164 states_filter,
165 types_filter,
166 unknown_tagged_fields,
167 })
168 }
169}
170
171impl Default for ListGroupsRequest {
172 fn default() -> Self {
173 Self {
174 states_filter: Default::default(),
175 types_filter: Default::default(),
176 unknown_tagged_fields: BTreeMap::new(),
177 }
178 }
179}
180
181impl Message for ListGroupsRequest {
182 const VERSIONS: VersionRange = VersionRange { min: 0, max: 5 };
183 const DEPRECATED_VERSIONS: Option<VersionRange> = None;
184}
185
186impl HeaderVersion for ListGroupsRequest {
187 fn header_version(version: i16) -> i16 {
188 if version >= 3 {
189 2
190 } else {
191 1
192 }
193 }
194}