1use byteorder::WriteBytesExt;
16
17use crate::codec::*;
18use crate::IoResult;
19
20#[derive(Debug, Default, Clone)]
32pub struct ApiVersionsResponse {
33 pub error_code: i16,
35 pub api_keys: Vec<ApiVersion>,
37 pub throttle_time_ms: i32,
40 pub supported_features: Vec<SupportedFeatureKey>,
42 pub finalized_features_epoch: i64,
45 pub finalized_features: Vec<FinalizedFeatureKey>,
48 pub zk_migration_ready: bool,
50 pub unknown_tagged_fields: Vec<RawTaggedField>,
52}
53
54impl Encodable for ApiVersionsResponse {
55 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
56 Int16.encode(buf, self.error_code)?;
57 NullableArray(Struct(version), version >= 3).encode(buf, self.api_keys.as_slice())?;
58 if version >= 1 {
59 Int32.encode(buf, self.throttle_time_ms)?;
60 }
61 if version >= 3 {
62 RawTaggedFieldList.encode_with(buf, 3, &self.unknown_tagged_fields, |buf| {
63 RawTaggedFieldWriter.write_field(
64 buf,
65 0,
66 NullableArray(Struct(version), version >= 3),
67 self.supported_features.as_slice(),
68 )?;
69 RawTaggedFieldWriter.write_field(buf, 1, Int64, self.finalized_features_epoch)?;
70 RawTaggedFieldWriter.write_field(
71 buf,
72 2,
73 NullableArray(Struct(version), version >= 3),
74 self.finalized_features.as_slice(),
75 )?;
76 Ok(())
77 })?;
78 }
79 Ok(())
80 }
81
82 fn calculate_size(&self, version: i16) -> usize {
83 let mut res = 0;
84 res += Int16::SIZE; res +=
86 NullableArray(Struct(version), version >= 3).calculate_size(self.api_keys.as_slice());
87 if version >= 1 {
88 res += Int32::SIZE; }
90 if version >= 3 {
91 res += RawTaggedFieldList.calculate_size_with(
92 3,
93 RawTaggedFieldWriter.calculate_field_size(
94 0,
95 NullableArray(Struct(version), version >= 3),
96 self.supported_features.as_slice(),
97 ) + RawTaggedFieldWriter.calculate_field_size(
98 1,
99 Int64,
100 &self.finalized_features_epoch,
101 ) + RawTaggedFieldWriter.calculate_field_size(
102 2,
103 NullableArray(Struct(version), version >= 3),
104 self.finalized_features.as_slice(),
105 ),
106 &self.unknown_tagged_fields,
107 );
108 }
109 res
110 }
111}
112
113#[derive(Debug, Default, Clone)]
114pub struct ApiVersion {
115 pub api_key: i16,
117 pub min_version: i16,
119 pub max_version: i16,
121 pub unknown_tagged_fields: Vec<RawTaggedField>,
123}
124
125impl Encodable for ApiVersion {
126 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
127 Int16.encode(buf, self.api_key)?;
128 Int16.encode(buf, self.min_version)?;
129 Int16.encode(buf, self.max_version)?;
130 if version >= 3 {
131 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
132 }
133 Ok(())
134 }
135
136 fn calculate_size(&self, version: i16) -> usize {
137 let mut res = 0;
138 res += Int16::SIZE; res += Int16::SIZE; res += Int16::SIZE; if version >= 3 {
142 res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
143 }
144 res
145 }
146}
147
148#[derive(Debug, Default, Clone)]
149pub struct SupportedFeatureKey {
150 pub name: String,
152 pub min_version: i16,
154 pub max_version: i16,
156 pub unknown_tagged_fields: Vec<RawTaggedField>,
158}
159
160impl Encodable for SupportedFeatureKey {
161 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
162 if version > 3 {
163 Err(err_encode_message_unsupported(
164 version,
165 "SupportedFeatureKey",
166 ))?
167 }
168 NullableString(true).encode(buf, self.name.as_ref())?;
169 Int16.encode(buf, self.min_version)?;
170 Int16.encode(buf, self.max_version)?;
171 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
172 Ok(())
173 }
174
175 fn calculate_size(&self, _version: i16) -> usize {
176 let mut res = 0;
177 res += NullableString(true).calculate_size(self.name.as_ref());
178 res += Int16::SIZE; res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
181 res
182 }
183}
184
185#[derive(Debug, Default, Clone)]
186pub struct FinalizedFeatureKey {
187 pub name: String,
189 pub max_version_level: i16,
191 pub min_version_level: i16,
193 pub unknown_tagged_fields: Vec<RawTaggedField>,
195}
196
197impl Encodable for FinalizedFeatureKey {
198 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
199 if version > 3 {
200 Err(err_encode_message_unsupported(
201 version,
202 "FinalizedFeatureKey",
203 ))?
204 }
205 NullableString(true).encode(buf, self.name.as_ref())?;
206 Int16.encode(buf, self.max_version_level)?;
207 Int16.encode(buf, self.min_version_level)?;
208 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
209 Ok(())
210 }
211
212 fn calculate_size(&self, _version: i16) -> usize {
213 let mut res = 0;
214 res += NullableString(true).calculate_size(self.name.as_ref());
215 res += Int16::SIZE; res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
218 res
219 }
220}