1use bytes::BufMut;
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 owned::describe_share_group_offsets_response,
7 primitives::{
8 array::{array_len_prefix_len, get_array_len, put_array_len},
9 fixed::{get_i16, get_i32, get_i64, put_i16, put_i32, put_i64},
10 string_bytes::{
11 compact_nullable_string_len, compact_string_len, nullable_string_len,
12 put_compact_nullable_string, put_compact_string, put_nullable_string, put_string,
13 string_len,
14 },
15 string_bytes_borrowed::{
16 get_compact_nullable_string_borrowed, get_compact_string_borrowed,
17 get_nullable_string_borrowed, get_string_borrowed,
18 },
19 uuid::{Uuid, get_uuid, put_uuid},
20 },
21 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
22};
23pub const API_KEY: i16 = 90;
24pub const MIN_VERSION: i16 = 0;
25pub const MAX_VERSION: i16 = 1;
26pub const FLEXIBLE_MIN: i16 = 0;
27#[inline]
28#[must_use]
29pub fn is_flexible(version: i16) -> bool {
30 version >= FLEXIBLE_MIN
31}
32#[derive(Debug, Clone, PartialEq, Eq, Default)]
33pub struct DescribeShareGroupOffsetsResponse<'a> {
34 pub throttle_time_ms: i32,
35 pub groups: Vec<DescribeShareGroupOffsetsResponseGroup<'a>>,
36 pub unknown_tagged_fields: UnknownTaggedFields,
37}
38impl DescribeShareGroupOffsetsResponse<'_> {
39 #[must_use]
40 pub fn to_owned(
41 &self,
42 ) -> describe_share_group_offsets_response::DescribeShareGroupOffsetsResponse {
43 describe_share_group_offsets_response::DescribeShareGroupOffsetsResponse {
44 throttle_time_ms: (self.throttle_time_ms),
45 groups: (self.groups)
46 .iter()
47 .map(DescribeShareGroupOffsetsResponseGroup::to_owned)
48 .collect(),
49 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
50 }
51 }
52}
53impl Encode for DescribeShareGroupOffsetsResponse<'_> {
54 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
55 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
56 return Err(ProtocolError::UnsupportedVersion {
57 api_key: API_KEY,
58 version,
59 });
60 }
61 let flex = is_flexible(version);
62 if version >= 0 {
63 put_i32(buf, self.throttle_time_ms);
64 }
65 if version >= 0 {
66 {
67 put_array_len(buf, (self.groups).len(), flex)?;
68 for it in &self.groups {
69 it.encode(buf, version)?;
70 }
71 }
72 }
73 if flex {
74 let tagged = WriteTaggedFields::new();
75 tagged.write(buf, &self.unknown_tagged_fields)?;
76 }
77 Ok(())
78 }
79 fn encoded_len(&self, version: i16) -> usize {
80 let flex = is_flexible(version);
81 let mut n: usize = 0;
82 if version >= 0 {
83 n += 4;
84 }
85 if version >= 0 {
86 n += {
87 let prefix = array_len_prefix_len((self.groups).len(), flex);
88 let body: usize = (self.groups).iter().map(|it| it.encoded_len(version)).sum();
89 prefix + body
90 };
91 }
92 if flex {
93 let known_pairs: Vec<(u32, usize)> = Vec::new();
94 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
95 }
96 n
97 }
98}
99impl<'de> DecodeBorrow<'de> for DescribeShareGroupOffsetsResponse<'de> {
100 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
101 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
102 return Err(ProtocolError::UnsupportedVersion {
103 api_key: API_KEY,
104 version,
105 });
106 }
107 let flex = is_flexible(version);
108 let mut out = Self::default();
109 if version >= 0 {
110 out.throttle_time_ms = get_i32(buf)?;
111 }
112 if version >= 0 {
113 out.groups = {
114 let n = get_array_len(buf, flex)?;
115 let mut v = Vec::with_capacity(n);
116 for _ in 0..n {
117 v.push(DescribeShareGroupOffsetsResponseGroup::decode_borrow(
118 buf, version,
119 )?);
120 }
121 v
122 };
123 }
124 if flex {
125 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
126 }
127 Ok(out)
128 }
129}
130#[cfg(test)]
131impl DescribeShareGroupOffsetsResponse<'_> {
132 #[must_use]
133 pub fn populated(version: i16) -> Self {
134 let mut m = Self::default();
135 if version >= 0 {
136 m.throttle_time_ms = 1i32;
137 }
138 if version >= 0 {
139 m.groups = vec![DescribeShareGroupOffsetsResponseGroup::populated(version)];
140 }
141 m
142 }
143}
144#[derive(Debug, Clone, PartialEq, Eq, Default)]
145pub struct DescribeShareGroupOffsetsResponseGroup<'a> {
146 pub group_id: &'a str,
147 pub topics: Vec<DescribeShareGroupOffsetsResponseTopic<'a>>,
148 pub error_code: i16,
149 pub error_message: Option<&'a str>,
150 pub unknown_tagged_fields: UnknownTaggedFields,
151}
152impl DescribeShareGroupOffsetsResponseGroup<'_> {
153 #[must_use]
154 pub fn to_owned(
155 &self,
156 ) -> describe_share_group_offsets_response::DescribeShareGroupOffsetsResponseGroup {
157 describe_share_group_offsets_response::DescribeShareGroupOffsetsResponseGroup {
158 group_id: (self.group_id).to_owned(),
159 topics: (self.topics)
160 .iter()
161 .map(DescribeShareGroupOffsetsResponseTopic::to_owned)
162 .collect(),
163 error_code: (self.error_code),
164 error_message: (self.error_message).map(str::to_owned),
165 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
166 }
167 }
168}
169impl Encode for DescribeShareGroupOffsetsResponseGroup<'_> {
170 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
171 let flex = version >= 0;
172 if version >= 0 {
173 if flex {
174 put_compact_string(buf, self.group_id)?;
175 } else {
176 put_string(buf, self.group_id)?;
177 }
178 }
179 if version >= 0 {
180 {
181 put_array_len(buf, (self.topics).len(), flex)?;
182 for it in &self.topics {
183 it.encode(buf, version)?;
184 }
185 }
186 }
187 if version >= 0 {
188 put_i16(buf, self.error_code);
189 }
190 if version >= 0 {
191 if flex {
192 put_compact_nullable_string(buf, self.error_message)?;
193 } else {
194 put_nullable_string(buf, self.error_message)?;
195 }
196 }
197 if flex {
198 let tagged = WriteTaggedFields::new();
199 tagged.write(buf, &self.unknown_tagged_fields)?;
200 }
201 Ok(())
202 }
203 fn encoded_len(&self, version: i16) -> usize {
204 let flex = version >= 0;
205 let mut n: usize = 0;
206 if version >= 0 {
207 n += if flex {
208 compact_string_len(self.group_id)
209 } else {
210 string_len(self.group_id)
211 };
212 }
213 if version >= 0 {
214 n += {
215 let prefix = array_len_prefix_len((self.topics).len(), flex);
216 let body: usize = (self.topics).iter().map(|it| it.encoded_len(version)).sum();
217 prefix + body
218 };
219 }
220 if version >= 0 {
221 n += 2;
222 }
223 if version >= 0 {
224 n += if flex {
225 compact_nullable_string_len(self.error_message)
226 } else {
227 nullable_string_len(self.error_message)
228 };
229 }
230 if flex {
231 let known_pairs: Vec<(u32, usize)> = Vec::new();
232 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
233 }
234 n
235 }
236}
237impl<'de> DecodeBorrow<'de> for DescribeShareGroupOffsetsResponseGroup<'de> {
238 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
239 let flex = version >= 0;
240 let mut out = Self::default();
241 if version >= 0 {
242 out.group_id = if flex {
243 get_compact_string_borrowed(buf)?
244 } else {
245 get_string_borrowed(buf)?
246 };
247 }
248 if version >= 0 {
249 out.topics = {
250 let n = get_array_len(buf, flex)?;
251 let mut v = Vec::with_capacity(n);
252 for _ in 0..n {
253 v.push(DescribeShareGroupOffsetsResponseTopic::decode_borrow(
254 buf, version,
255 )?);
256 }
257 v
258 };
259 }
260 if version >= 0 {
261 out.error_code = get_i16(buf)?;
262 }
263 if version >= 0 {
264 out.error_message = if flex {
265 get_compact_nullable_string_borrowed(buf)?
266 } else {
267 get_nullable_string_borrowed(buf)?
268 };
269 }
270 if flex {
271 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
272 }
273 Ok(out)
274 }
275}
276#[cfg(test)]
277impl DescribeShareGroupOffsetsResponseGroup<'_> {
278 #[must_use]
279 pub fn populated(version: i16) -> Self {
280 let mut m = Self::default();
281 if version >= 0 {
282 m.group_id = "x";
283 }
284 if version >= 0 {
285 m.topics = vec![DescribeShareGroupOffsetsResponseTopic::populated(version)];
286 }
287 if version >= 0 {
288 m.error_code = 1i16;
289 }
290 if version >= 0 {
291 m.error_message = Some("x");
292 }
293 m
294 }
295}
296#[derive(Debug, Clone, PartialEq, Eq, Default)]
297pub struct DescribeShareGroupOffsetsResponseTopic<'a> {
298 pub topic_name: &'a str,
299 pub topic_id: Uuid,
300 pub partitions: Vec<DescribeShareGroupOffsetsResponsePartition<'a>>,
301 pub unknown_tagged_fields: UnknownTaggedFields,
302}
303impl DescribeShareGroupOffsetsResponseTopic<'_> {
304 #[must_use]
305 pub fn to_owned(
306 &self,
307 ) -> describe_share_group_offsets_response::DescribeShareGroupOffsetsResponseTopic {
308 describe_share_group_offsets_response::DescribeShareGroupOffsetsResponseTopic {
309 topic_name: (self.topic_name).to_owned(),
310 topic_id: (self.topic_id),
311 partitions: (self.partitions)
312 .iter()
313 .map(DescribeShareGroupOffsetsResponsePartition::to_owned)
314 .collect(),
315 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
316 }
317 }
318}
319impl Encode for DescribeShareGroupOffsetsResponseTopic<'_> {
320 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
321 let flex = version >= 0;
322 if version >= 0 {
323 if flex {
324 put_compact_string(buf, self.topic_name)?;
325 } else {
326 put_string(buf, self.topic_name)?;
327 }
328 }
329 if version >= 0 {
330 put_uuid(buf, self.topic_id);
331 }
332 if version >= 0 {
333 {
334 put_array_len(buf, (self.partitions).len(), flex)?;
335 for it in &self.partitions {
336 it.encode(buf, version)?;
337 }
338 }
339 }
340 if flex {
341 let tagged = WriteTaggedFields::new();
342 tagged.write(buf, &self.unknown_tagged_fields)?;
343 }
344 Ok(())
345 }
346 fn encoded_len(&self, version: i16) -> usize {
347 let flex = version >= 0;
348 let mut n: usize = 0;
349 if version >= 0 {
350 n += if flex {
351 compact_string_len(self.topic_name)
352 } else {
353 string_len(self.topic_name)
354 };
355 }
356 if version >= 0 {
357 n += 16;
358 }
359 if version >= 0 {
360 n += {
361 let prefix = array_len_prefix_len((self.partitions).len(), flex);
362 let body: usize = (self.partitions)
363 .iter()
364 .map(|it| it.encoded_len(version))
365 .sum();
366 prefix + body
367 };
368 }
369 if flex {
370 let known_pairs: Vec<(u32, usize)> = Vec::new();
371 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
372 }
373 n
374 }
375}
376impl<'de> DecodeBorrow<'de> for DescribeShareGroupOffsetsResponseTopic<'de> {
377 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
378 let flex = version >= 0;
379 let mut out = Self::default();
380 if version >= 0 {
381 out.topic_name = if flex {
382 get_compact_string_borrowed(buf)?
383 } else {
384 get_string_borrowed(buf)?
385 };
386 }
387 if version >= 0 {
388 out.topic_id = get_uuid(buf)?;
389 }
390 if version >= 0 {
391 out.partitions = {
392 let n = get_array_len(buf, flex)?;
393 let mut v = Vec::with_capacity(n);
394 for _ in 0..n {
395 v.push(DescribeShareGroupOffsetsResponsePartition::decode_borrow(
396 buf, version,
397 )?);
398 }
399 v
400 };
401 }
402 if flex {
403 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
404 }
405 Ok(out)
406 }
407}
408#[cfg(test)]
409impl DescribeShareGroupOffsetsResponseTopic<'_> {
410 #[must_use]
411 pub fn populated(version: i16) -> Self {
412 let mut m = Self::default();
413 if version >= 0 {
414 m.topic_name = "x";
415 }
416 if version >= 0 {
417 m.topic_id = Uuid([1u8; 16]);
418 }
419 if version >= 0 {
420 m.partitions = vec![DescribeShareGroupOffsetsResponsePartition::populated(
421 version,
422 )];
423 }
424 m
425 }
426}
427#[derive(Debug, Clone, PartialEq, Eq)]
428pub struct DescribeShareGroupOffsetsResponsePartition<'a> {
429 pub partition_index: i32,
430 pub start_offset: i64,
431 pub leader_epoch: i32,
432 pub lag: i64,
433 pub error_code: i16,
434 pub error_message: Option<&'a str>,
435 pub unknown_tagged_fields: UnknownTaggedFields,
436}
437impl Default for DescribeShareGroupOffsetsResponsePartition<'_> {
438 fn default() -> Self {
439 Self {
440 partition_index: 0i32,
441 start_offset: 0i64,
442 leader_epoch: 0i32,
443 lag: -1i64,
444 error_code: 0i16,
445 error_message: None,
446 unknown_tagged_fields: UnknownTaggedFields::default(),
447 }
448 }
449}
450impl DescribeShareGroupOffsetsResponsePartition<'_> {
451 #[must_use]
452 pub fn to_owned(
453 &self,
454 ) -> describe_share_group_offsets_response::DescribeShareGroupOffsetsResponsePartition {
455 describe_share_group_offsets_response::DescribeShareGroupOffsetsResponsePartition {
456 partition_index: (self.partition_index),
457 start_offset: (self.start_offset),
458 leader_epoch: (self.leader_epoch),
459 lag: (self.lag),
460 error_code: (self.error_code),
461 error_message: (self.error_message).map(str::to_owned),
462 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
463 }
464 }
465}
466impl Encode for DescribeShareGroupOffsetsResponsePartition<'_> {
467 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
468 let flex = version >= 0;
469 if version >= 0 {
470 put_i32(buf, self.partition_index);
471 }
472 if version >= 0 {
473 put_i64(buf, self.start_offset);
474 }
475 if version >= 0 {
476 put_i32(buf, self.leader_epoch);
477 }
478 if version >= 1 {
479 put_i64(buf, self.lag);
480 }
481 if version >= 0 {
482 put_i16(buf, self.error_code);
483 }
484 if version >= 0 {
485 if flex {
486 put_compact_nullable_string(buf, self.error_message)?;
487 } else {
488 put_nullable_string(buf, self.error_message)?;
489 }
490 }
491 if flex {
492 let tagged = WriteTaggedFields::new();
493 tagged.write(buf, &self.unknown_tagged_fields)?;
494 }
495 Ok(())
496 }
497 fn encoded_len(&self, version: i16) -> usize {
498 let flex = version >= 0;
499 let mut n: usize = 0;
500 if version >= 0 {
501 n += 4;
502 }
503 if version >= 0 {
504 n += 8;
505 }
506 if version >= 0 {
507 n += 4;
508 }
509 if version >= 1 {
510 n += 8;
511 }
512 if version >= 0 {
513 n += 2;
514 }
515 if version >= 0 {
516 n += if flex {
517 compact_nullable_string_len(self.error_message)
518 } else {
519 nullable_string_len(self.error_message)
520 };
521 }
522 if flex {
523 let known_pairs: Vec<(u32, usize)> = Vec::new();
524 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
525 }
526 n
527 }
528}
529impl<'de> DecodeBorrow<'de> for DescribeShareGroupOffsetsResponsePartition<'de> {
530 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
531 let flex = version >= 0;
532 let mut out = Self::default();
533 if version >= 0 {
534 out.partition_index = get_i32(buf)?;
535 }
536 if version >= 0 {
537 out.start_offset = get_i64(buf)?;
538 }
539 if version >= 0 {
540 out.leader_epoch = get_i32(buf)?;
541 }
542 if version >= 1 {
543 out.lag = get_i64(buf)?;
544 }
545 if version >= 0 {
546 out.error_code = get_i16(buf)?;
547 }
548 if version >= 0 {
549 out.error_message = if flex {
550 get_compact_nullable_string_borrowed(buf)?
551 } else {
552 get_nullable_string_borrowed(buf)?
553 };
554 }
555 if flex {
556 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
557 }
558 Ok(out)
559 }
560}
561#[cfg(test)]
562impl DescribeShareGroupOffsetsResponsePartition<'_> {
563 #[must_use]
564 pub fn populated(version: i16) -> Self {
565 let mut m = Self::default();
566 if version >= 0 {
567 m.partition_index = 1i32;
568 }
569 if version >= 0 {
570 m.start_offset = 1i64;
571 }
572 if version >= 0 {
573 m.leader_epoch = 1i32;
574 }
575 if version >= 1 {
576 m.lag = 1i64;
577 }
578 if version >= 0 {
579 m.error_code = 1i16;
580 }
581 if version >= 0 {
582 m.error_message = Some("x");
583 }
584 m
585 }
586}