1use bytes::{BufMut, Bytes};
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 owned::describe_delegation_token_response,
7 primitives::{
8 array::{array_len_prefix_len, get_array_len, put_array_len},
9 fixed::{get_i16, get_i32, get_i64, put_i16, put_i32, put_i64},
10 string_bytes::{
11 bytes_len, compact_bytes_len, compact_string_len, put_bytes, put_compact_bytes,
12 put_compact_string, put_string, string_len,
13 },
14 string_bytes_borrowed::{
15 get_bytes_borrowed, get_compact_bytes_borrowed, get_compact_string_borrowed,
16 get_string_borrowed,
17 },
18 },
19 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
20};
21pub const API_KEY: i16 = 41;
22pub const MIN_VERSION: i16 = 1;
23pub const MAX_VERSION: i16 = 3;
24pub const FLEXIBLE_MIN: i16 = 2;
25#[inline]
26#[must_use]
27pub fn is_flexible(version: i16) -> bool {
28 version >= FLEXIBLE_MIN
29}
30#[derive(Debug, Clone, PartialEq, Eq, Default)]
31pub struct DescribeDelegationTokenResponse<'a> {
32 pub error_code: i16,
33 pub tokens: Vec<DescribedDelegationToken<'a>>,
34 pub throttle_time_ms: i32,
35 pub unknown_tagged_fields: UnknownTaggedFields,
36}
37impl DescribeDelegationTokenResponse<'_> {
38 #[must_use]
39 pub fn to_owned(&self) -> describe_delegation_token_response::DescribeDelegationTokenResponse {
40 describe_delegation_token_response::DescribeDelegationTokenResponse {
41 error_code: (self.error_code),
42 tokens: (self.tokens)
43 .iter()
44 .map(DescribedDelegationToken::to_owned)
45 .collect(),
46 throttle_time_ms: (self.throttle_time_ms),
47 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
48 }
49 }
50}
51impl Encode for DescribeDelegationTokenResponse<'_> {
52 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
53 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
54 return Err(ProtocolError::UnsupportedVersion {
55 api_key: API_KEY,
56 version,
57 });
58 }
59 let flex = is_flexible(version);
60 if version >= 0 {
61 put_i16(buf, self.error_code);
62 }
63 if version >= 0 {
64 {
65 put_array_len(buf, (self.tokens).len(), flex)?;
66 for it in &self.tokens {
67 it.encode(buf, version)?;
68 }
69 }
70 }
71 if version >= 0 {
72 put_i32(buf, self.throttle_time_ms);
73 }
74 if flex {
75 let tagged = WriteTaggedFields::new();
76 tagged.write(buf, &self.unknown_tagged_fields)?;
77 }
78 Ok(())
79 }
80 fn encoded_len(&self, version: i16) -> usize {
81 let flex = is_flexible(version);
82 let mut n: usize = 0;
83 if version >= 0 {
84 n += 2;
85 }
86 if version >= 0 {
87 n += {
88 let prefix = array_len_prefix_len((self.tokens).len(), flex);
89 let body: usize = (self.tokens).iter().map(|it| it.encoded_len(version)).sum();
90 prefix + body
91 };
92 }
93 if version >= 0 {
94 n += 4;
95 }
96 if flex {
97 let known_pairs: Vec<(u32, usize)> = Vec::new();
98 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
99 }
100 n
101 }
102}
103impl<'de> DecodeBorrow<'de> for DescribeDelegationTokenResponse<'de> {
104 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
105 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
106 return Err(ProtocolError::UnsupportedVersion {
107 api_key: API_KEY,
108 version,
109 });
110 }
111 let flex = is_flexible(version);
112 let mut out = Self::default();
113 if version >= 0 {
114 out.error_code = get_i16(buf)?;
115 }
116 if version >= 0 {
117 out.tokens = {
118 let n = get_array_len(buf, flex)?;
119 let mut v = Vec::with_capacity(n);
120 for _ in 0..n {
121 v.push(DescribedDelegationToken::decode_borrow(buf, version)?);
122 }
123 v
124 };
125 }
126 if version >= 0 {
127 out.throttle_time_ms = get_i32(buf)?;
128 }
129 if flex {
130 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
131 }
132 Ok(out)
133 }
134}
135#[cfg(test)]
136impl DescribeDelegationTokenResponse<'_> {
137 #[must_use]
138 pub fn populated(version: i16) -> Self {
139 let mut m = Self::default();
140 if version >= 0 {
141 m.error_code = 1i16;
142 }
143 if version >= 0 {
144 m.tokens = vec![DescribedDelegationToken::populated(version)];
145 }
146 if version >= 0 {
147 m.throttle_time_ms = 1i32;
148 }
149 m
150 }
151}
152#[derive(Debug, Clone, PartialEq, Eq, Default)]
153pub struct DescribedDelegationToken<'a> {
154 pub principal_type: &'a str,
155 pub principal_name: &'a str,
156 pub token_requester_principal_type: &'a str,
157 pub token_requester_principal_name: &'a str,
158 pub issue_timestamp: i64,
159 pub expiry_timestamp: i64,
160 pub max_timestamp: i64,
161 pub token_id: &'a str,
162 pub hmac: &'a [u8],
163 pub renewers: Vec<DescribedDelegationTokenRenewer<'a>>,
164 pub unknown_tagged_fields: UnknownTaggedFields,
165}
166impl<'a> DescribedDelegationToken<'a> {
167 #[must_use]
168 pub fn to_owned(&self) -> describe_delegation_token_response::DescribedDelegationToken {
169 describe_delegation_token_response::DescribedDelegationToken {
170 principal_type: (self.principal_type).to_owned(),
171 principal_name: (self.principal_name).to_owned(),
172 token_requester_principal_type: (self.token_requester_principal_type).to_owned(),
173 token_requester_principal_name: (self.token_requester_principal_name).to_owned(),
174 issue_timestamp: (self.issue_timestamp),
175 expiry_timestamp: (self.expiry_timestamp),
176 max_timestamp: (self.max_timestamp),
177 token_id: (self.token_id).to_owned(),
178 hmac: Bytes::copy_from_slice(self.hmac),
179 renewers: (self.renewers)
180 .iter()
181 .map(DescribedDelegationTokenRenewer::to_owned)
182 .collect(),
183 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
184 }
185 }
186 fn encode_field_0<B: BufMut>(
187 &self,
188 buf: &mut B,
189 version: i16,
190 flex: bool,
191 ) -> Result<(), ProtocolError> {
192 if version >= 0 {
193 if flex {
194 put_compact_string(buf, self.principal_type)?;
195 } else {
196 put_string(buf, self.principal_type)?;
197 }
198 }
199 Ok(())
200 }
201 fn encode_field_1<B: BufMut>(
202 &self,
203 buf: &mut B,
204 version: i16,
205 flex: bool,
206 ) -> Result<(), ProtocolError> {
207 if version >= 0 {
208 if flex {
209 put_compact_string(buf, self.principal_name)?;
210 } else {
211 put_string(buf, self.principal_name)?;
212 }
213 }
214 Ok(())
215 }
216 fn encode_field_2<B: BufMut>(
217 &self,
218 buf: &mut B,
219 version: i16,
220 flex: bool,
221 ) -> Result<(), ProtocolError> {
222 if version >= 3 {
223 if flex {
224 put_compact_string(buf, self.token_requester_principal_type)?;
225 } else {
226 put_string(buf, self.token_requester_principal_type)?;
227 }
228 }
229 Ok(())
230 }
231 fn encode_field_3<B: BufMut>(
232 &self,
233 buf: &mut B,
234 version: i16,
235 flex: bool,
236 ) -> Result<(), ProtocolError> {
237 if version >= 3 {
238 if flex {
239 put_compact_string(buf, self.token_requester_principal_name)?;
240 } else {
241 put_string(buf, self.token_requester_principal_name)?;
242 }
243 }
244 Ok(())
245 }
246 fn encode_field_4<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
247 if version >= 0 {
248 put_i64(buf, self.issue_timestamp);
249 }
250 }
251 fn encode_field_5<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
252 if version >= 0 {
253 put_i64(buf, self.expiry_timestamp);
254 }
255 }
256 fn encode_field_6<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
257 if version >= 0 {
258 put_i64(buf, self.max_timestamp);
259 }
260 }
261 fn encode_field_7<B: BufMut>(
262 &self,
263 buf: &mut B,
264 version: i16,
265 flex: bool,
266 ) -> Result<(), ProtocolError> {
267 if version >= 0 {
268 if flex {
269 put_compact_string(buf, self.token_id)?;
270 } else {
271 put_string(buf, self.token_id)?;
272 }
273 }
274 Ok(())
275 }
276 fn encode_field_8<B: BufMut>(
277 &self,
278 buf: &mut B,
279 version: i16,
280 flex: bool,
281 ) -> Result<(), ProtocolError> {
282 if version >= 0 {
283 if flex {
284 put_compact_bytes(buf, self.hmac)?;
285 } else {
286 put_bytes(buf, self.hmac)?;
287 }
288 }
289 Ok(())
290 }
291 fn encode_field_9<B: BufMut>(
292 &self,
293 buf: &mut B,
294 version: i16,
295 flex: bool,
296 ) -> Result<(), ProtocolError> {
297 if version >= 0 {
298 {
299 put_array_len(buf, (self.renewers).len(), flex)?;
300 for it in &self.renewers {
301 it.encode(buf, version)?;
302 }
303 }
304 }
305 Ok(())
306 }
307 fn encode_tagged_fields<B: BufMut>(
308 &self,
309 buf: &mut B,
310 _version: i16,
311 flex: bool,
312 ) -> Result<(), ProtocolError> {
313 if flex {
314 let tagged = WriteTaggedFields::new();
315 tagged.write(buf, &self.unknown_tagged_fields)?;
316 }
317 Ok(())
318 }
319 fn decode_field_0(
320 out: &mut Self,
321 buf: &mut &'a [u8],
322 version: i16,
323 flex: bool,
324 ) -> Result<(), ProtocolError> {
325 if version >= 0 {
326 out.principal_type = if flex {
327 get_compact_string_borrowed(buf)?
328 } else {
329 get_string_borrowed(buf)?
330 };
331 }
332 Ok(())
333 }
334 fn decode_field_1(
335 out: &mut Self,
336 buf: &mut &'a [u8],
337 version: i16,
338 flex: bool,
339 ) -> Result<(), ProtocolError> {
340 if version >= 0 {
341 out.principal_name = if flex {
342 get_compact_string_borrowed(buf)?
343 } else {
344 get_string_borrowed(buf)?
345 };
346 }
347 Ok(())
348 }
349 fn decode_field_2(
350 out: &mut Self,
351 buf: &mut &'a [u8],
352 version: i16,
353 flex: bool,
354 ) -> Result<(), ProtocolError> {
355 if version >= 3 {
356 out.token_requester_principal_type = if flex {
357 get_compact_string_borrowed(buf)?
358 } else {
359 get_string_borrowed(buf)?
360 };
361 }
362 Ok(())
363 }
364 fn decode_field_3(
365 out: &mut Self,
366 buf: &mut &'a [u8],
367 version: i16,
368 flex: bool,
369 ) -> Result<(), ProtocolError> {
370 if version >= 3 {
371 out.token_requester_principal_name = if flex {
372 get_compact_string_borrowed(buf)?
373 } else {
374 get_string_borrowed(buf)?
375 };
376 }
377 Ok(())
378 }
379 fn decode_field_4(
380 out: &mut Self,
381 buf: &mut &'a [u8],
382 version: i16,
383 _flex: bool,
384 ) -> Result<(), ProtocolError> {
385 if version >= 0 {
386 out.issue_timestamp = get_i64(buf)?;
387 }
388 Ok(())
389 }
390 fn decode_field_5(
391 out: &mut Self,
392 buf: &mut &'a [u8],
393 version: i16,
394 _flex: bool,
395 ) -> Result<(), ProtocolError> {
396 if version >= 0 {
397 out.expiry_timestamp = get_i64(buf)?;
398 }
399 Ok(())
400 }
401 fn decode_field_6(
402 out: &mut Self,
403 buf: &mut &'a [u8],
404 version: i16,
405 _flex: bool,
406 ) -> Result<(), ProtocolError> {
407 if version >= 0 {
408 out.max_timestamp = get_i64(buf)?;
409 }
410 Ok(())
411 }
412 fn decode_field_7(
413 out: &mut Self,
414 buf: &mut &'a [u8],
415 version: i16,
416 flex: bool,
417 ) -> Result<(), ProtocolError> {
418 if version >= 0 {
419 out.token_id = if flex {
420 get_compact_string_borrowed(buf)?
421 } else {
422 get_string_borrowed(buf)?
423 };
424 }
425 Ok(())
426 }
427 fn decode_field_8(
428 out: &mut Self,
429 buf: &mut &'a [u8],
430 version: i16,
431 flex: bool,
432 ) -> Result<(), ProtocolError> {
433 if version >= 0 {
434 out.hmac = if flex {
435 get_compact_bytes_borrowed(buf)?
436 } else {
437 get_bytes_borrowed(buf)?
438 };
439 }
440 Ok(())
441 }
442 fn decode_field_9(
443 out: &mut Self,
444 buf: &mut &'a [u8],
445 version: i16,
446 flex: bool,
447 ) -> Result<(), ProtocolError> {
448 if version >= 0 {
449 out.renewers = {
450 let n = get_array_len(buf, flex)?;
451 let mut v = Vec::with_capacity(n);
452 for _ in 0..n {
453 v.push(DescribedDelegationTokenRenewer::decode_borrow(
454 buf, version,
455 )?);
456 }
457 v
458 };
459 }
460 Ok(())
461 }
462 fn decode_tagged_fields(
463 out: &mut Self,
464 buf: &mut &'a [u8],
465 _version: i16,
466 flex: bool,
467 ) -> Result<(), ProtocolError> {
468 if flex {
469 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
470 }
471 Ok(())
472 }
473}
474impl Encode for DescribedDelegationToken<'_> {
475 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
476 let flex = version >= 2;
477 self.encode_field_0(buf, version, flex)?;
478 self.encode_field_1(buf, version, flex)?;
479 self.encode_field_2(buf, version, flex)?;
480 self.encode_field_3(buf, version, flex)?;
481 self.encode_field_4(buf, version, flex);
482 self.encode_field_5(buf, version, flex);
483 self.encode_field_6(buf, version, flex);
484 self.encode_field_7(buf, version, flex)?;
485 self.encode_field_8(buf, version, flex)?;
486 self.encode_field_9(buf, version, flex)?;
487 self.encode_tagged_fields(buf, version, flex)?;
488 Ok(())
489 }
490 fn encoded_len(&self, version: i16) -> usize {
491 let flex = version >= 2;
492 let mut n: usize = 0;
493 if version >= 0 {
494 n += if flex {
495 compact_string_len(self.principal_type)
496 } else {
497 string_len(self.principal_type)
498 };
499 }
500 if version >= 0 {
501 n += if flex {
502 compact_string_len(self.principal_name)
503 } else {
504 string_len(self.principal_name)
505 };
506 }
507 if version >= 3 {
508 n += if flex {
509 compact_string_len(self.token_requester_principal_type)
510 } else {
511 string_len(self.token_requester_principal_type)
512 };
513 }
514 if version >= 3 {
515 n += if flex {
516 compact_string_len(self.token_requester_principal_name)
517 } else {
518 string_len(self.token_requester_principal_name)
519 };
520 }
521 if version >= 0 {
522 n += 8;
523 }
524 if version >= 0 {
525 n += 8;
526 }
527 if version >= 0 {
528 n += 8;
529 }
530 if version >= 0 {
531 n += if flex {
532 compact_string_len(self.token_id)
533 } else {
534 string_len(self.token_id)
535 };
536 }
537 if version >= 0 {
538 n += if flex {
539 compact_bytes_len(self.hmac)
540 } else {
541 bytes_len(self.hmac)
542 };
543 }
544 if version >= 0 {
545 n += {
546 let prefix = array_len_prefix_len((self.renewers).len(), flex);
547 let body: usize = (self.renewers)
548 .iter()
549 .map(|it| it.encoded_len(version))
550 .sum();
551 prefix + body
552 };
553 }
554 if flex {
555 let known_pairs: Vec<(u32, usize)> = Vec::new();
556 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
557 }
558 n
559 }
560}
561impl<'de> DecodeBorrow<'de> for DescribedDelegationToken<'de> {
562 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
563 let flex = version >= 2;
564 let mut out = Self::default();
565 Self::decode_field_0(&mut out, buf, version, flex)?;
566 Self::decode_field_1(&mut out, buf, version, flex)?;
567 Self::decode_field_2(&mut out, buf, version, flex)?;
568 Self::decode_field_3(&mut out, buf, version, flex)?;
569 Self::decode_field_4(&mut out, buf, version, flex)?;
570 Self::decode_field_5(&mut out, buf, version, flex)?;
571 Self::decode_field_6(&mut out, buf, version, flex)?;
572 Self::decode_field_7(&mut out, buf, version, flex)?;
573 Self::decode_field_8(&mut out, buf, version, flex)?;
574 Self::decode_field_9(&mut out, buf, version, flex)?;
575 Self::decode_tagged_fields(&mut out, buf, version, flex)?;
576 Ok(out)
577 }
578}
579#[cfg(test)]
580impl DescribedDelegationToken<'_> {
581 #[must_use]
582 pub fn populated(version: i16) -> Self {
583 let mut m = Self::default();
584 if version >= 0 {
585 m.principal_type = "x";
586 }
587 if version >= 0 {
588 m.principal_name = "x";
589 }
590 if version >= 3 {
591 m.token_requester_principal_type = "x";
592 }
593 if version >= 3 {
594 m.token_requester_principal_name = "x";
595 }
596 if version >= 0 {
597 m.issue_timestamp = 1i64;
598 }
599 if version >= 0 {
600 m.expiry_timestamp = 1i64;
601 }
602 if version >= 0 {
603 m.max_timestamp = 1i64;
604 }
605 if version >= 0 {
606 m.token_id = "x";
607 }
608 if version >= 0 {
609 m.hmac = &b"x"[..];
610 }
611 if version >= 0 {
612 m.renewers = vec![DescribedDelegationTokenRenewer::populated(version)];
613 }
614 m
615 }
616}
617#[derive(Debug, Clone, PartialEq, Eq, Default)]
618pub struct DescribedDelegationTokenRenewer<'a> {
619 pub principal_type: &'a str,
620 pub principal_name: &'a str,
621 pub unknown_tagged_fields: UnknownTaggedFields,
622}
623impl DescribedDelegationTokenRenewer<'_> {
624 #[must_use]
625 pub fn to_owned(&self) -> describe_delegation_token_response::DescribedDelegationTokenRenewer {
626 describe_delegation_token_response::DescribedDelegationTokenRenewer {
627 principal_type: (self.principal_type).to_owned(),
628 principal_name: (self.principal_name).to_owned(),
629 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
630 }
631 }
632}
633impl Encode for DescribedDelegationTokenRenewer<'_> {
634 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
635 let flex = version >= 2;
636 if version >= 0 {
637 if flex {
638 put_compact_string(buf, self.principal_type)?;
639 } else {
640 put_string(buf, self.principal_type)?;
641 }
642 }
643 if version >= 0 {
644 if flex {
645 put_compact_string(buf, self.principal_name)?;
646 } else {
647 put_string(buf, self.principal_name)?;
648 }
649 }
650 if flex {
651 let tagged = WriteTaggedFields::new();
652 tagged.write(buf, &self.unknown_tagged_fields)?;
653 }
654 Ok(())
655 }
656 fn encoded_len(&self, version: i16) -> usize {
657 let flex = version >= 2;
658 let mut n: usize = 0;
659 if version >= 0 {
660 n += if flex {
661 compact_string_len(self.principal_type)
662 } else {
663 string_len(self.principal_type)
664 };
665 }
666 if version >= 0 {
667 n += if flex {
668 compact_string_len(self.principal_name)
669 } else {
670 string_len(self.principal_name)
671 };
672 }
673 if flex {
674 let known_pairs: Vec<(u32, usize)> = Vec::new();
675 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
676 }
677 n
678 }
679}
680impl<'de> DecodeBorrow<'de> for DescribedDelegationTokenRenewer<'de> {
681 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
682 let flex = version >= 2;
683 let mut out = Self::default();
684 if version >= 0 {
685 out.principal_type = if flex {
686 get_compact_string_borrowed(buf)?
687 } else {
688 get_string_borrowed(buf)?
689 };
690 }
691 if version >= 0 {
692 out.principal_name = if flex {
693 get_compact_string_borrowed(buf)?
694 } else {
695 get_string_borrowed(buf)?
696 };
697 }
698 if flex {
699 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
700 }
701 Ok(out)
702 }
703}
704#[cfg(test)]
705impl DescribedDelegationTokenRenewer<'_> {
706 #[must_use]
707 pub fn populated(version: i16) -> Self {
708 let mut m = Self::default();
709 if version >= 0 {
710 m.principal_type = "x";
711 }
712 if version >= 0 {
713 m.principal_name = "x";
714 }
715 m
716 }
717}