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