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