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