1use bytes::{BufMut, Bytes};
3
4use crate::{
5 DecodeBorrow, Encode, ProtocolError, UnknownTaggedFields,
6 primitives::{
7 fixed::{get_i16, get_i32, get_i64, put_i16, put_i32, put_i64},
8 string_bytes::{
9 compact_string_len, put_bytes, put_compact_bytes, put_compact_string, put_string,
10 string_len,
11 },
12 string_bytes_borrowed::{
13 get_bytes_borrowed, get_compact_bytes_borrowed, get_compact_string_borrowed,
14 get_string_borrowed,
15 },
16 },
17 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
18};
19pub const API_KEY: i16 = 38;
20pub const MIN_VERSION: i16 = 1;
21pub const MAX_VERSION: i16 = 3;
22pub const FLEXIBLE_MIN: i16 = 2;
23#[inline]
24#[must_use]
25pub fn is_flexible(version: i16) -> bool {
26 version >= FLEXIBLE_MIN
27}
28#[derive(Debug, Clone, PartialEq, Eq, Default)]
29pub struct CreateDelegationTokenResponse<'a> {
30 pub error_code: i16,
31 pub principal_type: &'a str,
32 pub principal_name: &'a str,
33 pub token_requester_principal_type: &'a str,
34 pub token_requester_principal_name: &'a str,
35 pub issue_timestamp_ms: i64,
36 pub expiry_timestamp_ms: i64,
37 pub max_timestamp_ms: i64,
38 pub token_id: &'a str,
39 pub hmac: &'a [u8],
40 pub throttle_time_ms: i32,
41 pub unknown_tagged_fields: UnknownTaggedFields,
42}
43impl<'a> CreateDelegationTokenResponse<'a> {
44 #[must_use]
48 pub fn to_owned(
49 &self,
50 ) -> crate::owned::create_delegation_token_response::CreateDelegationTokenResponse {
51 crate::owned::create_delegation_token_response::CreateDelegationTokenResponse {
52 error_code: (self.error_code),
53 principal_type: (self.principal_type).to_string(),
54 principal_name: (self.principal_name).to_string(),
55 token_requester_principal_type: (self.token_requester_principal_type).to_string(),
56 token_requester_principal_name: (self.token_requester_principal_name).to_string(),
57 issue_timestamp_ms: (self.issue_timestamp_ms),
58 expiry_timestamp_ms: (self.expiry_timestamp_ms),
59 max_timestamp_ms: (self.max_timestamp_ms),
60 token_id: (self.token_id).to_string(),
61 hmac: Bytes::copy_from_slice(self.hmac),
62 throttle_time_ms: (self.throttle_time_ms),
63 unknown_tagged_fields: self.unknown_tagged_fields.clone(),
64 }
65 }
66 fn encode_field_0<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
67 if version >= 0 {
68 put_i16(buf, self.error_code);
69 }
70 }
71 fn encode_field_1<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
72 if version >= 0 {
73 if flex {
74 let () = put_compact_string(buf, self.principal_type);
75 } else {
76 let () = put_string(buf, self.principal_type);
77 }
78 }
79 }
80 fn encode_field_2<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
81 if version >= 0 {
82 if flex {
83 let () = put_compact_string(buf, self.principal_name);
84 } else {
85 let () = put_string(buf, self.principal_name);
86 }
87 }
88 }
89 fn encode_field_3<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
90 if version >= 3 {
91 if flex {
92 let () = put_compact_string(buf, self.token_requester_principal_type);
93 } else {
94 let () = put_string(buf, self.token_requester_principal_type);
95 }
96 }
97 }
98 fn encode_field_4<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
99 if version >= 3 {
100 if flex {
101 let () = put_compact_string(buf, self.token_requester_principal_name);
102 } else {
103 let () = put_string(buf, self.token_requester_principal_name);
104 }
105 }
106 }
107 fn encode_field_5<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
108 if version >= 0 {
109 put_i64(buf, self.issue_timestamp_ms);
110 }
111 }
112 fn encode_field_6<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
113 if version >= 0 {
114 put_i64(buf, self.expiry_timestamp_ms);
115 }
116 }
117 fn encode_field_7<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
118 if version >= 0 {
119 put_i64(buf, self.max_timestamp_ms);
120 }
121 }
122 fn encode_field_8<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
123 if version >= 0 {
124 if flex {
125 let () = put_compact_string(buf, self.token_id);
126 } else {
127 let () = put_string(buf, self.token_id);
128 }
129 }
130 }
131 fn encode_field_9<B: BufMut>(&self, buf: &mut B, version: i16, flex: bool) {
132 if version >= 0 {
133 if flex {
134 let () = put_compact_bytes(buf, self.hmac);
135 } else {
136 let () = put_bytes(buf, self.hmac);
137 }
138 }
139 }
140 fn encode_field_10<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
141 if version >= 0 {
142 put_i32(buf, self.throttle_time_ms);
143 }
144 }
145 fn encode_tagged_fields<B: BufMut>(&self, buf: &mut B, _version: i16, flex: bool) {
146 if flex {
147 let tagged = WriteTaggedFields::new();
148 tagged.write(buf, &self.unknown_tagged_fields);
149 }
150 }
151 fn decode_field_0(
152 out: &mut Self,
153 buf: &mut &'a [u8],
154 version: i16,
155 _flex: bool,
156 ) -> Result<(), ProtocolError> {
157 if version >= 0 {
158 out.error_code = get_i16(buf)?;
159 }
160 Ok(())
161 }
162 fn decode_field_1(
163 out: &mut Self,
164 buf: &mut &'a [u8],
165 version: i16,
166 flex: bool,
167 ) -> Result<(), ProtocolError> {
168 if version >= 0 {
169 out.principal_type = if flex {
170 get_compact_string_borrowed(buf)?
171 } else {
172 get_string_borrowed(buf)?
173 };
174 }
175 Ok(())
176 }
177 fn decode_field_2(
178 out: &mut Self,
179 buf: &mut &'a [u8],
180 version: i16,
181 flex: bool,
182 ) -> Result<(), ProtocolError> {
183 if version >= 0 {
184 out.principal_name = if flex {
185 get_compact_string_borrowed(buf)?
186 } else {
187 get_string_borrowed(buf)?
188 };
189 }
190 Ok(())
191 }
192 fn decode_field_3(
193 out: &mut Self,
194 buf: &mut &'a [u8],
195 version: i16,
196 flex: bool,
197 ) -> Result<(), ProtocolError> {
198 if version >= 3 {
199 out.token_requester_principal_type = if flex {
200 get_compact_string_borrowed(buf)?
201 } else {
202 get_string_borrowed(buf)?
203 };
204 }
205 Ok(())
206 }
207 fn decode_field_4(
208 out: &mut Self,
209 buf: &mut &'a [u8],
210 version: i16,
211 flex: bool,
212 ) -> Result<(), ProtocolError> {
213 if version >= 3 {
214 out.token_requester_principal_name = if flex {
215 get_compact_string_borrowed(buf)?
216 } else {
217 get_string_borrowed(buf)?
218 };
219 }
220 Ok(())
221 }
222 fn decode_field_5(
223 out: &mut Self,
224 buf: &mut &'a [u8],
225 version: i16,
226 _flex: bool,
227 ) -> Result<(), ProtocolError> {
228 if version >= 0 {
229 out.issue_timestamp_ms = get_i64(buf)?;
230 }
231 Ok(())
232 }
233 fn decode_field_6(
234 out: &mut Self,
235 buf: &mut &'a [u8],
236 version: i16,
237 _flex: bool,
238 ) -> Result<(), ProtocolError> {
239 if version >= 0 {
240 out.expiry_timestamp_ms = get_i64(buf)?;
241 }
242 Ok(())
243 }
244 fn decode_field_7(
245 out: &mut Self,
246 buf: &mut &'a [u8],
247 version: i16,
248 _flex: bool,
249 ) -> Result<(), ProtocolError> {
250 if version >= 0 {
251 out.max_timestamp_ms = get_i64(buf)?;
252 }
253 Ok(())
254 }
255 fn decode_field_8(
256 out: &mut Self,
257 buf: &mut &'a [u8],
258 version: i16,
259 flex: bool,
260 ) -> Result<(), ProtocolError> {
261 if version >= 0 {
262 out.token_id = if flex {
263 get_compact_string_borrowed(buf)?
264 } else {
265 get_string_borrowed(buf)?
266 };
267 }
268 Ok(())
269 }
270 fn decode_field_9(
271 out: &mut Self,
272 buf: &mut &'a [u8],
273 version: i16,
274 flex: bool,
275 ) -> Result<(), ProtocolError> {
276 if version >= 0 {
277 out.hmac = if flex {
278 get_compact_bytes_borrowed(buf)?
279 } else {
280 get_bytes_borrowed(buf)?
281 };
282 }
283 Ok(())
284 }
285 fn decode_field_10(
286 out: &mut Self,
287 buf: &mut &'a [u8],
288 version: i16,
289 _flex: bool,
290 ) -> Result<(), ProtocolError> {
291 if version >= 0 {
292 out.throttle_time_ms = get_i32(buf)?;
293 }
294 Ok(())
295 }
296 fn decode_tagged_fields(
297 out: &mut Self,
298 buf: &mut &'a [u8],
299 _version: i16,
300 flex: bool,
301 ) -> Result<(), ProtocolError> {
302 if flex {
303 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
304 }
305 Ok(())
306 }
307}
308impl Encode for CreateDelegationTokenResponse<'_> {
309 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
310 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
311 return Err(ProtocolError::UnsupportedVersion {
312 api_key: API_KEY,
313 version,
314 });
315 }
316 let flex = is_flexible(version);
317 self.encode_field_0(buf, version, flex);
318 self.encode_field_1(buf, version, flex);
319 self.encode_field_2(buf, version, flex);
320 self.encode_field_3(buf, version, flex);
321 self.encode_field_4(buf, version, flex);
322 self.encode_field_5(buf, version, flex);
323 self.encode_field_6(buf, version, flex);
324 self.encode_field_7(buf, version, flex);
325 self.encode_field_8(buf, version, flex);
326 self.encode_field_9(buf, version, flex);
327 self.encode_field_10(buf, version, flex);
328 self.encode_tagged_fields(buf, version, flex);
329 Ok(())
330 }
331 fn encoded_len(&self, version: i16) -> usize {
332 let flex = is_flexible(version);
333 let mut n: usize = 0;
334 if version >= 0 {
335 n += 2;
336 }
337 if version >= 0 {
338 n += if flex {
339 compact_string_len(self.principal_type)
340 } else {
341 string_len(self.principal_type)
342 };
343 }
344 if version >= 0 {
345 n += if flex {
346 compact_string_len(self.principal_name)
347 } else {
348 string_len(self.principal_name)
349 };
350 }
351 if version >= 3 {
352 n += if flex {
353 compact_string_len(self.token_requester_principal_type)
354 } else {
355 string_len(self.token_requester_principal_type)
356 };
357 }
358 if version >= 3 {
359 n += if flex {
360 compact_string_len(self.token_requester_principal_name)
361 } else {
362 string_len(self.token_requester_principal_name)
363 };
364 }
365 if version >= 0 {
366 n += 8;
367 }
368 if version >= 0 {
369 n += 8;
370 }
371 if version >= 0 {
372 n += 8;
373 }
374 if version >= 0 {
375 n += if flex {
376 compact_string_len(self.token_id)
377 } else {
378 string_len(self.token_id)
379 };
380 }
381 if version >= 0 {
382 n += if flex {
383 crate::primitives::varint::uvarint_len(
384 u32::try_from((self.hmac).len() + 1).unwrap(),
385 ) + (self.hmac).len()
386 } else {
387 4 + (self.hmac).len()
388 };
389 }
390 if version >= 0 {
391 n += 4;
392 }
393 if flex {
394 let known_pairs: Vec<(u32, usize)> = Vec::new();
395 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
396 }
397 n
398 }
399}
400impl<'de> DecodeBorrow<'de> for CreateDelegationTokenResponse<'de> {
401 fn decode_borrow(buf: &mut &'de [u8], version: i16) -> Result<Self, ProtocolError> {
402 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
403 return Err(ProtocolError::UnsupportedVersion {
404 api_key: API_KEY,
405 version,
406 });
407 }
408 let flex = is_flexible(version);
409 let mut out = Self::default();
410 Self::decode_field_0(&mut out, buf, version, flex)?;
411 Self::decode_field_1(&mut out, buf, version, flex)?;
412 Self::decode_field_2(&mut out, buf, version, flex)?;
413 Self::decode_field_3(&mut out, buf, version, flex)?;
414 Self::decode_field_4(&mut out, buf, version, flex)?;
415 Self::decode_field_5(&mut out, buf, version, flex)?;
416 Self::decode_field_6(&mut out, buf, version, flex)?;
417 Self::decode_field_7(&mut out, buf, version, flex)?;
418 Self::decode_field_8(&mut out, buf, version, flex)?;
419 Self::decode_field_9(&mut out, buf, version, flex)?;
420 Self::decode_field_10(&mut out, buf, version, flex)?;
421 Self::decode_tagged_fields(&mut out, buf, version, flex)?;
422 Ok(out)
423 }
424}
425#[cfg(test)]
426impl CreateDelegationTokenResponse<'_> {
427 #[must_use]
428 pub fn populated(version: i16) -> Self {
429 let mut m = Self::default();
430 if version >= 0 {
431 m.error_code = 1i16;
432 }
433 if version >= 0 {
434 m.principal_type = "x";
435 }
436 if version >= 0 {
437 m.principal_name = "x";
438 }
439 if version >= 3 {
440 m.token_requester_principal_type = "x";
441 }
442 if version >= 3 {
443 m.token_requester_principal_name = "x";
444 }
445 if version >= 0 {
446 m.issue_timestamp_ms = 1i64;
447 }
448 if version >= 0 {
449 m.expiry_timestamp_ms = 1i64;
450 }
451 if version >= 0 {
452 m.max_timestamp_ms = 1i64;
453 }
454 if version >= 0 {
455 m.token_id = "x";
456 }
457 if version >= 0 {
458 m.hmac = &b"x"[..];
459 }
460 if version >= 0 {
461 m.throttle_time_ms = 1i32;
462 }
463 m
464 }
465}