krabka_protocol/opt/rustwide/workdir/generated/
VoteResponse.owned.rs1use 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_bool, get_i16, get_i32, get_u16, put_bool, put_i16, put_i32, put_u16},
11 string_bytes::{
12 compact_string_len, get_compact_string_owned, get_string_owned, put_compact_string,
13 put_string, string_len,
14 },
15 },
16 tagged_fields::{WriteTaggedFields, encode_to_bytes, read_tagged_fields, tagged_fields_len},
17};
18pub const API_KEY: i16 = 52;
19pub const MIN_VERSION: i16 = 0;
20pub const MAX_VERSION: i16 = 2;
21pub const FLEXIBLE_MIN: i16 = 0;
22#[inline]
23#[must_use]
24pub fn is_flexible(version: i16) -> bool {
25 version >= FLEXIBLE_MIN
26}
27#[derive(Debug, Clone, PartialEq, Eq, Default)]
28pub struct VoteResponse {
29 pub error_code: i16,
30 pub topics: Vec<TopicData>,
31 pub node_endpoints: Vec<NodeEndpoint>,
32 pub unknown_tagged_fields: UnknownTaggedFields,
33}
34impl Encode for VoteResponse {
35 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
36 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
37 return Err(ProtocolError::UnsupportedVersion {
38 api_key: API_KEY,
39 version,
40 });
41 }
42 let flex = is_flexible(version);
43 if version >= 0 {
44 put_i16(buf, self.error_code);
45 }
46 if version >= 0 {
47 {
48 put_array_len(buf, (self.topics).len(), flex)?;
49 for it in &self.topics {
50 it.encode(buf, version)?;
51 }
52 }
53 }
54 if flex {
55 let mut tagged = WriteTaggedFields::new();
56 if version >= 1 && !(is_default(&self.node_endpoints)) {
57 let payload = encode_to_bytes(
58 {
59 let prefix = array_len_prefix_len((self.node_endpoints).len(), flex);
60 let body: usize = (self.node_endpoints)
61 .iter()
62 .map(|it| it.encoded_len(version))
63 .sum();
64 prefix + body
65 },
66 |b| {
67 {
68 put_array_len(b, (self.node_endpoints).len(), flex)?;
69 for it in &self.node_endpoints {
70 it.encode(b, version)?;
71 }
72 }
73 Ok(())
74 },
75 )?;
76 tagged.add(0, payload);
77 }
78 tagged.write(buf, &self.unknown_tagged_fields)?;
79 }
80 Ok(())
81 }
82 fn encoded_len(&self, version: i16) -> usize {
83 let flex = is_flexible(version);
84 let mut n: usize = 0;
85 if version >= 0 {
86 n += 2;
87 }
88 if version >= 0 {
89 n += {
90 let prefix = array_len_prefix_len((self.topics).len(), flex);
91 let body: usize = (self.topics).iter().map(|it| it.encoded_len(version)).sum();
92 prefix + body
93 };
94 }
95 if flex {
96 let mut known_pairs: Vec<(u32, usize)> = Vec::new();
97 if version >= 1 && !(is_default(&self.node_endpoints)) {
98 known_pairs.push((0, {
99 let prefix = array_len_prefix_len((self.node_endpoints).len(), flex);
100 let body: usize = (self.node_endpoints)
101 .iter()
102 .map(|it| it.encoded_len(version))
103 .sum();
104 prefix + body
105 }));
106 }
107 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
108 }
109 n
110 }
111}
112impl Decode<'_> for VoteResponse {
113 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
114 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
115 return Err(ProtocolError::UnsupportedVersion {
116 api_key: API_KEY,
117 version,
118 });
119 }
120 let flex = is_flexible(version);
121 let mut out = Self::default();
122 if version >= 0 {
123 out.error_code = get_i16(buf)?;
124 }
125 if version >= 0 {
126 out.topics = {
127 let n = get_array_len(buf, flex)?;
128 let mut v = Vec::with_capacity(n);
129 for _ in 0..n {
130 v.push(TopicData::decode(buf, version)?);
131 }
132 v
133 };
134 }
135 if flex {
136 let mut tag_node_endpoints = None;
137 out.unknown_tagged_fields = read_tagged_fields(buf, |tag, payload| match tag {
138 0 if version >= 1 => {
139 tag_node_endpoints = Some({
140 let b: &mut &[u8] = payload;
141 {
142 let n = get_array_len(b, flex)?;
143 let mut v = Vec::with_capacity(n);
144 for _ in 0..n {
145 v.push(NodeEndpoint::decode(b, version)?);
146 }
147 v
148 }
149 });
150 Ok(true)
151 }
152 0 => Err(ProtocolError::TagNotValidForVersion { tag: 0, version }),
153 _ => Ok(false),
154 })?;
155 if let Some(v) = tag_node_endpoints {
156 out.node_endpoints = v;
157 }
158 }
159 Ok(out)
160 }
161}
162#[cfg(test)]
163impl VoteResponse {
164 #[must_use]
165 pub fn populated(version: i16) -> Self {
166 let mut m = Self::default();
167 if version >= 0 {
168 m.error_code = 1i16;
169 }
170 if version >= 0 {
171 m.topics = vec![TopicData::populated(version)];
172 }
173 if version >= 1 {
174 m.node_endpoints = vec![NodeEndpoint::populated(version)];
175 }
176 m
177 }
178}
179#[derive(Debug, Clone, PartialEq, Eq, Default)]
180pub struct TopicData {
181 pub topic_name: String,
182 pub partitions: Vec<PartitionData>,
183 pub unknown_tagged_fields: UnknownTaggedFields,
184}
185impl Encode for TopicData {
186 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
187 let flex = version >= 0;
188 if version >= 0 {
189 if flex {
190 put_compact_string(buf, &self.topic_name)?;
191 } else {
192 put_string(buf, &self.topic_name)?;
193 }
194 }
195 if version >= 0 {
196 {
197 put_array_len(buf, (self.partitions).len(), flex)?;
198 for it in &self.partitions {
199 it.encode(buf, version)?;
200 }
201 }
202 }
203 if flex {
204 let tagged = WriteTaggedFields::new();
205 tagged.write(buf, &self.unknown_tagged_fields)?;
206 }
207 Ok(())
208 }
209 fn encoded_len(&self, version: i16) -> usize {
210 let flex = version >= 0;
211 let mut n: usize = 0;
212 if version >= 0 {
213 n += if flex {
214 compact_string_len(&self.topic_name)
215 } else {
216 string_len(&self.topic_name)
217 };
218 }
219 if version >= 0 {
220 n += {
221 let prefix = array_len_prefix_len((self.partitions).len(), flex);
222 let body: usize = (self.partitions)
223 .iter()
224 .map(|it| it.encoded_len(version))
225 .sum();
226 prefix + body
227 };
228 }
229 if flex {
230 let known_pairs: Vec<(u32, usize)> = Vec::new();
231 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
232 }
233 n
234 }
235}
236impl Decode<'_> for TopicData {
237 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
238 let flex = version >= 0;
239 let mut out = Self::default();
240 if version >= 0 {
241 out.topic_name = if flex {
242 get_compact_string_owned(buf)?
243 } else {
244 get_string_owned(buf)?
245 };
246 }
247 if version >= 0 {
248 out.partitions = {
249 let n = get_array_len(buf, flex)?;
250 let mut v = Vec::with_capacity(n);
251 for _ in 0..n {
252 v.push(PartitionData::decode(buf, version)?);
253 }
254 v
255 };
256 }
257 if flex {
258 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
259 }
260 Ok(out)
261 }
262}
263#[cfg(test)]
264impl TopicData {
265 #[must_use]
266 pub fn populated(version: i16) -> Self {
267 let mut m = Self::default();
268 if version >= 0 {
269 m.topic_name = "x".to_owned();
270 }
271 if version >= 0 {
272 m.partitions = vec![PartitionData::populated(version)];
273 }
274 m
275 }
276}
277#[derive(Debug, Clone, PartialEq, Eq, Default)]
278pub struct PartitionData {
279 pub partition_index: i32,
280 pub error_code: i16,
281 pub leader_id: i32,
282 pub leader_epoch: i32,
283 pub vote_granted: bool,
284 pub unknown_tagged_fields: UnknownTaggedFields,
285}
286impl Encode for PartitionData {
287 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
288 let flex = version >= 0;
289 if version >= 0 {
290 put_i32(buf, self.partition_index);
291 }
292 if version >= 0 {
293 put_i16(buf, self.error_code);
294 }
295 if version >= 0 {
296 put_i32(buf, self.leader_id);
297 }
298 if version >= 0 {
299 put_i32(buf, self.leader_epoch);
300 }
301 if version >= 0 {
302 put_bool(buf, self.vote_granted);
303 }
304 if flex {
305 let tagged = WriteTaggedFields::new();
306 tagged.write(buf, &self.unknown_tagged_fields)?;
307 }
308 Ok(())
309 }
310 fn encoded_len(&self, version: i16) -> usize {
311 let flex = version >= 0;
312 let mut n: usize = 0;
313 if version >= 0 {
314 n += 4;
315 }
316 if version >= 0 {
317 n += 2;
318 }
319 if version >= 0 {
320 n += 4;
321 }
322 if version >= 0 {
323 n += 4;
324 }
325 if version >= 0 {
326 n += 1;
327 }
328 if flex {
329 let known_pairs: Vec<(u32, usize)> = Vec::new();
330 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
331 }
332 n
333 }
334}
335impl Decode<'_> for PartitionData {
336 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
337 let flex = version >= 0;
338 let mut out = Self::default();
339 if version >= 0 {
340 out.partition_index = get_i32(buf)?;
341 }
342 if version >= 0 {
343 out.error_code = get_i16(buf)?;
344 }
345 if version >= 0 {
346 out.leader_id = get_i32(buf)?;
347 }
348 if version >= 0 {
349 out.leader_epoch = get_i32(buf)?;
350 }
351 if version >= 0 {
352 out.vote_granted = get_bool(buf)?;
353 }
354 if flex {
355 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
356 }
357 Ok(out)
358 }
359}
360#[cfg(test)]
361impl PartitionData {
362 #[must_use]
363 pub fn populated(version: i16) -> Self {
364 let mut m = Self::default();
365 if version >= 0 {
366 m.partition_index = 1i32;
367 }
368 if version >= 0 {
369 m.error_code = 1i16;
370 }
371 if version >= 0 {
372 m.leader_id = 1i32;
373 }
374 if version >= 0 {
375 m.leader_epoch = 1i32;
376 }
377 if version >= 0 {
378 m.vote_granted = true;
379 }
380 m
381 }
382}
383#[derive(Debug, Clone, PartialEq, Eq, Default)]
384pub struct NodeEndpoint {
385 pub node_id: i32,
386 pub host: String,
387 pub port: u16,
388 pub unknown_tagged_fields: UnknownTaggedFields,
389}
390impl Encode for NodeEndpoint {
391 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
392 let flex = version >= 0;
393 if version >= 1 {
394 put_i32(buf, self.node_id);
395 }
396 if version >= 1 {
397 if flex {
398 put_compact_string(buf, &self.host)?;
399 } else {
400 put_string(buf, &self.host)?;
401 }
402 }
403 if version >= 1 {
404 put_u16(buf, self.port);
405 }
406 if flex {
407 let tagged = WriteTaggedFields::new();
408 tagged.write(buf, &self.unknown_tagged_fields)?;
409 }
410 Ok(())
411 }
412 fn encoded_len(&self, version: i16) -> usize {
413 let flex = version >= 0;
414 let mut n: usize = 0;
415 if version >= 1 {
416 n += 4;
417 }
418 if version >= 1 {
419 n += if flex {
420 compact_string_len(&self.host)
421 } else {
422 string_len(&self.host)
423 };
424 }
425 if version >= 1 {
426 n += 2;
427 }
428 if flex {
429 let known_pairs: Vec<(u32, usize)> = Vec::new();
430 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
431 }
432 n
433 }
434}
435impl Decode<'_> for NodeEndpoint {
436 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
437 let flex = version >= 0;
438 let mut out = Self::default();
439 if version >= 1 {
440 out.node_id = get_i32(buf)?;
441 }
442 if version >= 1 {
443 out.host = if flex {
444 get_compact_string_owned(buf)?
445 } else {
446 get_string_owned(buf)?
447 };
448 }
449 if version >= 1 {
450 out.port = get_u16(buf)?;
451 }
452 if flex {
453 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
454 }
455 Ok(out)
456 }
457}
458#[cfg(test)]
459impl NodeEndpoint {
460 #[must_use]
461 pub fn populated(version: i16) -> Self {
462 let mut m = Self::default();
463 if version >= 1 {
464 m.node_id = 1i32;
465 }
466 if version >= 1 {
467 m.host = "x".to_owned();
468 }
469 if version >= 1 {
470 m.port = 1u16;
471 }
472 m
473 }
474}
475#[must_use]
478#[allow(unused_comparisons)]
479pub fn default_json(version: i16) -> ::serde_json::Value {
480 let mut obj = ::serde_json::Map::new();
481 obj.insert("errorCode".to_owned(), ::serde_json::json!(0));
482 obj.insert("topics".to_owned(), ::serde_json::Value::Array(vec![]));
483 if version >= 1 {
484 obj.insert(
485 "nodeEndpoints".to_owned(),
486 ::serde_json::Value::Array(vec![]),
487 );
488 }
489 ::serde_json::Value::Object(obj)
490}
491#[must_use]
494pub fn tagged_fixture() -> VoteResponse {
495 VoteResponse {
496 node_endpoints: vec![NodeEndpoint {
497 node_id: 1i32,
498 host: "x".to_owned(),
499 port: 1u16,
500 ..NodeEndpoint::default()
501 }],
502 ..VoteResponse::default()
503 }
504}
505#[must_use]
508pub fn tagged_fixture_json(version: i16) -> ::serde_json::Value {
509 let mut m = ::serde_json::Map::new();
510 m.insert("errorCode".to_owned(), ::serde_json::json!(0));
511 m.insert("topics".to_owned(), ::serde_json::Value::Array(vec![]));
512 if version >= 1 {
513 m.insert(
514 "nodeEndpoints".to_owned(),
515 ::serde_json::Value::Array(vec![{
516 let mut m = ::serde_json::Map::new();
517 m.insert("nodeId".to_owned(), ::serde_json::json!(1));
518 m.insert(
519 "host".to_owned(),
520 ::serde_json::Value::String("x".to_owned()),
521 );
522 m.insert("port".to_owned(), ::serde_json::json!(1));
523 ::serde_json::Value::Object(m)
524 }]),
525 );
526 }
527 ::serde_json::Value::Object(m)
528}