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