krabka_protocol/opt/rustwide/workdir/generated/
BrokerHeartbeatRequest.borrowed.rs1use bytes::BufMut;
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 primitives::fixed::{get_bool, get_i32, get_i64, put_bool, put_i32, put_i64},
7 tagged_fields::{WriteTaggedFields, encode_to_bytes, read_tagged_fields, tagged_fields_len},
8};
9pub const API_KEY: i16 = 63;
10pub const MIN_VERSION: i16 = 0;
11pub const MAX_VERSION: i16 = 2;
12pub const LATEST_STABLE_VERSION: i16 = 2;
13pub const FLEXIBLE_MIN: i16 = 0;
14#[inline]
15#[must_use]
16pub fn is_flexible(version: i16) -> bool {
17 version >= FLEXIBLE_MIN
18}
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct BrokerHeartbeatRequest {
21 pub broker_id: i32,
22 pub broker_epoch: i64,
23 pub current_metadata_offset: i64,
24 pub want_fence: bool,
25 pub want_shut_down: bool,
26 pub offline_log_dirs: Vec<crate::primitives::uuid::Uuid>,
27 pub cordoned_log_dirs: Option<Vec<crate::primitives::uuid::Uuid>>,
28 pub unknown_tagged_fields: UnknownTaggedFields,
29}
30impl Default for BrokerHeartbeatRequest {
31 fn default() -> Self {
32 Self {
33 broker_id: 0i32,
34 broker_epoch: -1i64,
35 current_metadata_offset: 0i64,
36 want_fence: false,
37 want_shut_down: false,
38 offline_log_dirs: Vec::new(),
39 cordoned_log_dirs: None,
40 unknown_tagged_fields: UnknownTaggedFields::default(),
41 }
42 }
43}
44impl BrokerHeartbeatRequest {
45 #[must_use]
49 pub fn to_owned(&self) -> crate::owned::broker_heartbeat_request::BrokerHeartbeatRequest {
50 crate::owned::broker_heartbeat_request::BrokerHeartbeatRequest {
51 broker_id: (self.broker_id),
52 broker_epoch: (self.broker_epoch),
53 current_metadata_offset: (self.current_metadata_offset),
54 want_fence: (self.want_fence),
55 want_shut_down: (self.want_shut_down),
56 offline_log_dirs: (self.offline_log_dirs).clone(),
57 cordoned_log_dirs: (self.cordoned_log_dirs).clone(),
58 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
59 }
60 }
61}
62impl Encode for BrokerHeartbeatRequest {
63 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
64 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
65 return Err(ProtocolError::UnsupportedVersion {
66 api_key: API_KEY,
67 version,
68 });
69 }
70 let flex = is_flexible(version);
71 if version >= 0 {
72 put_i32(buf, self.broker_id);
73 }
74 if version >= 0 {
75 put_i64(buf, self.broker_epoch);
76 }
77 if version >= 0 {
78 put_i64(buf, self.current_metadata_offset);
79 }
80 if version >= 0 {
81 put_bool(buf, self.want_fence);
82 }
83 if version >= 0 {
84 put_bool(buf, self.want_shut_down);
85 }
86 if flex {
87 let mut tagged = WriteTaggedFields::new();
88 if version >= 1 && !(crate::codegen_helpers::is_default(&self.offline_log_dirs)) {
89 let payload = encode_to_bytes(
90 {
91 let prefix = crate::primitives::array::array_len_prefix_len(
92 (self.offline_log_dirs).len(),
93 flex,
94 );
95 let body: usize = (self.offline_log_dirs).iter().map(|_| 16).sum();
96 prefix + body
97 },
98 |b| {
99 {
100 crate::primitives::array::put_array_len(
101 b,
102 (self.offline_log_dirs).len(),
103 flex,
104 );
105 for it in &self.offline_log_dirs {
106 crate::primitives::uuid::put_uuid(b, *it);
107 }
108 };
109 Ok(())
110 },
111 );
112 tagged.add(0, payload);
113 }
114 if version >= 2 && self.cordoned_log_dirs.is_some() {
115 let payload = encode_to_bytes(
116 {
117 let opt: Option<&Vec<_>> = (self.cordoned_log_dirs).as_ref();
118 let prefix = crate::primitives::array::nullable_array_len_prefix_len(
119 opt.map(std::vec::Vec::len),
120 flex,
121 );
122 let body: usize = opt.map_or(0, |v| v.iter().map(|_| 16).sum());
123 prefix + body
124 },
125 |b| {
126 {
127 let len = (self.cordoned_log_dirs).as_ref().map(Vec::len);
128 crate::primitives::array::put_nullable_array_len(b, len, flex);
129 if let Some(v) = &self.cordoned_log_dirs {
130 for it in v {
131 crate::primitives::uuid::put_uuid(b, *it);
132 }
133 }
134 };
135 Ok(())
136 },
137 );
138 tagged.add(1, payload);
139 }
140 tagged.write(buf, &self.unknown_tagged_fields);
141 }
142 Ok(())
143 }
144 fn encoded_len(&self, version: i16) -> usize {
145 let flex = is_flexible(version);
146 let mut n: usize = 0;
147 if version >= 0 {
148 n += 4;
149 }
150 if version >= 0 {
151 n += 8;
152 }
153 if version >= 0 {
154 n += 8;
155 }
156 if version >= 0 {
157 n += 1;
158 }
159 if version >= 0 {
160 n += 1;
161 }
162 if flex {
163 let mut known_pairs: Vec<(u32, usize)> = Vec::new();
164 if version >= 1 && !(crate::codegen_helpers::is_default(&self.offline_log_dirs)) {
165 known_pairs.push((0, {
166 let prefix = crate::primitives::array::array_len_prefix_len(
167 (self.offline_log_dirs).len(),
168 flex,
169 );
170 let body: usize = (self.offline_log_dirs).iter().map(|_| 16).sum();
171 prefix + body
172 }));
173 }
174 if version >= 2 && self.cordoned_log_dirs.is_some() {
175 known_pairs.push((1, {
176 let opt: Option<&Vec<_>> = (self.cordoned_log_dirs).as_ref();
177 let prefix = crate::primitives::array::nullable_array_len_prefix_len(
178 opt.map(std::vec::Vec::len),
179 flex,
180 );
181 let body: usize = opt.map_or(0, |v| v.iter().map(|_| 16).sum());
182 prefix + body
183 }));
184 }
185 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
186 }
187 n
188 }
189}
190impl<'de> DecodeBorrow<'de> for BrokerHeartbeatRequest {
191 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
192 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
193 return Err(ProtocolError::UnsupportedVersion {
194 api_key: API_KEY,
195 version,
196 });
197 }
198 let flex = is_flexible(version);
199 let mut out = Self::default();
200 if version >= 0 {
201 out.broker_id = get_i32(buf)?;
202 }
203 if version >= 0 {
204 out.broker_epoch = get_i64(buf)?;
205 }
206 if version >= 0 {
207 out.current_metadata_offset = get_i64(buf)?;
208 }
209 if version >= 0 {
210 out.want_fence = get_bool(buf)?;
211 }
212 if version >= 0 {
213 out.want_shut_down = get_bool(buf)?;
214 }
215 if flex {
216 let mut tag_offline_log_dirs = None;
217 let mut tag_cordoned_log_dirs = None;
218 out.unknown_tagged_fields = read_tagged_fields(buf, |tag, payload| match tag {
219 0 if version >= 1 => {
220 tag_offline_log_dirs = Some({
221 let b: &mut &[u8] = payload;
222 {
223 let n = crate::primitives::array::get_array_len(b, flex)?;
224 let mut v = Vec::with_capacity(n);
225 for _ in 0..n {
226 v.push(crate::primitives::uuid::get_uuid(b)?);
227 }
228 v
229 }
230 });
231 Ok(true)
232 }
233 0 => Err(ProtocolError::TagNotValidForVersion { tag: 0, version }),
234 1 if version >= 2 => {
235 tag_cordoned_log_dirs = Some({
236 let b: &mut &[u8] = payload;
237 {
238 let opt = crate::primitives::array::get_nullable_array_len(b, flex)?;
239 match opt {
240 None => None,
241 Some(n) => {
242 let mut v = Vec::with_capacity(n);
243 for _ in 0..n {
244 v.push(crate::primitives::uuid::get_uuid(b)?);
245 }
246 Some(v)
247 }
248 }
249 }
250 });
251 Ok(true)
252 }
253 1 => Err(ProtocolError::TagNotValidForVersion { tag: 1, version }),
254 _ => Ok(false),
255 })?;
256 if let Some(v) = tag_offline_log_dirs {
257 out.offline_log_dirs = v;
258 }
259 if let Some(v) = tag_cordoned_log_dirs {
260 out.cordoned_log_dirs = v;
261 }
262 }
263 Ok(out)
264 }
265}
266#[cfg(test)]
267impl BrokerHeartbeatRequest {
268 #[must_use]
269 pub fn populated(version: i16) -> Self {
270 let mut m = Self::default();
271 if version >= 0 {
272 m.broker_id = 1i32;
273 }
274 if version >= 0 {
275 m.broker_epoch = 1i64;
276 }
277 if version >= 0 {
278 m.current_metadata_offset = 1i64;
279 }
280 if version >= 0 {
281 m.want_fence = true;
282 }
283 if version >= 0 {
284 m.want_shut_down = true;
285 }
286 if version >= 1 {
287 m.offline_log_dirs = vec![crate::primitives::uuid::Uuid([1u8; 16])];
288 }
289 if version >= 2 {
290 m.cordoned_log_dirs = Some(vec![crate::primitives::uuid::Uuid([1u8; 16])]);
291 }
292 m
293 }
294}