krabka_protocol/opt/rustwide/workdir/generated/
BrokerRegistrationChangeRecord.owned.rs1use bytes::{Buf, BufMut};
4
5use crate::{
6 Decode, Encode, ProtocolError, UnknownTaggedFields,
7 codegen_helpers::is_default,
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_i8, get_i32, get_i64, put_i8, 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 MIN_VERSION: i16 = 0;
19pub const MAX_VERSION: i16 = 3;
20pub const FLEXIBLE_MIN: i16 = 0;
21#[inline]
22#[must_use]
23pub fn is_flexible(version: i16) -> bool {
24 version >= FLEXIBLE_MIN
25}
26#[derive(Debug, Clone, PartialEq, Eq, Default)]
27pub struct BrokerRegistrationChangeRecord {
28 pub broker_id: i32,
29 pub broker_epoch: i64,
30 pub fenced: i8,
31 pub in_controlled_shutdown: i8,
32 pub log_dirs: Vec<Uuid>,
33 pub cordoned_log_dirs: Option<Vec<Uuid>>,
34 pub unknown_tagged_fields: UnknownTaggedFields,
35}
36impl Encode for BrokerRegistrationChangeRecord {
37 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
38 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
39 return Err(ProtocolError::SchemaMismatch(
40 "BrokerRegistrationChangeRecord version out of range",
41 ));
42 }
43 let flex = is_flexible(version);
44 if version >= 0 {
45 put_i32(buf, self.broker_id);
46 }
47 if version >= 0 {
48 put_i64(buf, self.broker_epoch);
49 }
50 if flex {
51 let mut tagged = WriteTaggedFields::new();
52 if !(is_default(&self.fenced)) {
53 let payload = encode_to_bytes(1, |b| {
54 put_i8(b, self.fenced);
55 Ok(())
56 })?;
57 tagged.add(0, payload);
58 }
59 if version >= 1 && !(is_default(&self.in_controlled_shutdown)) {
60 let payload = encode_to_bytes(1, |b| {
61 put_i8(b, self.in_controlled_shutdown);
62 Ok(())
63 })?;
64 tagged.add(1, payload);
65 }
66 if version >= 2 && !(is_default(&self.log_dirs)) {
67 let payload = encode_to_bytes(
68 {
69 let prefix = array_len_prefix_len((self.log_dirs).len(), flex);
70 let body: usize = (self.log_dirs).iter().map(|_| 16).sum();
71 prefix + body
72 },
73 |b| {
74 {
75 put_array_len(b, (self.log_dirs).len(), flex)?;
76 for it in &self.log_dirs {
77 put_uuid(b, *it);
78 }
79 }
80 Ok(())
81 },
82 )?;
83 tagged.add(2, payload);
84 }
85 if version >= 3 && self.cordoned_log_dirs.is_some() {
86 let payload = encode_to_bytes(
87 {
88 let opt: Option<&Vec<_>> = (self.cordoned_log_dirs).as_ref();
89 let prefix = nullable_array_len_prefix_len(opt.map(Vec::len), flex);
90 let body: usize = opt.map_or(0, |v| v.iter().map(|_| 16).sum());
91 prefix + body
92 },
93 |b| {
94 {
95 let len = (self.cordoned_log_dirs).as_ref().map(Vec::len);
96 put_nullable_array_len(b, len, flex)?;
97 if let Some(v) = &self.cordoned_log_dirs {
98 for it in v {
99 put_uuid(b, *it);
100 }
101 }
102 }
103 Ok(())
104 },
105 )?;
106 tagged.add(3, payload);
107 }
108 tagged.write(buf, &self.unknown_tagged_fields)?;
109 }
110 Ok(())
111 }
112 fn encoded_len(&self, version: i16) -> usize {
113 let flex = is_flexible(version);
114 let mut n: usize = 0;
115 if version >= 0 {
116 n += 4;
117 }
118 if version >= 0 {
119 n += 8;
120 }
121 if flex {
122 let mut known_pairs: Vec<(u32, usize)> = Vec::new();
123 if !(is_default(&self.fenced)) {
124 known_pairs.push((0, 1));
125 }
126 if version >= 1 && !(is_default(&self.in_controlled_shutdown)) {
127 known_pairs.push((1, 1));
128 }
129 if version >= 2 && !(is_default(&self.log_dirs)) {
130 known_pairs.push((2, {
131 let prefix = array_len_prefix_len((self.log_dirs).len(), flex);
132 let body: usize = (self.log_dirs).iter().map(|_| 16).sum();
133 prefix + body
134 }));
135 }
136 if version >= 3 && self.cordoned_log_dirs.is_some() {
137 known_pairs.push((3, {
138 let opt: Option<&Vec<_>> = (self.cordoned_log_dirs).as_ref();
139 let prefix = nullable_array_len_prefix_len(opt.map(Vec::len), flex);
140 let body: usize = opt.map_or(0, |v| v.iter().map(|_| 16).sum());
141 prefix + body
142 }));
143 }
144 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
145 }
146 n
147 }
148}
149impl Decode<'_> for BrokerRegistrationChangeRecord {
150 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
151 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
152 return Err(ProtocolError::SchemaMismatch(
153 "BrokerRegistrationChangeRecord version out of range",
154 ));
155 }
156 let flex = is_flexible(version);
157 let mut out = Self::default();
158 if version >= 0 {
159 out.broker_id = get_i32(buf)?;
160 }
161 if version >= 0 {
162 out.broker_epoch = get_i64(buf)?;
163 }
164 if flex {
165 let mut tag_fenced = None;
166 let mut tag_in_controlled_shutdown = None;
167 let mut tag_log_dirs = None;
168 let mut tag_cordoned_log_dirs = None;
169 out.unknown_tagged_fields = read_tagged_fields(buf, |tag, payload| match tag {
170 0 => {
171 tag_fenced = Some({
172 let b: &mut &[u8] = payload;
173 get_i8(b)?
174 });
175 Ok(true)
176 }
177 1 if version >= 1 => {
178 tag_in_controlled_shutdown = Some({
179 let b: &mut &[u8] = payload;
180 get_i8(b)?
181 });
182 Ok(true)
183 }
184 1 => Err(ProtocolError::TagNotValidForVersion { tag: 1, version }),
185 2 if version >= 2 => {
186 tag_log_dirs = Some({
187 let b: &mut &[u8] = payload;
188 {
189 let n = get_array_len(b, flex)?;
190 let mut v = Vec::with_capacity(n);
191 for _ in 0..n {
192 v.push(get_uuid(b)?);
193 }
194 v
195 }
196 });
197 Ok(true)
198 }
199 2 => Err(ProtocolError::TagNotValidForVersion { tag: 2, version }),
200 3 if version >= 3 => {
201 tag_cordoned_log_dirs = Some({
202 let b: &mut &[u8] = payload;
203 {
204 let opt = get_nullable_array_len(b, flex)?;
205 match opt {
206 None => None,
207 Some(n) => {
208 let mut v = Vec::with_capacity(n);
209 for _ in 0..n {
210 v.push(get_uuid(b)?);
211 }
212 Some(v)
213 }
214 }
215 }
216 });
217 Ok(true)
218 }
219 3 => Err(ProtocolError::TagNotValidForVersion { tag: 3, version }),
220 _ => Ok(false),
221 })?;
222 if let Some(v) = tag_fenced {
223 out.fenced = v;
224 }
225 if let Some(v) = tag_in_controlled_shutdown {
226 out.in_controlled_shutdown = v;
227 }
228 if let Some(v) = tag_log_dirs {
229 out.log_dirs = v;
230 }
231 if let Some(v) = tag_cordoned_log_dirs {
232 out.cordoned_log_dirs = v;
233 }
234 }
235 Ok(out)
236 }
237}
238#[cfg(test)]
239impl BrokerRegistrationChangeRecord {
240 #[must_use]
241 pub fn populated(version: i16) -> Self {
242 let mut m = Self::default();
243 if version >= 0 {
244 m.broker_id = 1i32;
245 }
246 if version >= 0 {
247 m.broker_epoch = 1i64;
248 }
249 if version >= 0 {
250 m.fenced = 1i8;
251 }
252 if version >= 1 {
253 m.in_controlled_shutdown = 1i8;
254 }
255 if version >= 2 {
256 m.log_dirs = vec![Uuid([1u8; 16])];
257 }
258 if version >= 3 {
259 m.cordoned_log_dirs = Some(vec![Uuid([1u8; 16])]);
260 }
261 m
262 }
263}
264#[must_use]
267#[allow(unused_comparisons)]
268pub fn default_json(version: i16) -> ::serde_json::Value {
269 let mut obj = ::serde_json::Map::new();
270 obj.insert("brokerId".to_owned(), ::serde_json::json!(0));
271 obj.insert("brokerEpoch".to_owned(), ::serde_json::json!(0));
272 obj.insert("fenced".to_owned(), ::serde_json::json!(0));
273 if version >= 1 {
274 obj.insert("inControlledShutdown".to_owned(), ::serde_json::json!(0));
275 }
276 if version >= 2 {
277 obj.insert("logDirs".to_owned(), ::serde_json::Value::Array(vec![]));
278 }
279 if version >= 3 {
280 obj.insert("cordonedLogDirs".to_owned(), ::serde_json::Value::Null);
281 }
282 ::serde_json::Value::Object(obj)
283}
284#[must_use]
287pub fn tagged_fixture() -> BrokerRegistrationChangeRecord {
288 BrokerRegistrationChangeRecord {
289 fenced: 1i8,
290 in_controlled_shutdown: 1i8,
291 log_dirs: vec![Uuid([1u8; 16])],
292 cordoned_log_dirs: Some(vec![Uuid([1u8; 16])]),
293 ..BrokerRegistrationChangeRecord::default()
294 }
295}
296#[must_use]
299pub fn tagged_fixture_json(version: i16) -> ::serde_json::Value {
300 let mut m = ::serde_json::Map::new();
301 m.insert("brokerId".to_owned(), ::serde_json::json!(0));
302 m.insert("brokerEpoch".to_owned(), ::serde_json::json!(0));
303 m.insert("fenced".to_owned(), ::serde_json::json!(1));
304 if version >= 1 {
305 m.insert("inControlledShutdown".to_owned(), ::serde_json::json!(1));
306 }
307 if version >= 2 {
308 m.insert(
309 "logDirs".to_owned(),
310 ::serde_json::Value::Array(vec![::serde_json::Value::String(
311 "AQEBAQEBAQEBAQEBAQEBAQ".to_owned(),
312 )]),
313 );
314 }
315 if version == 3 {
316 m.insert(
317 "cordonedLogDirs".to_owned(),
318 ::serde_json::Value::Array(vec![::serde_json::Value::String(
319 "AQEBAQEBAQEBAQEBAQEBAQ".to_owned(),
320 )]),
321 );
322 }
323 ::serde_json::Value::Object(m)
324}