1use bytes::BufMut;
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 owned::share_fetch_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_bytes_len_from_size, compact_nullable_string_len, compact_string_len,
12 nullable_string_len, put_bytes, put_compact_bytes, put_compact_nullable_bytes,
13 put_compact_nullable_string, put_compact_string, put_nullable_bytes,
14 put_nullable_string, put_string, string_len,
15 },
16 string_bytes_borrowed::{
17 get_bytes_borrowed, get_compact_bytes_borrowed, get_compact_nullable_bytes_borrowed,
18 get_compact_nullable_string_borrowed, get_compact_string_borrowed,
19 get_nullable_bytes_borrowed, get_nullable_string_borrowed, get_string_borrowed,
20 },
21 uuid::{Uuid, get_uuid, put_uuid},
22 varint::uvarint_len,
23 },
24 records::{RecordsError, RecordsPayloadBorrowed},
25 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
26};
27pub const API_KEY: i16 = 78;
28pub const MIN_VERSION: i16 = 1;
29pub const MAX_VERSION: i16 = 2;
30pub const FLEXIBLE_MIN: i16 = 0;
31#[inline]
32#[must_use]
33pub fn is_flexible(version: i16) -> bool {
34 version >= FLEXIBLE_MIN
35}
36#[derive(Debug, Clone, PartialEq, Eq, Default)]
37pub struct ShareFetchResponse<'a> {
38 pub throttle_time_ms: i32,
39 pub error_code: i16,
40 pub error_message: Option<&'a str>,
41 pub acquisition_lock_timeout_ms: i32,
42 pub responses: Vec<ShareFetchableTopicResponse<'a>>,
43 pub node_endpoints: Vec<NodeEndpoint<'a>>,
44 pub unknown_tagged_fields: UnknownTaggedFields,
45}
46impl ShareFetchResponse<'_> {
47 pub fn to_owned(&self) -> Result<share_fetch_response::ShareFetchResponse, RecordsError> {
52 Ok(share_fetch_response::ShareFetchResponse {
53 throttle_time_ms: (self.throttle_time_ms),
54 error_code: (self.error_code),
55 error_message: (self.error_message).map(str::to_owned),
56 acquisition_lock_timeout_ms: (self.acquisition_lock_timeout_ms),
57 responses: (self.responses)
58 .iter()
59 .map(ShareFetchableTopicResponse::to_owned)
60 .collect::<Result<_, _>>()?,
61 node_endpoints: (self.node_endpoints)
62 .iter()
63 .map(NodeEndpoint::to_owned)
64 .collect(),
65 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
66 })
67 }
68}
69impl Encode for ShareFetchResponse<'_> {
70 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
71 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
72 return Err(ProtocolError::UnsupportedVersion {
73 api_key: API_KEY,
74 version,
75 });
76 }
77 let flex = is_flexible(version);
78 if version >= 0 {
79 put_i32(buf, self.throttle_time_ms);
80 }
81 if version >= 0 {
82 put_i16(buf, self.error_code);
83 }
84 if version >= 0 {
85 if flex {
86 put_compact_nullable_string(buf, self.error_message)?;
87 } else {
88 put_nullable_string(buf, self.error_message)?;
89 }
90 }
91 if version >= 1 {
92 put_i32(buf, self.acquisition_lock_timeout_ms);
93 }
94 if version >= 0 {
95 {
96 put_array_len(buf, (self.responses).len(), flex)?;
97 for it in &self.responses {
98 it.encode(buf, version)?;
99 }
100 }
101 }
102 if version >= 0 {
103 {
104 put_array_len(buf, (self.node_endpoints).len(), flex)?;
105 for it in &self.node_endpoints {
106 it.encode(buf, version)?;
107 }
108 }
109 }
110 if flex {
111 let tagged = WriteTaggedFields::new();
112 tagged.write(buf, &self.unknown_tagged_fields)?;
113 }
114 Ok(())
115 }
116 fn encoded_len(&self, version: i16) -> usize {
117 let flex = is_flexible(version);
118 let mut n: usize = 0;
119 if version >= 0 {
120 n += 4;
121 }
122 if version >= 0 {
123 n += 2;
124 }
125 if version >= 0 {
126 n += if flex {
127 compact_nullable_string_len(self.error_message)
128 } else {
129 nullable_string_len(self.error_message)
130 };
131 }
132 if version >= 1 {
133 n += 4;
134 }
135 if version >= 0 {
136 n += {
137 let prefix = array_len_prefix_len((self.responses).len(), flex);
138 let body: usize = (self.responses)
139 .iter()
140 .map(|it| it.encoded_len(version))
141 .sum();
142 prefix + body
143 };
144 }
145 if version >= 0 {
146 n += {
147 let prefix = array_len_prefix_len((self.node_endpoints).len(), flex);
148 let body: usize = (self.node_endpoints)
149 .iter()
150 .map(|it| it.encoded_len(version))
151 .sum();
152 prefix + body
153 };
154 }
155 if flex {
156 let known_pairs: Vec<(u32, usize)> = Vec::new();
157 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
158 }
159 n
160 }
161}
162impl<'de> DecodeBorrow<'de> for ShareFetchResponse<'de> {
163 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
164 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
165 return Err(ProtocolError::UnsupportedVersion {
166 api_key: API_KEY,
167 version,
168 });
169 }
170 let flex = is_flexible(version);
171 let mut out = Self::default();
172 if version >= 0 {
173 out.throttle_time_ms = get_i32(buf)?;
174 }
175 if version >= 0 {
176 out.error_code = get_i16(buf)?;
177 }
178 if version >= 0 {
179 out.error_message = if flex {
180 get_compact_nullable_string_borrowed(buf)?
181 } else {
182 get_nullable_string_borrowed(buf)?
183 };
184 }
185 if version >= 1 {
186 out.acquisition_lock_timeout_ms = get_i32(buf)?;
187 }
188 if version >= 0 {
189 out.responses = {
190 let n = get_array_len(buf, flex)?;
191 let mut v = Vec::with_capacity(n);
192 for _ in 0..n {
193 v.push(ShareFetchableTopicResponse::decode_borrow(buf, version)?);
194 }
195 v
196 };
197 }
198 if version >= 0 {
199 out.node_endpoints = {
200 let n = get_array_len(buf, flex)?;
201 let mut v = Vec::with_capacity(n);
202 for _ in 0..n {
203 v.push(NodeEndpoint::decode_borrow(buf, version)?);
204 }
205 v
206 };
207 }
208 if flex {
209 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
210 }
211 Ok(out)
212 }
213}
214#[cfg(test)]
215impl ShareFetchResponse<'_> {
216 #[must_use]
217 pub fn populated(version: i16) -> Self {
218 let mut m = Self::default();
219 if version >= 0 {
220 m.throttle_time_ms = 1i32;
221 }
222 if version >= 0 {
223 m.error_code = 1i16;
224 }
225 if version >= 0 {
226 m.error_message = Some("x");
227 }
228 if version >= 1 {
229 m.acquisition_lock_timeout_ms = 1i32;
230 }
231 if version >= 0 {
232 m.responses = vec![ShareFetchableTopicResponse::populated(version)];
233 }
234 if version >= 0 {
235 m.node_endpoints = vec![NodeEndpoint::populated(version)];
236 }
237 m
238 }
239}
240#[derive(Debug, Clone, PartialEq, Eq, Default)]
241pub struct ShareFetchableTopicResponse<'a> {
242 pub topic_id: Uuid,
243 pub partitions: Vec<PartitionData<'a>>,
244 pub unknown_tagged_fields: UnknownTaggedFields,
245}
246impl ShareFetchableTopicResponse<'_> {
247 pub fn to_owned(
252 &self,
253 ) -> Result<share_fetch_response::ShareFetchableTopicResponse, RecordsError> {
254 Ok(share_fetch_response::ShareFetchableTopicResponse {
255 topic_id: (self.topic_id),
256 partitions: (self.partitions)
257 .iter()
258 .map(PartitionData::to_owned)
259 .collect::<Result<_, _>>()?,
260 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
261 })
262 }
263}
264impl Encode for ShareFetchableTopicResponse<'_> {
265 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
266 let flex = version >= 0;
267 if version >= 0 {
268 put_uuid(buf, self.topic_id);
269 }
270 if version >= 0 {
271 {
272 put_array_len(buf, (self.partitions).len(), flex)?;
273 for it in &self.partitions {
274 it.encode(buf, version)?;
275 }
276 }
277 }
278 if flex {
279 let tagged = WriteTaggedFields::new();
280 tagged.write(buf, &self.unknown_tagged_fields)?;
281 }
282 Ok(())
283 }
284 fn encoded_len(&self, version: i16) -> usize {
285 let flex = version >= 0;
286 let mut n: usize = 0;
287 if version >= 0 {
288 n += 16;
289 }
290 if version >= 0 {
291 n += {
292 let prefix = array_len_prefix_len((self.partitions).len(), flex);
293 let body: usize = (self.partitions)
294 .iter()
295 .map(|it| it.encoded_len(version))
296 .sum();
297 prefix + body
298 };
299 }
300 if flex {
301 let known_pairs: Vec<(u32, usize)> = Vec::new();
302 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
303 }
304 n
305 }
306}
307impl<'de> DecodeBorrow<'de> for ShareFetchableTopicResponse<'de> {
308 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
309 let flex = version >= 0;
310 let mut out = Self::default();
311 if version >= 0 {
312 out.topic_id = get_uuid(buf)?;
313 }
314 if version >= 0 {
315 out.partitions = {
316 let n = get_array_len(buf, flex)?;
317 let mut v = Vec::with_capacity(n);
318 for _ in 0..n {
319 v.push(PartitionData::decode_borrow(buf, version)?);
320 }
321 v
322 };
323 }
324 if flex {
325 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
326 }
327 Ok(out)
328 }
329}
330#[cfg(test)]
331impl ShareFetchableTopicResponse<'_> {
332 #[must_use]
333 pub fn populated(version: i16) -> Self {
334 let mut m = Self::default();
335 if version >= 0 {
336 m.topic_id = Uuid([1u8; 16]);
337 }
338 if version >= 0 {
339 m.partitions = vec![PartitionData::populated(version)];
340 }
341 m
342 }
343}
344#[derive(Debug, Clone, PartialEq, Eq, Default)]
345pub struct PartitionData<'a> {
346 pub partition_index: i32,
347 pub error_code: i16,
348 pub error_message: Option<&'a str>,
349 pub acknowledge_error_code: i16,
350 pub acknowledge_error_message: Option<&'a str>,
351 pub current_leader: LeaderIdAndEpoch,
352 pub records: Option<RecordsPayloadBorrowed<'a>>,
353 pub acquired_records: Vec<AcquiredRecords>,
354 pub unknown_tagged_fields: UnknownTaggedFields,
355}
356impl<'a> PartitionData<'a> {
357 pub fn to_owned(&self) -> Result<share_fetch_response::PartitionData, RecordsError> {
362 Ok(share_fetch_response::PartitionData {
363 partition_index: (self.partition_index),
364 error_code: (self.error_code),
365 error_message: (self.error_message).map(str::to_owned),
366 acknowledge_error_code: (self.acknowledge_error_code),
367 acknowledge_error_message: (self.acknowledge_error_message).map(str::to_owned),
368 current_leader: (self.current_leader).to_owned(),
369 records: (self.records)
370 .as_ref()
371 .map(RecordsPayloadBorrowed::to_owned)
372 .transpose()?,
373 acquired_records: (self.acquired_records)
374 .iter()
375 .map(AcquiredRecords::to_owned)
376 .collect(),
377 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
378 })
379 }
380 fn encode_field_0<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
381 if version >= 0 {
382 put_i32(buf, self.partition_index);
383 }
384 }
385 fn encode_field_1<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
386 if version >= 0 {
387 put_i16(buf, self.error_code);
388 }
389 }
390 fn encode_field_2<B: BufMut>(
391 &self,
392 buf: &mut B,
393 version: i16,
394 flex: bool,
395 ) -> Result<(), ProtocolError> {
396 if version >= 0 {
397 if flex {
398 put_compact_nullable_string(buf, self.error_message)?;
399 } else {
400 put_nullable_string(buf, self.error_message)?;
401 }
402 }
403 Ok(())
404 }
405 fn encode_field_3<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
406 if version >= 0 {
407 put_i16(buf, self.acknowledge_error_code);
408 }
409 }
410 fn encode_field_4<B: BufMut>(
411 &self,
412 buf: &mut B,
413 version: i16,
414 flex: bool,
415 ) -> Result<(), ProtocolError> {
416 if version >= 0 {
417 if flex {
418 put_compact_nullable_string(buf, self.acknowledge_error_message)?;
419 } else {
420 put_nullable_string(buf, self.acknowledge_error_message)?;
421 }
422 }
423 Ok(())
424 }
425 fn encode_field_5<B: BufMut>(
426 &self,
427 buf: &mut B,
428 version: i16,
429 _flex: bool,
430 ) -> Result<(), ProtocolError> {
431 if version >= 0 {
432 self.current_leader.encode(buf, version)?;
433 }
434 Ok(())
435 }
436 fn encode_field_6<B: BufMut>(
437 &self,
438 buf: &mut B,
439 version: i16,
440 flex: bool,
441 ) -> Result<(), ProtocolError> {
442 if version >= 0 {
443 if version <= 0 {
444 match &self.records {
445 None => {
446 if flex {
447 put_compact_nullable_bytes(buf, None)?;
448 } else {
449 put_nullable_bytes(buf, None)?;
450 }
451 }
452 Some(__rb) => {
453 let mut __rb_buf = bytes::BytesMut::new();
454 <RecordsPayloadBorrowed as crate::Encode>::encode(
455 __rb,
456 &mut __rb_buf,
457 version,
458 )?;
459 if flex {
460 put_compact_bytes(buf, &__rb_buf)?;
461 } else {
462 put_bytes(buf, &__rb_buf)?;
463 }
464 }
465 }
466 } else {
467 match &self.records {
468 None => {
469 let __rb_buf = bytes::BytesMut::new();
470 if flex {
471 put_compact_bytes(buf, &__rb_buf)?;
472 } else {
473 put_bytes(buf, &__rb_buf)?;
474 }
475 }
476 Some(__rb) => {
477 let mut __rb_buf = bytes::BytesMut::new();
478 <RecordsPayloadBorrowed as crate::Encode>::encode(
479 __rb,
480 &mut __rb_buf,
481 version,
482 )?;
483 if flex {
484 put_compact_bytes(buf, &__rb_buf)?;
485 } else {
486 put_bytes(buf, &__rb_buf)?;
487 }
488 }
489 }
490 }
491 }
492 Ok(())
493 }
494 fn encode_field_7<B: BufMut>(
495 &self,
496 buf: &mut B,
497 version: i16,
498 flex: bool,
499 ) -> Result<(), ProtocolError> {
500 if version >= 0 {
501 {
502 put_array_len(buf, (self.acquired_records).len(), flex)?;
503 for it in &self.acquired_records {
504 it.encode(buf, version)?;
505 }
506 }
507 }
508 Ok(())
509 }
510 fn encode_tagged_fields<B: BufMut>(
511 &self,
512 buf: &mut B,
513 _version: i16,
514 flex: bool,
515 ) -> Result<(), ProtocolError> {
516 if flex {
517 let tagged = WriteTaggedFields::new();
518 tagged.write(buf, &self.unknown_tagged_fields)?;
519 }
520 Ok(())
521 }
522 fn decode_field_0(
523 out: &mut Self,
524 buf: &mut &'a [u8],
525 version: i16,
526 _flex: bool,
527 ) -> Result<(), ProtocolError> {
528 if version >= 0 {
529 out.partition_index = get_i32(buf)?;
530 }
531 Ok(())
532 }
533 fn decode_field_1(
534 out: &mut Self,
535 buf: &mut &'a [u8],
536 version: i16,
537 _flex: bool,
538 ) -> Result<(), ProtocolError> {
539 if version >= 0 {
540 out.error_code = get_i16(buf)?;
541 }
542 Ok(())
543 }
544 fn decode_field_2(
545 out: &mut Self,
546 buf: &mut &'a [u8],
547 version: i16,
548 flex: bool,
549 ) -> Result<(), ProtocolError> {
550 if version >= 0 {
551 out.error_message = if flex {
552 get_compact_nullable_string_borrowed(buf)?
553 } else {
554 get_nullable_string_borrowed(buf)?
555 };
556 }
557 Ok(())
558 }
559 fn decode_field_3(
560 out: &mut Self,
561 buf: &mut &'a [u8],
562 version: i16,
563 _flex: bool,
564 ) -> Result<(), ProtocolError> {
565 if version >= 0 {
566 out.acknowledge_error_code = get_i16(buf)?;
567 }
568 Ok(())
569 }
570 fn decode_field_4(
571 out: &mut Self,
572 buf: &mut &'a [u8],
573 version: i16,
574 flex: bool,
575 ) -> Result<(), ProtocolError> {
576 if version >= 0 {
577 out.acknowledge_error_message = if flex {
578 get_compact_nullable_string_borrowed(buf)?
579 } else {
580 get_nullable_string_borrowed(buf)?
581 };
582 }
583 Ok(())
584 }
585 fn decode_field_5(
586 out: &mut Self,
587 buf: &mut &'a [u8],
588 version: i16,
589 _flex: bool,
590 ) -> Result<(), ProtocolError> {
591 if version >= 0 {
592 out.current_leader = LeaderIdAndEpoch::decode_borrow(buf, version)?;
593 }
594 Ok(())
595 }
596 fn decode_field_6(
597 out: &mut Self,
598 buf: &mut &'a [u8],
599 version: i16,
600 flex: bool,
601 ) -> Result<(), ProtocolError> {
602 if version >= 0 {
603 out.records = if version <= 0 {
604 {
605 let __rb_opt = if flex {
606 get_compact_nullable_bytes_borrowed(buf)?
607 } else {
608 get_nullable_bytes_borrowed(buf)?
609 };
610 match __rb_opt {
611 None => None,
612 Some(__rb_slice) => {
613 let mut __rb_cur = __rb_slice;
614 Some(
615 <RecordsPayloadBorrowed as crate::DecodeBorrow>::decode_borrow(
616 &mut __rb_cur,
617 version,
618 )?,
619 )
620 }
621 }
622 }
623 } else {
624 Some({
625 let __rb_slice = if flex {
626 get_compact_bytes_borrowed(buf)?
627 } else {
628 get_bytes_borrowed(buf)?
629 };
630 let mut __rb_cur = __rb_slice;
631 <RecordsPayloadBorrowed as crate::DecodeBorrow>::decode_borrow(
632 &mut __rb_cur,
633 version,
634 )?
635 })
636 };
637 }
638 Ok(())
639 }
640 fn decode_field_7(
641 out: &mut Self,
642 buf: &mut &'a [u8],
643 version: i16,
644 flex: bool,
645 ) -> Result<(), ProtocolError> {
646 if version >= 0 {
647 out.acquired_records = {
648 let n = get_array_len(buf, flex)?;
649 let mut v = Vec::with_capacity(n);
650 for _ in 0..n {
651 v.push(AcquiredRecords::decode_borrow(buf, version)?);
652 }
653 v
654 };
655 }
656 Ok(())
657 }
658 fn decode_tagged_fields(
659 out: &mut Self,
660 buf: &mut &'a [u8],
661 _version: i16,
662 flex: bool,
663 ) -> Result<(), ProtocolError> {
664 if flex {
665 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
666 }
667 Ok(())
668 }
669}
670impl Encode for PartitionData<'_> {
671 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
672 let flex = version >= 0;
673 self.encode_field_0(buf, version, flex);
674 self.encode_field_1(buf, version, flex);
675 self.encode_field_2(buf, version, flex)?;
676 self.encode_field_3(buf, version, flex);
677 self.encode_field_4(buf, version, flex)?;
678 self.encode_field_5(buf, version, flex)?;
679 self.encode_field_6(buf, version, flex)?;
680 self.encode_field_7(buf, version, flex)?;
681 self.encode_tagged_fields(buf, version, flex)?;
682 Ok(())
683 }
684 fn encoded_len(&self, version: i16) -> usize {
685 let flex = version >= 0;
686 let mut n: usize = 0;
687 if version >= 0 {
688 n += 4;
689 }
690 if version >= 0 {
691 n += 2;
692 }
693 if version >= 0 {
694 n += if flex {
695 compact_nullable_string_len(self.error_message)
696 } else {
697 nullable_string_len(self.error_message)
698 };
699 }
700 if version >= 0 {
701 n += 2;
702 }
703 if version >= 0 {
704 n += if flex {
705 compact_nullable_string_len(self.acknowledge_error_message)
706 } else {
707 nullable_string_len(self.acknowledge_error_message)
708 };
709 }
710 if version >= 0 {
711 n += self.current_leader.encoded_len(version);
712 }
713 if version >= 0 {
714 n += if version <= 0 {
715 (self.records).as_ref().map_or_else(
716 || if flex { uvarint_len(0) } else { 4 },
717 |__rb| {
718 let __rb_len =
719 <RecordsPayloadBorrowed as crate::Encode>::encoded_len(__rb, version);
720 if flex {
721 compact_bytes_len_from_size(__rb_len)
722 } else {
723 4 + __rb_len
724 }
725 },
726 )
727 } else {
728 (self.records).as_ref().map_or_else(
729 || {
730 if flex {
731 compact_bytes_len_from_size(0)
732 } else {
733 4
734 }
735 },
736 |__rb| {
737 let __rb_len =
738 <RecordsPayloadBorrowed as crate::Encode>::encoded_len(__rb, version);
739 if flex {
740 compact_bytes_len_from_size(__rb_len)
741 } else {
742 4 + __rb_len
743 }
744 },
745 )
746 };
747 }
748 if version >= 0 {
749 n += {
750 let prefix = array_len_prefix_len((self.acquired_records).len(), flex);
751 let body: usize = (self.acquired_records)
752 .iter()
753 .map(|it| it.encoded_len(version))
754 .sum();
755 prefix + body
756 };
757 }
758 if flex {
759 let known_pairs: Vec<(u32, usize)> = Vec::new();
760 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
761 }
762 n
763 }
764}
765impl<'de> DecodeBorrow<'de> for PartitionData<'de> {
766 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
767 let flex = version >= 0;
768 let mut out = Self::default();
769 Self::decode_field_0(&mut out, buf, version, flex)?;
770 Self::decode_field_1(&mut out, buf, version, flex)?;
771 Self::decode_field_2(&mut out, buf, version, flex)?;
772 Self::decode_field_3(&mut out, buf, version, flex)?;
773 Self::decode_field_4(&mut out, buf, version, flex)?;
774 Self::decode_field_5(&mut out, buf, version, flex)?;
775 Self::decode_field_6(&mut out, buf, version, flex)?;
776 Self::decode_field_7(&mut out, buf, version, flex)?;
777 Self::decode_tagged_fields(&mut out, buf, version, flex)?;
778 Ok(out)
779 }
780}
781#[cfg(test)]
782impl PartitionData<'_> {
783 #[must_use]
784 pub fn populated(version: i16) -> Self {
785 let mut m = Self::default();
786 if version >= 0 {
787 m.partition_index = 1i32;
788 }
789 if version >= 0 {
790 m.error_code = 1i16;
791 }
792 if version >= 0 {
793 m.error_message = Some("x");
794 }
795 if version >= 0 {
796 m.acknowledge_error_code = 1i16;
797 }
798 if version >= 0 {
799 m.acknowledge_error_message = Some("x");
800 }
801 if version >= 0 {
802 m.current_leader = LeaderIdAndEpoch::populated(version);
803 }
804 if version >= 0 {
805 m.acquired_records = vec![AcquiredRecords::populated(version)];
806 }
807 m
808 }
809}
810#[derive(Debug, Clone, PartialEq, Eq, Default)]
811pub struct LeaderIdAndEpoch {
812 pub leader_id: i32,
813 pub leader_epoch: i32,
814 pub unknown_tagged_fields: UnknownTaggedFields,
815}
816impl LeaderIdAndEpoch {
817 #[must_use]
818 pub fn to_owned(&self) -> share_fetch_response::LeaderIdAndEpoch {
819 share_fetch_response::LeaderIdAndEpoch {
820 leader_id: (self.leader_id),
821 leader_epoch: (self.leader_epoch),
822 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
823 }
824 }
825}
826impl Encode for LeaderIdAndEpoch {
827 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
828 let flex = version >= 0;
829 if version >= 0 {
830 put_i32(buf, self.leader_id);
831 }
832 if version >= 0 {
833 put_i32(buf, self.leader_epoch);
834 }
835 if flex {
836 let tagged = WriteTaggedFields::new();
837 tagged.write(buf, &self.unknown_tagged_fields)?;
838 }
839 Ok(())
840 }
841 fn encoded_len(&self, version: i16) -> usize {
842 let flex = version >= 0;
843 let mut n: usize = 0;
844 if version >= 0 {
845 n += 4;
846 }
847 if version >= 0 {
848 n += 4;
849 }
850 if flex {
851 let known_pairs: Vec<(u32, usize)> = Vec::new();
852 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
853 }
854 n
855 }
856}
857impl<'de> DecodeBorrow<'de> for LeaderIdAndEpoch {
858 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
859 let flex = version >= 0;
860 let mut out = Self::default();
861 if version >= 0 {
862 out.leader_id = get_i32(buf)?;
863 }
864 if version >= 0 {
865 out.leader_epoch = get_i32(buf)?;
866 }
867 if flex {
868 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
869 }
870 Ok(out)
871 }
872}
873#[cfg(test)]
874impl LeaderIdAndEpoch {
875 #[must_use]
876 pub fn populated(version: i16) -> Self {
877 let mut m = Self::default();
878 if version >= 0 {
879 m.leader_id = 1i32;
880 }
881 if version >= 0 {
882 m.leader_epoch = 1i32;
883 }
884 m
885 }
886}
887#[derive(Debug, Clone, PartialEq, Eq, Default)]
888pub struct AcquiredRecords {
889 pub first_offset: i64,
890 pub last_offset: i64,
891 pub delivery_count: i16,
892 pub unknown_tagged_fields: UnknownTaggedFields,
893}
894impl AcquiredRecords {
895 #[must_use]
896 pub fn to_owned(&self) -> share_fetch_response::AcquiredRecords {
897 share_fetch_response::AcquiredRecords {
898 first_offset: (self.first_offset),
899 last_offset: (self.last_offset),
900 delivery_count: (self.delivery_count),
901 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
902 }
903 }
904}
905impl Encode for AcquiredRecords {
906 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
907 let flex = version >= 0;
908 if version >= 0 {
909 put_i64(buf, self.first_offset);
910 }
911 if version >= 0 {
912 put_i64(buf, self.last_offset);
913 }
914 if version >= 0 {
915 put_i16(buf, self.delivery_count);
916 }
917 if flex {
918 let tagged = WriteTaggedFields::new();
919 tagged.write(buf, &self.unknown_tagged_fields)?;
920 }
921 Ok(())
922 }
923 fn encoded_len(&self, version: i16) -> usize {
924 let flex = version >= 0;
925 let mut n: usize = 0;
926 if version >= 0 {
927 n += 8;
928 }
929 if version >= 0 {
930 n += 8;
931 }
932 if version >= 0 {
933 n += 2;
934 }
935 if flex {
936 let known_pairs: Vec<(u32, usize)> = Vec::new();
937 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
938 }
939 n
940 }
941}
942impl<'de> DecodeBorrow<'de> for AcquiredRecords {
943 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
944 let flex = version >= 0;
945 let mut out = Self::default();
946 if version >= 0 {
947 out.first_offset = get_i64(buf)?;
948 }
949 if version >= 0 {
950 out.last_offset = get_i64(buf)?;
951 }
952 if version >= 0 {
953 out.delivery_count = get_i16(buf)?;
954 }
955 if flex {
956 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
957 }
958 Ok(out)
959 }
960}
961#[cfg(test)]
962impl AcquiredRecords {
963 #[must_use]
964 pub fn populated(version: i16) -> Self {
965 let mut m = Self::default();
966 if version >= 0 {
967 m.first_offset = 1i64;
968 }
969 if version >= 0 {
970 m.last_offset = 1i64;
971 }
972 if version >= 0 {
973 m.delivery_count = 1i16;
974 }
975 m
976 }
977}
978#[derive(Debug, Clone, PartialEq, Eq, Default)]
979pub struct NodeEndpoint<'a> {
980 pub node_id: i32,
981 pub host: &'a str,
982 pub port: i32,
983 pub rack: Option<&'a str>,
984 pub unknown_tagged_fields: UnknownTaggedFields,
985}
986impl NodeEndpoint<'_> {
987 #[must_use]
988 pub fn to_owned(&self) -> share_fetch_response::NodeEndpoint {
989 share_fetch_response::NodeEndpoint {
990 node_id: (self.node_id),
991 host: (self.host).to_owned(),
992 port: (self.port),
993 rack: (self.rack).map(str::to_owned),
994 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
995 }
996 }
997}
998impl Encode for NodeEndpoint<'_> {
999 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
1000 let flex = version >= 0;
1001 if version >= 0 {
1002 put_i32(buf, self.node_id);
1003 }
1004 if version >= 0 {
1005 if flex {
1006 put_compact_string(buf, self.host)?;
1007 } else {
1008 put_string(buf, self.host)?;
1009 }
1010 }
1011 if version >= 0 {
1012 put_i32(buf, self.port);
1013 }
1014 if version >= 0 {
1015 if flex {
1016 put_compact_nullable_string(buf, self.rack)?;
1017 } else {
1018 put_nullable_string(buf, self.rack)?;
1019 }
1020 }
1021 if flex {
1022 let tagged = WriteTaggedFields::new();
1023 tagged.write(buf, &self.unknown_tagged_fields)?;
1024 }
1025 Ok(())
1026 }
1027 fn encoded_len(&self, version: i16) -> usize {
1028 let flex = version >= 0;
1029 let mut n: usize = 0;
1030 if version >= 0 {
1031 n += 4;
1032 }
1033 if version >= 0 {
1034 n += if flex {
1035 compact_string_len(self.host)
1036 } else {
1037 string_len(self.host)
1038 };
1039 }
1040 if version >= 0 {
1041 n += 4;
1042 }
1043 if version >= 0 {
1044 n += if flex {
1045 compact_nullable_string_len(self.rack)
1046 } else {
1047 nullable_string_len(self.rack)
1048 };
1049 }
1050 if flex {
1051 let known_pairs: Vec<(u32, usize)> = Vec::new();
1052 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
1053 }
1054 n
1055 }
1056}
1057impl<'de> DecodeBorrow<'de> for NodeEndpoint<'de> {
1058 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
1059 let flex = version >= 0;
1060 let mut out = Self::default();
1061 if version >= 0 {
1062 out.node_id = get_i32(buf)?;
1063 }
1064 if version >= 0 {
1065 out.host = if flex {
1066 get_compact_string_borrowed(buf)?
1067 } else {
1068 get_string_borrowed(buf)?
1069 };
1070 }
1071 if version >= 0 {
1072 out.port = get_i32(buf)?;
1073 }
1074 if version >= 0 {
1075 out.rack = if flex {
1076 get_compact_nullable_string_borrowed(buf)?
1077 } else {
1078 get_nullable_string_borrowed(buf)?
1079 };
1080 }
1081 if flex {
1082 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
1083 }
1084 Ok(out)
1085 }
1086}
1087#[cfg(test)]
1088impl NodeEndpoint<'_> {
1089 #[must_use]
1090 pub fn populated(version: i16) -> Self {
1091 let mut m = Self::default();
1092 if version >= 0 {
1093 m.node_id = 1i32;
1094 }
1095 if version >= 0 {
1096 m.host = "x";
1097 }
1098 if version >= 0 {
1099 m.port = 1i32;
1100 }
1101 if version >= 0 {
1102 m.rack = Some("x");
1103 }
1104 m
1105 }
1106}