1use bytes::{Buf, BufMut};
4
5use crate::{
6 Decode, Encode, ProtocolError, UnknownTaggedFields,
7 primitives::{
8 fixed::{get_i8, put_i8},
9 string_bytes::{
10 compact_string_len, get_compact_string_owned, get_string_owned, put_compact_string,
11 put_string, string_len,
12 },
13 uuid::{Uuid, get_uuid, put_uuid},
14 },
15 tagged_fields::{WriteTaggedFields, read_tagged_fields, tagged_fields_len},
16};
17pub const MIN_VERSION: i16 = 0;
18pub const MAX_VERSION: i16 = 0;
19pub const FLEXIBLE_MIN: i16 = 0;
20#[inline]
21#[must_use]
22pub fn is_flexible(version: i16) -> bool {
23 version >= FLEXIBLE_MIN
24}
25#[derive(Debug, Clone, PartialEq, Eq, Default)]
26pub struct AccessControlEntryRecord {
27 pub id: Uuid,
28 pub resource_type: i8,
29 pub resource_name: String,
30 pub pattern_type: i8,
31 pub principal: String,
32 pub host: String,
33 pub operation: i8,
34 pub permission_type: i8,
35 pub unknown_tagged_fields: UnknownTaggedFields,
36}
37impl AccessControlEntryRecord {
38 fn encode_field_0<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
39 if version >= 0 {
40 put_uuid(buf, self.id);
41 }
42 }
43 fn encode_field_1<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
44 if version >= 0 {
45 put_i8(buf, self.resource_type);
46 }
47 }
48 fn encode_field_2<B: BufMut>(
49 &self,
50 buf: &mut B,
51 version: i16,
52 flex: bool,
53 ) -> Result<(), ProtocolError> {
54 if version >= 0 {
55 if flex {
56 put_compact_string(buf, &self.resource_name)?;
57 } else {
58 put_string(buf, &self.resource_name)?;
59 }
60 }
61 Ok(())
62 }
63 fn encode_field_3<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
64 if version >= 0 {
65 put_i8(buf, self.pattern_type);
66 }
67 }
68 fn encode_field_4<B: BufMut>(
69 &self,
70 buf: &mut B,
71 version: i16,
72 flex: bool,
73 ) -> Result<(), ProtocolError> {
74 if version >= 0 {
75 if flex {
76 put_compact_string(buf, &self.principal)?;
77 } else {
78 put_string(buf, &self.principal)?;
79 }
80 }
81 Ok(())
82 }
83 fn encode_field_5<B: BufMut>(
84 &self,
85 buf: &mut B,
86 version: i16,
87 flex: bool,
88 ) -> Result<(), ProtocolError> {
89 if version >= 0 {
90 if flex {
91 put_compact_string(buf, &self.host)?;
92 } else {
93 put_string(buf, &self.host)?;
94 }
95 }
96 Ok(())
97 }
98 fn encode_field_6<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
99 if version >= 0 {
100 put_i8(buf, self.operation);
101 }
102 }
103 fn encode_field_7<B: BufMut>(&self, buf: &mut B, version: i16, _flex: bool) {
104 if version >= 0 {
105 put_i8(buf, self.permission_type);
106 }
107 }
108 fn encode_tagged_fields<B: BufMut>(
109 &self,
110 buf: &mut B,
111 _version: i16,
112 flex: bool,
113 ) -> Result<(), ProtocolError> {
114 if flex {
115 let tagged = WriteTaggedFields::new();
116 tagged.write(buf, &self.unknown_tagged_fields)?;
117 }
118 Ok(())
119 }
120 fn decode_field_0<B: Buf>(
121 out: &mut Self,
122 buf: &mut B,
123 version: i16,
124 _flex: bool,
125 ) -> Result<(), ProtocolError> {
126 if version >= 0 {
127 out.id = get_uuid(buf)?;
128 }
129 Ok(())
130 }
131 fn decode_field_1<B: Buf>(
132 out: &mut Self,
133 buf: &mut B,
134 version: i16,
135 _flex: bool,
136 ) -> Result<(), ProtocolError> {
137 if version >= 0 {
138 out.resource_type = get_i8(buf)?;
139 }
140 Ok(())
141 }
142 fn decode_field_2<B: Buf>(
143 out: &mut Self,
144 buf: &mut B,
145 version: i16,
146 flex: bool,
147 ) -> Result<(), ProtocolError> {
148 if version >= 0 {
149 out.resource_name = if flex {
150 get_compact_string_owned(buf)?
151 } else {
152 get_string_owned(buf)?
153 };
154 }
155 Ok(())
156 }
157 fn decode_field_3<B: Buf>(
158 out: &mut Self,
159 buf: &mut B,
160 version: i16,
161 _flex: bool,
162 ) -> Result<(), ProtocolError> {
163 if version >= 0 {
164 out.pattern_type = get_i8(buf)?;
165 }
166 Ok(())
167 }
168 fn decode_field_4<B: Buf>(
169 out: &mut Self,
170 buf: &mut B,
171 version: i16,
172 flex: bool,
173 ) -> Result<(), ProtocolError> {
174 if version >= 0 {
175 out.principal = if flex {
176 get_compact_string_owned(buf)?
177 } else {
178 get_string_owned(buf)?
179 };
180 }
181 Ok(())
182 }
183 fn decode_field_5<B: Buf>(
184 out: &mut Self,
185 buf: &mut B,
186 version: i16,
187 flex: bool,
188 ) -> Result<(), ProtocolError> {
189 if version >= 0 {
190 out.host = if flex {
191 get_compact_string_owned(buf)?
192 } else {
193 get_string_owned(buf)?
194 };
195 }
196 Ok(())
197 }
198 fn decode_field_6<B: Buf>(
199 out: &mut Self,
200 buf: &mut B,
201 version: i16,
202 _flex: bool,
203 ) -> Result<(), ProtocolError> {
204 if version >= 0 {
205 out.operation = get_i8(buf)?;
206 }
207 Ok(())
208 }
209 fn decode_field_7<B: Buf>(
210 out: &mut Self,
211 buf: &mut B,
212 version: i16,
213 _flex: bool,
214 ) -> Result<(), ProtocolError> {
215 if version >= 0 {
216 out.permission_type = get_i8(buf)?;
217 }
218 Ok(())
219 }
220 fn decode_tagged_fields<B: Buf>(
221 out: &mut Self,
222 buf: &mut B,
223 _version: i16,
224 flex: bool,
225 ) -> Result<(), ProtocolError> {
226 if flex {
227 out.unknown_tagged_fields = read_tagged_fields(buf, |_tag, _payload| Ok(false))?;
228 }
229 Ok(())
230 }
231}
232impl Encode for AccessControlEntryRecord {
233 fn encode<B: BufMut>(&self, buf: &mut B, version: i16) -> Result<(), ProtocolError> {
234 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
235 return Err(ProtocolError::SchemaMismatch(
236 "AccessControlEntryRecord version out of range",
237 ));
238 }
239 let flex = is_flexible(version);
240 self.encode_field_0(buf, version, flex);
241 self.encode_field_1(buf, version, flex);
242 self.encode_field_2(buf, version, flex)?;
243 self.encode_field_3(buf, version, flex);
244 self.encode_field_4(buf, version, flex)?;
245 self.encode_field_5(buf, version, flex)?;
246 self.encode_field_6(buf, version, flex);
247 self.encode_field_7(buf, version, flex);
248 self.encode_tagged_fields(buf, version, flex)?;
249 Ok(())
250 }
251 fn encoded_len(&self, version: i16) -> usize {
252 let flex = is_flexible(version);
253 let mut n: usize = 0;
254 if version >= 0 {
255 n += 16;
256 }
257 if version >= 0 {
258 n += 1;
259 }
260 if version >= 0 {
261 n += if flex {
262 compact_string_len(&self.resource_name)
263 } else {
264 string_len(&self.resource_name)
265 };
266 }
267 if version >= 0 {
268 n += 1;
269 }
270 if version >= 0 {
271 n += if flex {
272 compact_string_len(&self.principal)
273 } else {
274 string_len(&self.principal)
275 };
276 }
277 if version >= 0 {
278 n += if flex {
279 compact_string_len(&self.host)
280 } else {
281 string_len(&self.host)
282 };
283 }
284 if version >= 0 {
285 n += 1;
286 }
287 if version >= 0 {
288 n += 1;
289 }
290 if flex {
291 let known_pairs: Vec<(u32, usize)> = Vec::new();
292 n += tagged_fields_len(&known_pairs, &self.unknown_tagged_fields);
293 }
294 n
295 }
296}
297impl Decode<'_> for AccessControlEntryRecord {
298 fn decode<B: Buf>(buf: &mut B, version: i16) -> Result<Self, ProtocolError> {
299 if !(MIN_VERSION..=MAX_VERSION).contains(&version) {
300 return Err(ProtocolError::SchemaMismatch(
301 "AccessControlEntryRecord version out of range",
302 ));
303 }
304 let flex = is_flexible(version);
305 let mut out = Self::default();
306 Self::decode_field_0(&mut out, buf, version, flex)?;
307 Self::decode_field_1(&mut out, buf, version, flex)?;
308 Self::decode_field_2(&mut out, buf, version, flex)?;
309 Self::decode_field_3(&mut out, buf, version, flex)?;
310 Self::decode_field_4(&mut out, buf, version, flex)?;
311 Self::decode_field_5(&mut out, buf, version, flex)?;
312 Self::decode_field_6(&mut out, buf, version, flex)?;
313 Self::decode_field_7(&mut out, buf, version, flex)?;
314 Self::decode_tagged_fields(&mut out, buf, version, flex)?;
315 Ok(out)
316 }
317}
318#[cfg(test)]
319impl AccessControlEntryRecord {
320 #[must_use]
321 pub fn populated(version: i16) -> Self {
322 let mut m = Self::default();
323 if version >= 0 {
324 m.id = Uuid([1u8; 16]);
325 }
326 if version >= 0 {
327 m.resource_type = 1i8;
328 }
329 if version >= 0 {
330 m.resource_name = "x".to_owned();
331 }
332 if version >= 0 {
333 m.pattern_type = 1i8;
334 }
335 if version >= 0 {
336 m.principal = "x".to_owned();
337 }
338 if version >= 0 {
339 m.host = "x".to_owned();
340 }
341 if version >= 0 {
342 m.operation = 1i8;
343 }
344 if version >= 0 {
345 m.permission_type = 1i8;
346 }
347 m
348 }
349}
350#[must_use]
353#[allow(unused_comparisons)]
354pub fn default_json(_version: i16) -> ::serde_json::Value {
355 let mut obj = ::serde_json::Map::new();
356 obj.insert(
357 "id".to_owned(),
358 ::serde_json::Value::String("AAAAAAAAAAAAAAAAAAAAAA".to_owned()),
359 );
360 obj.insert("resourceType".to_owned(), ::serde_json::json!(0));
361 obj.insert(
362 "resourceName".to_owned(),
363 ::serde_json::Value::String(String::new()),
364 );
365 obj.insert("patternType".to_owned(), ::serde_json::json!(0));
366 obj.insert(
367 "principal".to_owned(),
368 ::serde_json::Value::String(String::new()),
369 );
370 obj.insert(
371 "host".to_owned(),
372 ::serde_json::Value::String(String::new()),
373 );
374 obj.insert("operation".to_owned(), ::serde_json::json!(0));
375 obj.insert("permissionType".to_owned(), ::serde_json::json!(0));
376 ::serde_json::Value::Object(obj)
377}