1use bytes::BufMut;
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 owned::share_acknowledge_request,
7 primitives::{
8 array::{array_len_prefix_len, get_array_len, put_array_len},
9 fixed::{get_bool, get_i8, get_i32, get_i64, put_bool, put_i8, put_i32, put_i64},
10 string_bytes::{
11 compact_nullable_string_len, nullable_string_len, put_compact_nullable_string,
12 put_nullable_string,
13 },
14 string_bytes_borrowed::{
15 get_compact_nullable_string_borrowed, get_nullable_string_borrowed,
16 },
17 uuid::{Uuid, get_uuid, put_uuid},
18 },
19 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
20};
21pub const API_KEY: i16 = 79;
22pub const MIN_VERSION: i16 = 1;
23pub const MAX_VERSION: i16 = 2;
24pub const LATEST_STABLE_VERSION: i16 = 2;
25pub const FLEXIBLE_MIN: i16 = 0;
26#[inline]
27#[must_use]
28pub fn is_flexible(version: i16) -> bool {
29 version >= FLEXIBLE_MIN
30}
31#[derive(Debug, Clone, PartialEq, Eq)]
32pub struct ShareAcknowledgeRequest<'a> {
33 pub group_id: Option<&'a str>,
34 pub member_id: Option<&'a str>,
35 pub share_session_epoch: i32,
36 pub is_renew_ack: bool,
37 pub topics: Vec<AcknowledgeTopic>,
38 pub unknown_tagged_fields: UnknownTaggedFields,
39}
40impl Default for ShareAcknowledgeRequest<'_> {
41 fn default() -> Self {
42 Self {
43 group_id: None,
44 member_id: Some(""),
45 share_session_epoch: 0i32,
46 is_renew_ack: false,
47 topics: Vec::new(),
48 unknown_tagged_fields: UnknownTaggedFields::default(),
49 }
50 }
51}
52impl ShareAcknowledgeRequest<'_> {
53 #[must_use]
54 pub fn to_owned(&self) -> share_acknowledge_request::ShareAcknowledgeRequest {
55 share_acknowledge_request::ShareAcknowledgeRequest {
56 group_id: (self.group_id).map(str::to_owned),
57 member_id: (self.member_id).map(str::to_owned),
58 share_session_epoch: (self.share_session_epoch),
59 is_renew_ack: (self.is_renew_ack),
60 topics: (self.topics)
61 .iter()
62 .map(AcknowledgeTopic::to_owned)
63 .collect(),
64 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
65 }
66 }
67}
68impl Encode for ShareAcknowledgeRequest<'_> {
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 if flex {
79 put_compact_nullable_string(buf, self.group_id)?;
80 } else {
81 put_nullable_string(buf, self.group_id)?;
82 }
83 }
84 if version >= 0 {
85 if flex {
86 put_compact_nullable_string(buf, self.member_id)?;
87 } else {
88 put_nullable_string(buf, self.member_id)?;
89 }
90 }
91 if version >= 0 {
92 put_i32(buf, self.share_session_epoch);
93 }
94 if version >= 2 {
95 put_bool(buf, self.is_renew_ack);
96 }
97 if version >= 0 {
98 {
99 put_array_len(buf, (self.topics).len(), flex)?;
100 for it in &self.topics {
101 it.encode(buf, version)?;
102 }
103 }
104 }
105 if flex {
106 let tagged = WriteTaggedFields::new();
107 tagged.write(buf, &self.unknown_tagged_fields)?;
108 }
109 Ok(())
110 }
111 fn encoded_len(&self, version: i16) -> usize {
112 let flex = is_flexible(version);
113 let mut n: usize = 0;
114 if version >= 0 {
115 n += if flex {
116 compact_nullable_string_len(self.group_id)
117 } else {
118 nullable_string_len(self.group_id)
119 };
120 }
121 if version >= 0 {
122 n += if flex {
123 compact_nullable_string_len(self.member_id)
124 } else {
125 nullable_string_len(self.member_id)
126 };
127 }
128 if version >= 0 {
129 n += 4;
130 }
131 if version >= 2 {
132 n += 1;
133 }
134 if version >= 0 {
135 n += {
136 let prefix = array_len_prefix_len((self.topics).len(), flex);
137 let body: usize = (self.topics).iter().map(|it| it.encoded_len(version)).sum();
138 prefix + body
139 };
140 }
141 if flex {
142 let known_pairs: Vec<(u32, usize)> = Vec::new();
143 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
144 }
145 n
146 }
147}
148impl<'de> DecodeBorrow<'de> for ShareAcknowledgeRequest<'de> {
149 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
150 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
151 return Err(ProtocolError::UnsupportedVersion {
152 api_key: API_KEY,
153 version,
154 });
155 }
156 let flex = is_flexible(version);
157 let mut out = Self::default();
158 if version >= 0 {
159 out.group_id = if flex {
160 get_compact_nullable_string_borrowed(buf)?
161 } else {
162 get_nullable_string_borrowed(buf)?
163 };
164 }
165 if version >= 0 {
166 out.member_id = if flex {
167 get_compact_nullable_string_borrowed(buf)?
168 } else {
169 get_nullable_string_borrowed(buf)?
170 };
171 }
172 if version >= 0 {
173 out.share_session_epoch = get_i32(buf)?;
174 }
175 if version >= 2 {
176 out.is_renew_ack = get_bool(buf)?;
177 }
178 if version >= 0 {
179 out.topics = {
180 let n = get_array_len(buf, flex)?;
181 let mut v = Vec::with_capacity(n);
182 for _ in 0..n {
183 v.push(AcknowledgeTopic::decode_borrow(buf, version)?);
184 }
185 v
186 };
187 }
188 if flex {
189 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
190 }
191 Ok(out)
192 }
193}
194#[cfg(test)]
195impl ShareAcknowledgeRequest<'_> {
196 #[must_use]
197 pub fn populated(version: i16) -> Self {
198 let mut m = Self::default();
199 if version >= 0 {
200 m.group_id = Some("x");
201 }
202 if version >= 0 {
203 m.member_id = Some("x");
204 }
205 if version >= 0 {
206 m.share_session_epoch = 1i32;
207 }
208 if version >= 2 {
209 m.is_renew_ack = true;
210 }
211 if version >= 0 {
212 m.topics = vec![AcknowledgeTopic::populated(version)];
213 }
214 m
215 }
216}
217#[derive(Debug, Clone, PartialEq, Eq, Default)]
218pub struct AcknowledgeTopic {
219 pub topic_id: Uuid,
220 pub partitions: Vec<AcknowledgePartition>,
221 pub unknown_tagged_fields: UnknownTaggedFields,
222}
223impl AcknowledgeTopic {
224 #[must_use]
225 pub fn to_owned(&self) -> share_acknowledge_request::AcknowledgeTopic {
226 share_acknowledge_request::AcknowledgeTopic {
227 topic_id: (self.topic_id),
228 partitions: (self.partitions)
229 .iter()
230 .map(AcknowledgePartition::to_owned)
231 .collect(),
232 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
233 }
234 }
235}
236impl Encode for AcknowledgeTopic {
237 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
238 let flex = version >= 0;
239 if version >= 0 {
240 put_uuid(buf, self.topic_id);
241 }
242 if version >= 0 {
243 {
244 put_array_len(buf, (self.partitions).len(), flex)?;
245 for it in &self.partitions {
246 it.encode(buf, version)?;
247 }
248 }
249 }
250 if flex {
251 let tagged = WriteTaggedFields::new();
252 tagged.write(buf, &self.unknown_tagged_fields)?;
253 }
254 Ok(())
255 }
256 fn encoded_len(&self, version: i16) -> usize {
257 let flex = version >= 0;
258 let mut n: usize = 0;
259 if version >= 0 {
260 n += 16;
261 }
262 if version >= 0 {
263 n += {
264 let prefix = array_len_prefix_len((self.partitions).len(), flex);
265 let body: usize = (self.partitions)
266 .iter()
267 .map(|it| it.encoded_len(version))
268 .sum();
269 prefix + body
270 };
271 }
272 if flex {
273 let known_pairs: Vec<(u32, usize)> = Vec::new();
274 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
275 }
276 n
277 }
278}
279impl<'de> DecodeBorrow<'de> for AcknowledgeTopic {
280 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
281 let flex = version >= 0;
282 let mut out = Self::default();
283 if version >= 0 {
284 out.topic_id = get_uuid(buf)?;
285 }
286 if version >= 0 {
287 out.partitions = {
288 let n = get_array_len(buf, flex)?;
289 let mut v = Vec::with_capacity(n);
290 for _ in 0..n {
291 v.push(AcknowledgePartition::decode_borrow(buf, version)?);
292 }
293 v
294 };
295 }
296 if flex {
297 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
298 }
299 Ok(out)
300 }
301}
302#[cfg(test)]
303impl AcknowledgeTopic {
304 #[must_use]
305 pub fn populated(version: i16) -> Self {
306 let mut m = Self::default();
307 if version >= 0 {
308 m.topic_id = Uuid([1u8; 16]);
309 }
310 if version >= 0 {
311 m.partitions = vec![AcknowledgePartition::populated(version)];
312 }
313 m
314 }
315}
316#[derive(Debug, Clone, PartialEq, Eq, Default)]
317pub struct AcknowledgePartition {
318 pub partition_index: i32,
319 pub acknowledgement_batches: Vec<AcknowledgementBatch>,
320 pub unknown_tagged_fields: UnknownTaggedFields,
321}
322impl AcknowledgePartition {
323 #[must_use]
324 pub fn to_owned(&self) -> share_acknowledge_request::AcknowledgePartition {
325 share_acknowledge_request::AcknowledgePartition {
326 partition_index: (self.partition_index),
327 acknowledgement_batches: (self.acknowledgement_batches)
328 .iter()
329 .map(AcknowledgementBatch::to_owned)
330 .collect(),
331 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
332 }
333 }
334}
335impl Encode for AcknowledgePartition {
336 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
337 let flex = version >= 0;
338 if version >= 0 {
339 put_i32(buf, self.partition_index);
340 }
341 if version >= 0 {
342 {
343 put_array_len(buf, (self.acknowledgement_batches).len(), flex)?;
344 for it in &self.acknowledgement_batches {
345 it.encode(buf, version)?;
346 }
347 }
348 }
349 if flex {
350 let tagged = WriteTaggedFields::new();
351 tagged.write(buf, &self.unknown_tagged_fields)?;
352 }
353 Ok(())
354 }
355 fn encoded_len(&self, version: i16) -> usize {
356 let flex = version >= 0;
357 let mut n: usize = 0;
358 if version >= 0 {
359 n += 4;
360 }
361 if version >= 0 {
362 n += {
363 let prefix = array_len_prefix_len((self.acknowledgement_batches).len(), flex);
364 let body: usize = (self.acknowledgement_batches)
365 .iter()
366 .map(|it| it.encoded_len(version))
367 .sum();
368 prefix + body
369 };
370 }
371 if flex {
372 let known_pairs: Vec<(u32, usize)> = Vec::new();
373 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
374 }
375 n
376 }
377}
378impl<'de> DecodeBorrow<'de> for AcknowledgePartition {
379 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
380 let flex = version >= 0;
381 let mut out = Self::default();
382 if version >= 0 {
383 out.partition_index = get_i32(buf)?;
384 }
385 if version >= 0 {
386 out.acknowledgement_batches = {
387 let n = get_array_len(buf, flex)?;
388 let mut v = Vec::with_capacity(n);
389 for _ in 0..n {
390 v.push(AcknowledgementBatch::decode_borrow(buf, version)?);
391 }
392 v
393 };
394 }
395 if flex {
396 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
397 }
398 Ok(out)
399 }
400}
401#[cfg(test)]
402impl AcknowledgePartition {
403 #[must_use]
404 pub fn populated(version: i16) -> Self {
405 let mut m = Self::default();
406 if version >= 0 {
407 m.partition_index = 1i32;
408 }
409 if version >= 0 {
410 m.acknowledgement_batches = vec![AcknowledgementBatch::populated(version)];
411 }
412 m
413 }
414}
415#[derive(Debug, Clone, PartialEq, Eq, Default)]
416pub struct AcknowledgementBatch {
417 pub first_offset: i64,
418 pub last_offset: i64,
419 pub acknowledge_types: Vec<i8>,
420 pub unknown_tagged_fields: UnknownTaggedFields,
421}
422impl AcknowledgementBatch {
423 #[must_use]
424 pub fn to_owned(&self) -> share_acknowledge_request::AcknowledgementBatch {
425 share_acknowledge_request::AcknowledgementBatch {
426 first_offset: (self.first_offset),
427 last_offset: (self.last_offset),
428 acknowledge_types: (self.acknowledge_types).clone(),
429 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
430 }
431 }
432}
433impl Encode for AcknowledgementBatch {
434 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
435 let flex = version >= 0;
436 if version >= 0 {
437 put_i64(buf, self.first_offset);
438 }
439 if version >= 0 {
440 put_i64(buf, self.last_offset);
441 }
442 if version >= 0 {
443 {
444 put_array_len(buf, (self.acknowledge_types).len(), flex)?;
445 for it in &self.acknowledge_types {
446 put_i8(buf, *it);
447 }
448 }
449 }
450 if flex {
451 let tagged = WriteTaggedFields::new();
452 tagged.write(buf, &self.unknown_tagged_fields)?;
453 }
454 Ok(())
455 }
456 fn encoded_len(&self, version: i16) -> usize {
457 let flex = version >= 0;
458 let mut n: usize = 0;
459 if version >= 0 {
460 n += 8;
461 }
462 if version >= 0 {
463 n += 8;
464 }
465 if version >= 0 {
466 n += {
467 let prefix = array_len_prefix_len((self.acknowledge_types).len(), flex);
468 let body: usize = (self.acknowledge_types).iter().map(|_| 1).sum();
469 prefix + body
470 };
471 }
472 if flex {
473 let known_pairs: Vec<(u32, usize)> = Vec::new();
474 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
475 }
476 n
477 }
478}
479impl<'de> DecodeBorrow<'de> for AcknowledgementBatch {
480 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
481 let flex = version >= 0;
482 let mut out = Self::default();
483 if version >= 0 {
484 out.first_offset = get_i64(buf)?;
485 }
486 if version >= 0 {
487 out.last_offset = get_i64(buf)?;
488 }
489 if version >= 0 {
490 out.acknowledge_types = {
491 let n = get_array_len(buf, flex)?;
492 let mut v = Vec::with_capacity(n);
493 for _ in 0..n {
494 v.push(get_i8(buf)?);
495 }
496 v
497 };
498 }
499 if flex {
500 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
501 }
502 Ok(out)
503 }
504}
505#[cfg(test)]
506impl AcknowledgementBatch {
507 #[must_use]
508 pub fn populated(version: i16) -> Self {
509 let mut m = Self::default();
510 if version >= 0 {
511 m.first_offset = 1i64;
512 }
513 if version >= 0 {
514 m.last_offset = 1i64;
515 }
516 if version >= 0 {
517 m.acknowledge_types = vec![1i8];
518 }
519 m
520 }
521}