1use crate::{
6 error::RedisProtocolError,
7 int2dec,
8 resp3::{
9 types::*,
10 utils::{self as resp3_utils},
11 },
12 types::CRLF,
13};
14use alloc::string::{String, ToString};
15use cookie_factory::GenError;
16
17#[cfg(feature = "bytes")]
18use crate::utils;
19#[cfg(feature = "bytes")]
20use bytes::BytesMut;
21#[cfg(feature = "bytes")]
22use bytes_utils::Str;
23
24fn map_owned_auth(auth: &Option<(String, String)>) -> Option<(&str, &str)> {
25 auth.as_ref().map(|(u, p)| (u.as_str(), p.as_str()))
26}
27
28#[cfg(feature = "bytes")]
29fn map_bytes_auth(auth: &Option<(Str, Str)>) -> Option<(&str, &str)> {
30 auth.as_ref().map(|(u, p)| (&**u, &**p))
31}
32
33macro_rules! encode_attributes (
34 ($x:ident, $attributes:ident, $int_as_blobstring:expr) => {
35 if let Some(attributes) = $attributes {
36 let attributes: BorrowedAttrs = attributes.into();
37 $x = match attributes {
38 BorrowedAttrs::Owned(attrs) => gen_owned_attribute($x, attrs, $int_as_blobstring)?,
39 #[cfg(feature = "bytes")]
40 BorrowedAttrs::Bytes(attrs) => gen_bytes_attribute($x, attrs, $int_as_blobstring)?,
41 };
42 }
43 }
44);
45
46fn gen_simplestring<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
47 mut x: (&'a mut [u8], usize),
48 data: &[u8],
49 attributes: Option<A>,
50 int_as_blobstring: bool,
51) -> Result<(&'a mut [u8], usize), GenError> {
52 encode_attributes!(x, attributes, int_as_blobstring);
53
54 do_gen!(
55 x,
56 gen_be_u8!(FrameKind::SimpleString.to_byte()) >> gen_slice!(data) >> gen_slice!(CRLF.as_bytes())
57 )
58}
59
60fn gen_simpleerror<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
61 mut x: (&'a mut [u8], usize),
62 data: &str,
63 attributes: Option<A>,
64 int_as_blobstring: bool,
65) -> Result<(&'a mut [u8], usize), GenError> {
66 encode_attributes!(x, attributes, int_as_blobstring);
67
68 do_gen!(
69 x,
70 gen_be_u8!(FrameKind::SimpleError.to_byte()) >> gen_slice!(data.as_bytes()) >> gen_slice!(CRLF.as_bytes())
71 )
72}
73
74fn gen_number<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
75 mut x: (&'a mut [u8], usize),
76 data: i64,
77 attributes: Option<A>,
78 int_as_blobstring: bool,
79) -> Result<(&'a mut [u8], usize), GenError> {
80 encode_attributes!(x, attributes, int_as_blobstring);
81 let (buf, buf_padding) = int2dec::i64_to_digits(data);
82
83 if int_as_blobstring {
84 let encoded_len = buf.len() - buf_padding;
86 let (len, len_padding) = int2dec::u64_to_digits(encoded_len as u64);
87
88 do_gen!(
89 x,
90 gen_be_u8!(FrameKind::BlobString.to_byte())
91 >> gen_slice!(&len[len_padding ..])
92 >> gen_slice!(CRLF.as_bytes())
93 >> gen_slice!(&buf[buf_padding ..])
94 >> gen_slice!(CRLF.as_bytes())
95 )
96 } else {
97 do_gen!(
98 x,
99 gen_be_u8!(FrameKind::Number.to_byte()) >> gen_slice!(&buf[buf_padding ..]) >> gen_slice!(CRLF.as_bytes())
100 )
101 }
102}
103
104fn gen_null(x: (&mut [u8], usize)) -> Result<(&mut [u8], usize), GenError> {
105 do_gen!(x, gen_slice!(NULL.as_bytes()))
106}
107
108fn gen_double<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
109 mut x: (&'a mut [u8], usize),
110 data: f64,
111 attributes: Option<A>,
112 int_as_blobstring: bool,
113) -> Result<(&'a mut [u8], usize), GenError> {
114 encode_attributes!(x, attributes, int_as_blobstring);
115
116 let as_string = resp3_utils::f64_to_redis_string(data);
117 do_gen!(
118 x,
119 gen_be_u8!(FrameKind::Double.to_byte()) >> gen_slice!(as_string.as_bytes()) >> gen_slice!(CRLF.as_bytes())
120 )
121}
122
123fn gen_boolean<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
124 mut x: (&'a mut [u8], usize),
125 data: bool,
126 attributes: Option<A>,
127 int_as_blobstring: bool,
128) -> Result<(&'a mut [u8], usize), GenError> {
129 encode_attributes!(x, attributes, int_as_blobstring);
130
131 let data = if data { BOOL_TRUE_BYTES } else { BOOL_FALSE_BYTES };
132 do_gen!(x, gen_slice!(data.as_bytes()))
133}
134
135fn gen_bignumber<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
136 mut x: (&'a mut [u8], usize),
137 data: &[u8],
138 attributes: Option<A>,
139 int_as_blobstring: bool,
140) -> Result<(&'a mut [u8], usize), GenError> {
141 encode_attributes!(x, attributes, int_as_blobstring);
142
143 do_gen!(
144 x,
145 gen_be_u8!(FrameKind::BigNumber.to_byte()) >> gen_slice!(data) >> gen_slice!(CRLF.as_bytes())
146 )
147}
148
149fn gen_blobstring<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
150 mut x: (&'a mut [u8], usize),
151 data: &[u8],
152 attributes: Option<A>,
153 int_as_blobstring: bool,
154) -> Result<(&'a mut [u8], usize), GenError> {
155 encode_attributes!(x, attributes, int_as_blobstring);
156
157 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
158 do_gen!(
159 x,
160 gen_be_u8!(FrameKind::BlobString.to_byte())
161 >> gen_slice!(&len[padding ..])
162 >> gen_slice!(CRLF.as_bytes())
163 >> gen_slice!(data)
164 >> gen_slice!(CRLF.as_bytes())
165 )
166}
167
168fn gen_bloberror<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
169 mut x: (&'a mut [u8], usize),
170 data: &[u8],
171 attributes: Option<A>,
172 int_as_blobstring: bool,
173) -> Result<(&'a mut [u8], usize), GenError> {
174 encode_attributes!(x, attributes, int_as_blobstring);
175
176 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
177 do_gen!(
178 x,
179 gen_be_u8!(FrameKind::BlobError.to_byte())
180 >> gen_slice!(&len[padding ..])
181 >> gen_slice!(CRLF.as_bytes())
182 >> gen_slice!(data)
183 >> gen_slice!(CRLF.as_bytes())
184 )
185}
186
187fn gen_verbatimstring<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
188 mut x: (&'a mut [u8], usize),
189 data: &[u8],
190 format: &VerbatimStringFormat,
191 attributes: Option<A>,
192 int_as_blobstring: bool,
193) -> Result<(&'a mut [u8], usize), GenError> {
194 encode_attributes!(x, attributes, int_as_blobstring);
195
196 let total_len = format.encode_len() + data.len();
197 let (len, padding) = int2dec::u64_to_digits(total_len as u64);
198 do_gen!(
199 x,
200 gen_be_u8!(FrameKind::VerbatimString.to_byte())
201 >> gen_slice!(&len[padding ..])
202 >> gen_slice!(CRLF.as_bytes())
203 >> gen_slice!(format.to_str().as_bytes())
204 >> gen_be_u8!(VERBATIM_FORMAT_BYTE)
205 >> gen_slice!(data)
206 >> gen_slice!(CRLF.as_bytes())
207 )
208}
209
210fn gen_owned_array<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
211 mut x: (&'a mut [u8], usize),
212 data: &[OwnedFrame],
213 attributes: Option<A>,
214 int_as_blobstring: bool,
215) -> Result<(&'a mut [u8], usize), GenError> {
216 encode_attributes!(x, attributes, int_as_blobstring);
217
218 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
219 let mut x = do_gen!(
220 x,
221 gen_be_u8!(FrameKind::Array.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
222 )?;
223
224 for frame in data.iter() {
225 x = gen_owned_frame(x.0, x.1, frame, int_as_blobstring)?;
226 }
227
228 Ok(x)
229}
230
231fn gen_borrowed_array<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
232 mut x: (&'a mut [u8], usize),
233 data: &[BorrowedFrame],
234 attributes: Option<A>,
235 int_as_blobstring: bool,
236) -> Result<(&'a mut [u8], usize), GenError> {
237 encode_attributes!(x, attributes, int_as_blobstring);
238
239 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
240 let mut x = do_gen!(
241 x,
242 gen_be_u8!(FrameKind::Array.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
243 )?;
244
245 for frame in data.iter() {
246 x = gen_borrowed_frame(x.0, x.1, frame, int_as_blobstring)?;
247 }
248
249 Ok(x)
250}
251
252#[cfg(feature = "bytes")]
253fn gen_bytes_array<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
254 mut x: (&'a mut [u8], usize),
255 data: &[BytesFrame],
256 attributes: Option<A>,
257 int_as_blobstring: bool,
258) -> Result<(&'a mut [u8], usize), GenError> {
259 encode_attributes!(x, attributes, int_as_blobstring);
260
261 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
262 let mut x = do_gen!(
263 x,
264 gen_be_u8!(FrameKind::Array.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
265 )?;
266
267 for frame in data.iter() {
268 x = gen_bytes_frame(x.0, x.1, frame, int_as_blobstring)?;
269 }
270
271 Ok(x)
272}
273
274fn gen_owned_map<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
275 mut x: (&'a mut [u8], usize),
276 data: &FrameMap<OwnedFrame, OwnedFrame>,
277 attributes: Option<A>,
278 int_as_blobstring: bool,
279) -> Result<(&'a mut [u8], usize), GenError> {
280 encode_attributes!(x, attributes, int_as_blobstring);
281
282 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
283 x = do_gen!(
284 x,
285 gen_be_u8!(FrameKind::Map.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
286 )?;
287
288 for (key, value) in data.iter() {
289 x = gen_owned_frame(x.0, x.1, key, int_as_blobstring)?;
290 x = gen_owned_frame(x.0, x.1, value, int_as_blobstring)?;
291 }
292
293 Ok(x)
294}
295
296fn gen_borrowed_map<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
297 mut x: (&'a mut [u8], usize),
298 data: &FrameMap<BorrowedFrame, BorrowedFrame>,
299 attributes: Option<A>,
300 int_as_blobstring: bool,
301) -> Result<(&'a mut [u8], usize), GenError> {
302 encode_attributes!(x, attributes, int_as_blobstring);
303
304 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
305 x = do_gen!(
306 x,
307 gen_be_u8!(FrameKind::Map.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
308 )?;
309
310 for (key, value) in data.iter() {
311 x = gen_borrowed_frame(x.0, x.1, key, int_as_blobstring)?;
312 x = gen_borrowed_frame(x.0, x.1, value, int_as_blobstring)?;
313 }
314
315 Ok(x)
316}
317
318#[cfg(feature = "bytes")]
319fn gen_bytes_map<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
320 mut x: (&'a mut [u8], usize),
321 data: &FrameMap<BytesFrame, BytesFrame>,
322 attributes: Option<A>,
323 int_as_blobstring: bool,
324) -> Result<(&'a mut [u8], usize), GenError> {
325 encode_attributes!(x, attributes, int_as_blobstring);
326
327 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
328 x = do_gen!(
329 x,
330 gen_be_u8!(FrameKind::Map.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
331 )?;
332
333 for (key, value) in data.iter() {
334 x = gen_bytes_frame(x.0, x.1, key, int_as_blobstring)?;
335 x = gen_bytes_frame(x.0, x.1, value, int_as_blobstring)?;
336 }
337
338 Ok(x)
339}
340
341fn gen_owned_set<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
342 mut x: (&'a mut [u8], usize),
343 data: &FrameSet<OwnedFrame>,
344 attributes: Option<A>,
345 int_as_blobstring: bool,
346) -> Result<(&'a mut [u8], usize), GenError> {
347 encode_attributes!(x, attributes, int_as_blobstring);
348
349 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
350 x = do_gen!(
351 x,
352 gen_be_u8!(FrameKind::Set.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
353 )?;
354
355 for frame in data.iter() {
356 x = gen_owned_frame(x.0, x.1, frame, int_as_blobstring)?;
357 }
358
359 Ok(x)
360}
361
362fn gen_borrowed_set<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
363 mut x: (&'a mut [u8], usize),
364 data: &FrameSet<BorrowedFrame>,
365 attributes: Option<A>,
366 int_as_blobstring: bool,
367) -> Result<(&'a mut [u8], usize), GenError> {
368 encode_attributes!(x, attributes, int_as_blobstring);
369
370 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
371 x = do_gen!(
372 x,
373 gen_be_u8!(FrameKind::Set.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
374 )?;
375
376 for frame in data.iter() {
377 x = gen_borrowed_frame(x.0, x.1, frame, int_as_blobstring)?;
378 }
379
380 Ok(x)
381}
382
383#[cfg(feature = "bytes")]
384fn gen_bytes_set<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
385 mut x: (&'a mut [u8], usize),
386 data: &FrameSet<BytesFrame>,
387 attributes: Option<A>,
388 int_as_blobstring: bool,
389) -> Result<(&'a mut [u8], usize), GenError> {
390 encode_attributes!(x, attributes, int_as_blobstring);
391
392 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
393 x = do_gen!(
394 x,
395 gen_be_u8!(FrameKind::Set.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
396 )?;
397
398 for frame in data.iter() {
399 x = gen_bytes_frame(x.0, x.1, frame, int_as_blobstring)?;
400 }
401
402 Ok(x)
403}
404
405fn gen_owned_attribute<'a>(
406 x: (&'a mut [u8], usize),
407 data: &OwnedAttributes,
408 int_as_blobstring: bool,
409) -> Result<(&'a mut [u8], usize), GenError> {
410 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
411 let mut x = do_gen!(
412 x,
413 gen_be_u8!(FrameKind::Attribute.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
414 )?;
415
416 for (key, value) in data.iter() {
417 x = gen_owned_frame(x.0, x.1, key, int_as_blobstring)?;
418 x = gen_owned_frame(x.0, x.1, value, int_as_blobstring)?;
419 }
420
421 Ok(x)
422}
423
424#[cfg(feature = "bytes")]
425fn gen_bytes_attribute<'a>(
426 x: (&'a mut [u8], usize),
427 data: &BytesAttributes,
428 int_as_blobstring: bool,
429) -> Result<(&'a mut [u8], usize), GenError> {
430 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
431 let mut x = do_gen!(
432 x,
433 gen_be_u8!(FrameKind::Attribute.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
434 )?;
435
436 for (key, value) in data.iter() {
437 x = gen_bytes_frame(x.0, x.1, key, int_as_blobstring)?;
438 x = gen_bytes_frame(x.0, x.1, value, int_as_blobstring)?;
439 }
440
441 Ok(x)
442}
443
444fn gen_owned_push<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
445 mut x: (&'a mut [u8], usize),
446 data: &[OwnedFrame],
447 attributes: Option<A>,
448 int_as_blobstring: bool,
449) -> Result<(&'a mut [u8], usize), GenError> {
450 encode_attributes!(x, attributes, int_as_blobstring);
451
452 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
453 x = do_gen!(
454 x,
455 gen_be_u8!(FrameKind::Push.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
456 )?;
457
458 for frame in data.iter() {
459 x = gen_owned_frame(x.0, x.1, frame, int_as_blobstring)?;
460 }
461
462 Ok(x)
463}
464
465fn gen_borrowed_push<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
466 mut x: (&'a mut [u8], usize),
467 data: &[BorrowedFrame],
468 attributes: Option<A>,
469 int_as_blobstring: bool,
470) -> Result<(&'a mut [u8], usize), GenError> {
471 encode_attributes!(x, attributes, int_as_blobstring);
472
473 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
474 x = do_gen!(
475 x,
476 gen_be_u8!(FrameKind::Push.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
477 )?;
478
479 for frame in data.iter() {
480 x = gen_borrowed_frame(x.0, x.1, frame, int_as_blobstring)?;
481 }
482
483 Ok(x)
484}
485
486#[cfg(feature = "bytes")]
487fn gen_bytes_push<'a, 'b, A: Into<BorrowedAttrs<'b>>>(
488 mut x: (&'a mut [u8], usize),
489 data: &[BytesFrame],
490 attributes: Option<A>,
491 int_as_blobstring: bool,
492) -> Result<(&'a mut [u8], usize), GenError> {
493 encode_attributes!(x, attributes, int_as_blobstring);
494
495 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
496 x = do_gen!(
497 x,
498 gen_be_u8!(FrameKind::Push.to_byte()) >> gen_slice!(&len[padding ..]) >> gen_slice!(CRLF.as_bytes())
499 )?;
500
501 for frame in data.iter() {
502 x = gen_bytes_frame(x.0, x.1, frame, int_as_blobstring)?;
503 }
504
505 Ok(x)
506}
507
508fn gen_hello<'a>(
509 x: (&'a mut [u8], usize),
510 version: &RespVersion,
511 auth: Option<(&str, &str)>,
512 setname: Option<&str>,
513) -> Result<(&'a mut [u8], usize), GenError> {
514 let mut x = do_gen!(
515 x,
516 gen_slice!(HELLO.as_bytes()) >> gen_slice!(EMPTY_SPACE.as_bytes()) >> gen_be_u8!(version.to_byte())
517 )?;
518 if let Some((username, password)) = auth {
519 x = do_gen!(
520 x,
521 gen_slice!(EMPTY_SPACE.as_bytes())
522 >> gen_slice!(AUTH.as_bytes())
523 >> gen_slice!(EMPTY_SPACE.as_bytes())
524 >> gen_slice!(username.as_bytes())
525 >> gen_slice!(EMPTY_SPACE.as_bytes())
526 >> gen_slice!(password.as_bytes())
527 )?;
528 }
529 if let Some(name) = setname {
530 x = do_gen!(
531 x,
532 gen_slice!(EMPTY_SPACE.as_bytes())
533 >> gen_slice!(SETNAME.as_bytes())
534 >> gen_slice!(EMPTY_SPACE.as_bytes())
535 >> gen_slice!(name.as_bytes())
536 )?;
537 }
538
539 do_gen!(x, gen_slice!(CRLF.as_bytes()))
540}
541
542fn gen_chunked_string<'a>(x: (&'a mut [u8], usize), data: &[u8]) -> Result<(&'a mut [u8], usize), GenError> {
543 if data.is_empty() {
544 do_gen!(x, gen_slice!(END_STREAM_STRING_BYTES.as_bytes()))
546 } else {
547 let (len, padding) = int2dec::u64_to_digits(data.len() as u64);
548 do_gen!(
549 x,
550 gen_be_u8!(FrameKind::ChunkedString.to_byte())
551 >> gen_slice!(&len[padding ..])
552 >> gen_slice!(CRLF.as_bytes())
553 >> gen_slice!(data)
554 >> gen_slice!(CRLF.as_bytes())
555 )
556 }
557}
558
559fn gen_owned_frame<'a>(
560 buf: &'a mut [u8],
561 offset: usize,
562 frame: &OwnedFrame,
563 int_as_blobstring: bool,
564) -> Result<(&'a mut [u8], usize), GenError> {
565 trace!("Encode {:?}, buf len: {}", frame.kind(), buf.len());
566 let x = (buf, offset);
567
568 match frame {
569 OwnedFrame::Array { data, attributes } => gen_owned_array(x, data, attributes.as_ref(), int_as_blobstring),
570 OwnedFrame::BlobString { data, attributes } => gen_blobstring(x, data, attributes.as_ref(), int_as_blobstring),
571 OwnedFrame::SimpleString { data, attributes } => {
572 gen_simplestring(x, data, attributes.as_ref(), int_as_blobstring)
573 },
574 OwnedFrame::SimpleError { data, attributes } => gen_simpleerror(x, data, attributes.as_ref(), int_as_blobstring),
575 OwnedFrame::Number { data, attributes } => gen_number(x, *data, attributes.as_ref(), int_as_blobstring),
576 OwnedFrame::Null => gen_null(x),
577 OwnedFrame::Double { data, attributes } => gen_double(x, *data, attributes.as_ref(), int_as_blobstring),
578 OwnedFrame::BlobError { data, attributes } => gen_bloberror(x, data, attributes.as_ref(), int_as_blobstring),
579 OwnedFrame::VerbatimString {
580 data,
581 format,
582 attributes,
583 } => gen_verbatimstring(x, data, format, attributes.as_ref(), int_as_blobstring),
584 OwnedFrame::Boolean { data, attributes } => gen_boolean(x, *data, attributes.as_ref(), int_as_blobstring),
585 OwnedFrame::Map { data, attributes } => gen_owned_map(x, data, attributes.as_ref(), int_as_blobstring),
586 OwnedFrame::Set { data, attributes } => gen_owned_set(x, data, attributes.as_ref(), int_as_blobstring),
587 OwnedFrame::Push { data, attributes } => gen_owned_push(x, data, attributes.as_ref(), int_as_blobstring),
588 OwnedFrame::Hello { version, auth, setname } => {
589 gen_hello(x, version, map_owned_auth(auth), setname.as_ref().map(|s| s.as_str()))
590 },
591 OwnedFrame::BigNumber { data, attributes } => gen_bignumber(x, data, attributes.as_ref(), int_as_blobstring),
592 OwnedFrame::ChunkedString(b) => gen_chunked_string(x, b),
593 }
594}
595
596fn gen_borrowed_frame<'a>(
597 buf: &'a mut [u8],
598 offset: usize,
599 frame: &BorrowedFrame,
600 int_as_blobstring: bool,
601) -> Result<(&'a mut [u8], usize), GenError> {
602 trace!("Encode {:?}, buf len: {}", frame.kind(), buf.len());
603 let x = (buf, offset);
604
605 match frame {
606 BorrowedFrame::Array { data, attributes } => gen_borrowed_array(x, data, attributes.as_ref(), int_as_blobstring),
607 BorrowedFrame::BlobString { data, attributes } => gen_blobstring(x, data, attributes.as_ref(), int_as_blobstring),
608 BorrowedFrame::SimpleString { data, attributes } => {
609 gen_simplestring(x, data, attributes.as_ref(), int_as_blobstring)
610 },
611 BorrowedFrame::SimpleError { data, attributes } => {
612 gen_simpleerror(x, data, attributes.as_ref(), int_as_blobstring)
613 },
614 BorrowedFrame::Number { data, attributes } => gen_number(x, *data, attributes.as_ref(), int_as_blobstring),
615 BorrowedFrame::Null => gen_null(x),
616 BorrowedFrame::Double { data, attributes } => gen_double(x, *data, attributes.as_ref(), int_as_blobstring),
617 BorrowedFrame::BlobError { data, attributes } => gen_bloberror(x, data, attributes.as_ref(), int_as_blobstring),
618 BorrowedFrame::VerbatimString {
619 data,
620 format,
621 attributes,
622 } => gen_verbatimstring(x, data, format, attributes.as_ref(), int_as_blobstring),
623 BorrowedFrame::Boolean { data, attributes } => gen_boolean(x, *data, attributes.as_ref(), int_as_blobstring),
624 BorrowedFrame::Map { data, attributes } => gen_borrowed_map(x, data, attributes.as_ref(), int_as_blobstring),
625 BorrowedFrame::Set { data, attributes } => gen_borrowed_set(x, data, attributes.as_ref(), int_as_blobstring),
626 BorrowedFrame::Push { data, attributes } => gen_borrowed_push(x, data, attributes.as_ref(), int_as_blobstring),
627 BorrowedFrame::Hello { version, auth, setname } => gen_hello(x, version, *auth, *setname),
628 BorrowedFrame::BigNumber { data, attributes } => gen_bignumber(x, data, attributes.as_ref(), int_as_blobstring),
629 BorrowedFrame::ChunkedString(b) => gen_chunked_string(x, b),
630 }
631}
632
633#[cfg(feature = "bytes")]
634fn gen_bytes_frame<'a>(
635 buf: &'a mut [u8],
636 offset: usize,
637 frame: &BytesFrame,
638 int_as_blobstring: bool,
639) -> Result<(&'a mut [u8], usize), GenError> {
640 trace!("Encode {:?}, buf len: {}", frame.kind(), buf.len());
641 let x = (buf, offset);
642
643 match frame {
644 BytesFrame::Array { data, attributes } => gen_bytes_array(x, data, attributes.as_ref(), int_as_blobstring),
645 BytesFrame::BlobString { data, attributes } => gen_blobstring(x, data, attributes.as_ref(), int_as_blobstring),
646 BytesFrame::SimpleString { data, attributes } => {
647 gen_simplestring(x, data, attributes.as_ref(), int_as_blobstring)
648 },
649 BytesFrame::SimpleError { data, attributes } => gen_simpleerror(x, data, attributes.as_ref(), int_as_blobstring),
650 BytesFrame::Number { data, attributes } => gen_number(x, *data, attributes.as_ref(), int_as_blobstring),
651 BytesFrame::Null => gen_null(x),
652 BytesFrame::Double { data, attributes } => gen_double(x, *data, attributes.as_ref(), int_as_blobstring),
653 BytesFrame::BlobError { data, attributes } => gen_bloberror(x, data, attributes.as_ref(), int_as_blobstring),
654 BytesFrame::VerbatimString {
655 data,
656 format,
657 attributes,
658 } => gen_verbatimstring(x, data, format, attributes.as_ref(), int_as_blobstring),
659 BytesFrame::Boolean { data, attributes } => gen_boolean(x, *data, attributes.as_ref(), int_as_blobstring),
660 BytesFrame::Map { data, attributes } => gen_bytes_map(x, data, attributes.as_ref(), int_as_blobstring),
661 BytesFrame::Set { data, attributes } => gen_bytes_set(x, data, attributes.as_ref(), int_as_blobstring),
662 BytesFrame::Push { data, attributes } => gen_bytes_push(x, data, attributes.as_ref(), int_as_blobstring),
663 BytesFrame::Hello { version, auth, setname } => {
664 gen_hello(x, version, map_bytes_auth(auth), setname.as_ref().map(|s| &**s))
665 },
666 BytesFrame::BigNumber { data, attributes } => gen_bignumber(x, data, attributes.as_ref(), int_as_blobstring),
667 BytesFrame::ChunkedString(b) => gen_chunked_string(x, b),
668 }
669}
670
671pub mod complete {
727 use super::*;
728
729 pub fn encode(buf: &mut [u8], frame: &OwnedFrame, int_as_blobstring: bool) -> Result<usize, RedisProtocolError> {
733 encode_checks!(buf, 0, frame.encode_len(int_as_blobstring));
734 gen_owned_frame(buf, 0, frame, int_as_blobstring)
735 .map(|(_, amt)| amt)
736 .map_err(|e| e.into())
737 }
738
739 pub fn encode_borrowed(
743 buf: &mut [u8],
744 frame: &BorrowedFrame,
745 int_as_blobstring: bool,
746 ) -> Result<usize, RedisProtocolError> {
747 encode_checks!(buf, 0, frame.encode_len(int_as_blobstring));
748 gen_borrowed_frame(buf, 0, frame, int_as_blobstring)
749 .map(|(_, amt)| amt)
750 .map_err(|e| e.into())
751 }
752
753 #[cfg(feature = "bytes")]
759 #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
760 pub fn encode_bytes(
761 buf: &mut [u8],
762 frame: &BytesFrame,
763 int_as_blobstring: bool,
764 ) -> Result<usize, RedisProtocolError> {
765 encode_checks!(buf, 0, frame.encode_len(int_as_blobstring));
766 gen_bytes_frame(buf, 0, frame, int_as_blobstring)
767 .map(|(_, amt)| amt)
768 .map_err(|e| e.into())
769 }
770
771 #[cfg(feature = "bytes")]
775 #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
776 pub fn extend_encode(
777 buf: &mut BytesMut,
778 frame: &BytesFrame,
779 int_as_blobstring: bool,
780 ) -> Result<usize, RedisProtocolError> {
781 let amt = frame.encode_len(int_as_blobstring);
782 let offset = buf.len();
783 utils::zero_extend(buf, amt);
784
785 gen_bytes_frame(buf, offset, frame, int_as_blobstring)
786 .map(|(_, amt)| amt)
787 .map_err(|e| e.into())
788 }
789
790 #[cfg(feature = "bytes")]
794 #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
795 pub fn extend_encode_borrowed(
796 buf: &mut BytesMut,
797 frame: &BorrowedFrame,
798 int_as_blobstring: bool,
799 ) -> Result<usize, RedisProtocolError> {
800 let amt = frame.encode_len(int_as_blobstring);
801 let offset = buf.len();
802 utils::zero_extend(buf, amt);
803
804 gen_borrowed_frame(buf, offset, frame, int_as_blobstring)
805 .map(|(_, amt)| amt)
806 .map_err(|e| e.into())
807 }
808}
809
810pub mod streaming {
874 use super::*;
875
876 pub const START_STREAM_ENCODE_LEN: usize = 4;
878 pub const END_STREAM_STRING_ENCODE_LEN: usize = 4;
880 pub const END_STREAM_AGGREGATE_TYPE_ENCODE_LEN: usize = 3;
882
883 fn gen_start_streaming_string(x: (&mut [u8], usize)) -> Result<(&mut [u8], usize), GenError> {
884 do_gen!(
885 x,
886 gen_be_u8!(BLOB_STRING_BYTE) >> gen_be_u8!(STREAMED_LENGTH_BYTE) >> gen_slice!(CRLF.as_bytes())
887 )
888 }
889
890 fn gen_streaming_string_chunk<'a>(
891 x: (&'a mut [u8], usize),
892 data: &[u8],
893 ) -> Result<(&'a mut [u8], usize), GenError> {
894 do_gen!(
895 x,
896 gen_be_u8!(CHUNKED_STRING_BYTE)
897 >> gen_slice!(data.len().to_string().as_bytes())
898 >> gen_slice!(CRLF.as_bytes())
899 >> gen_slice!(data)
900 >> gen_slice!(CRLF.as_bytes())
901 )
902 }
903
904 fn gen_end_streaming_string(x: (&mut [u8], usize)) -> Result<(&mut [u8], usize), GenError> {
905 do_gen!(x, gen_slice!(END_STREAM_STRING_BYTES.as_bytes()))
906 }
907
908 fn gen_start_streaming_aggregate_type(
909 x: (&mut [u8], usize),
910 kind: FrameKind,
911 ) -> Result<(&mut [u8], usize), GenError> {
912 do_gen!(
913 x,
914 gen_be_u8!(kind.to_byte()) >> gen_be_u8!(STREAMED_LENGTH_BYTE) >> gen_slice!(CRLF.as_bytes())
915 )
916 }
917
918 fn gen_end_streaming_aggregate_type(x: (&mut [u8], usize)) -> Result<(&mut [u8], usize), GenError> {
919 do_gen!(x, gen_slice!(END_STREAM_AGGREGATE_BYTES.as_bytes()))
920 }
921
922 fn gen_owned_streaming_inner_value_frame<'a>(
923 x: (&'a mut [u8], usize),
924 data: &OwnedFrame,
925 int_as_blobstring: bool,
926 ) -> Result<(&'a mut [u8], usize), GenError> {
927 gen_owned_frame(x.0, x.1, data, int_as_blobstring)
928 }
929
930 fn gen_borrowed_streaming_inner_value_frame<'a>(
931 x: (&'a mut [u8], usize),
932 data: &BorrowedFrame,
933 int_as_blobstring: bool,
934 ) -> Result<(&'a mut [u8], usize), GenError> {
935 gen_borrowed_frame(x.0, x.1, data, int_as_blobstring)
936 }
937
938 fn gen_owned_streaming_inner_kv_pair_frames<'a>(
939 x: (&'a mut [u8], usize),
940 key: &OwnedFrame,
941 value: &OwnedFrame,
942 int_as_blobstring: bool,
943 ) -> Result<(&'a mut [u8], usize), GenError> {
944 let x = gen_owned_frame(x.0, x.1, key, int_as_blobstring)?;
945 gen_owned_frame(x.0, x.1, value, int_as_blobstring)
946 }
947
948 fn gen_borrowed_streaming_inner_kv_pair_frames<'a>(
949 x: (&'a mut [u8], usize),
950 key: &BorrowedFrame,
951 value: &BorrowedFrame,
952 int_as_blobstring: bool,
953 ) -> Result<(&'a mut [u8], usize), GenError> {
954 let x = gen_borrowed_frame(x.0, x.1, key, int_as_blobstring)?;
955 gen_borrowed_frame(x.0, x.1, value, int_as_blobstring)
956 }
957
958 #[cfg(feature = "bytes")]
959 fn gen_bytes_streaming_inner_value_frame<'a>(
960 x: (&'a mut [u8], usize),
961 data: &BytesFrame,
962 int_as_blobstring: bool,
963 ) -> Result<(&'a mut [u8], usize), GenError> {
964 gen_bytes_frame(x.0, x.1, data, int_as_blobstring)
965 }
966
967 #[cfg(feature = "bytes")]
968 fn gen_bytes_streaming_inner_kv_pair_frames<'a>(
969 x: (&'a mut [u8], usize),
970 key: &BytesFrame,
971 value: &BytesFrame,
972 int_as_blobstring: bool,
973 ) -> Result<(&'a mut [u8], usize), GenError> {
974 let x = gen_bytes_frame(x.0, x.1, key, int_as_blobstring)?;
975 gen_bytes_frame(x.0, x.1, value, int_as_blobstring)
976 }
977
978 pub fn encode_start_string(buf: &mut [u8], offset: usize) -> Result<usize, RedisProtocolError> {
982 encode_checks!(buf, offset, START_STREAM_ENCODE_LEN);
983
984 gen_start_streaming_string((buf, offset))
985 .map(|(_, l)| l)
986 .map_err(|e| e.into())
987 }
988
989 pub fn encode_string_chunk(buf: &mut [u8], offset: usize, data: &[u8]) -> Result<usize, RedisProtocolError> {
996 encode_checks!(buf, offset, resp3_utils::blobstring_encode_len(data));
997
998 gen_streaming_string_chunk((buf, offset), data)
999 .map(|(_, l)| l)
1000 .map_err(|e| e.into())
1001 }
1002
1003 pub fn encode_end_string(buf: &mut [u8], offset: usize) -> Result<usize, RedisProtocolError> {
1007 encode_checks!(buf, offset, END_STREAM_STRING_ENCODE_LEN);
1008
1009 gen_end_streaming_string((buf, offset))
1010 .map(|(_, l)| l)
1011 .map_err(|e| e.into())
1012 }
1013
1014 pub fn encode_start_aggregate_type(
1018 buf: &mut [u8],
1019 offset: usize,
1020 kind: FrameKind,
1021 ) -> Result<usize, RedisProtocolError> {
1022 if !kind.is_aggregate_type() {
1023 return Err(GenError::CustomError(3).into());
1024 }
1025 encode_checks!(buf, offset, START_STREAM_ENCODE_LEN);
1026
1027 gen_start_streaming_aggregate_type((buf, offset), kind)
1028 .map(|(_, l)| l)
1029 .map_err(|e| e.into())
1030 }
1031
1032 pub fn encode_owned_aggregate_type_inner_value(
1038 buf: &mut [u8],
1039 offset: usize,
1040 data: &OwnedFrame,
1041 int_as_blobstring: bool,
1042 ) -> Result<usize, RedisProtocolError> {
1043 encode_checks!(buf, offset, data.encode_len(int_as_blobstring));
1044
1045 gen_owned_streaming_inner_value_frame((buf, offset), data, int_as_blobstring)
1046 .map(|(_, l)| l)
1047 .map_err(|e| e.into())
1048 }
1049
1050 pub fn encode_borrowed_aggregate_type_inner_value(
1056 buf: &mut [u8],
1057 offset: usize,
1058 data: &BorrowedFrame,
1059 int_as_blobstring: bool,
1060 ) -> Result<usize, RedisProtocolError> {
1061 encode_checks!(buf, offset, data.encode_len(int_as_blobstring));
1062
1063 gen_borrowed_streaming_inner_value_frame((buf, offset), data, int_as_blobstring)
1064 .map(|(_, l)| l)
1065 .map_err(|e| e.into())
1066 }
1067
1068 pub fn encode_owned_aggregate_type_inner_kv_pair(
1072 buf: &mut [u8],
1073 offset: usize,
1074 key: &OwnedFrame,
1075 value: &OwnedFrame,
1076 int_as_blobstring: bool,
1077 ) -> Result<usize, RedisProtocolError> {
1078 encode_checks!(
1079 buf,
1080 offset,
1081 key.encode_len(int_as_blobstring) + value.encode_len(int_as_blobstring)
1082 );
1083
1084 gen_owned_streaming_inner_kv_pair_frames((buf, offset), key, value, int_as_blobstring)
1085 .map(|(_, l)| l)
1086 .map_err(|e| e.into())
1087 }
1088
1089 pub fn encode_borrowed_aggregate_type_inner_kv_pair(
1093 buf: &mut [u8],
1094 offset: usize,
1095 key: &BorrowedFrame,
1096 value: &BorrowedFrame,
1097 int_as_blobstring: bool,
1098 ) -> Result<usize, RedisProtocolError> {
1099 encode_checks!(
1100 buf,
1101 offset,
1102 key.encode_len(int_as_blobstring) + value.encode_len(int_as_blobstring)
1103 );
1104
1105 gen_borrowed_streaming_inner_kv_pair_frames((buf, offset), key, value, int_as_blobstring)
1106 .map(|(_, l)| l)
1107 .map_err(|e| e.into())
1108 }
1109
1110 #[cfg(feature = "bytes")]
1116 #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
1117 pub fn encode_bytes_aggregate_type_inner_value(
1118 buf: &mut [u8],
1119 offset: usize,
1120 data: &BytesFrame,
1121 int_as_blobstring: bool,
1122 ) -> Result<usize, RedisProtocolError> {
1123 encode_checks!(buf, offset, data.encode_len(int_as_blobstring));
1124
1125 gen_bytes_streaming_inner_value_frame((buf, offset), data, int_as_blobstring)
1126 .map(|(_, l)| l)
1127 .map_err(|e| e.into())
1128 }
1129
1130 #[cfg(feature = "bytes")]
1134 #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
1135 pub fn encode_bytes_aggregate_type_inner_kv_pair(
1136 buf: &mut [u8],
1137 offset: usize,
1138 key: &BytesFrame,
1139 value: &BytesFrame,
1140 int_as_blobstring: bool,
1141 ) -> Result<usize, RedisProtocolError> {
1142 encode_checks!(
1143 buf,
1144 offset,
1145 key.encode_len(int_as_blobstring) + value.encode_len(int_as_blobstring)
1146 );
1147
1148 gen_bytes_streaming_inner_kv_pair_frames((buf, offset), key, value, int_as_blobstring)
1149 .map(|(_, l)| l)
1150 .map_err(|e| e.into())
1151 }
1152
1153 pub fn encode_end_aggregate_type(buf: &mut [u8], offset: usize) -> Result<usize, RedisProtocolError> {
1157 encode_checks!(buf, offset, END_STREAM_AGGREGATE_TYPE_ENCODE_LEN);
1158
1159 gen_end_streaming_aggregate_type((buf, offset))
1160 .map(|(_, l)| l)
1161 .map_err(|e| e.into())
1162 }
1163}
1164
1165#[cfg(test)]
1168#[cfg(feature = "std")]
1169mod owned_tests {
1170 use super::*;
1171 use itertools::Itertools;
1172 use std::{convert::TryInto, str};
1173
1174 fn create_attributes() -> (FrameMap<OwnedFrame, OwnedFrame>, Vec<u8>) {
1175 let mut out = resp3_utils::new_map(0);
1176 let key = OwnedFrame::SimpleString {
1177 data: "foo".into(),
1178 attributes: None,
1179 };
1180 let value = OwnedFrame::Number {
1181 data: 42,
1182 attributes: None,
1183 };
1184 out.insert(key, value);
1185 let encoded = "|1\r\n+foo\r\n:42\r\n".to_owned().into_bytes();
1186
1187 (out, encoded)
1188 }
1189
1190 fn blobstring_array(data: Vec<&'static str>) -> OwnedFrame {
1191 let inner: Vec<OwnedFrame> = data
1192 .into_iter()
1193 .map(|s| (FrameKind::BlobString, s).try_into().unwrap())
1194 .collect();
1195
1196 OwnedFrame::Array {
1197 data: inner,
1198 attributes: None,
1199 }
1200 }
1201
1202 fn push_frame_to_array(frame: &mut OwnedFrame, inner: OwnedFrame) {
1203 if let OwnedFrame::Array { ref mut data, .. } = frame {
1204 data.push(inner);
1205 }
1206 }
1207
1208 fn unordered_assert_eq(data: &[u8], expected_start: &[u8], expected_middle: &[&str]) {
1209 let mut exptected_permutations = vec![];
1210 for middle_permutation in expected_middle.iter().permutations(expected_middle.len()) {
1211 let mut expected = expected_start.to_vec();
1212 for middle in middle_permutation {
1213 expected.extend_from_slice(middle.as_bytes())
1214 }
1215 exptected_permutations.push(expected);
1216 }
1217
1218 assert!(
1219 exptected_permutations.contains(&data.to_vec()),
1220 "No middle permutations matched: data {:?} needs to match with one of the following {:#?}",
1221 data,
1222 exptected_permutations
1223 );
1224 }
1225
1226 fn encode_and_verify_empty(input: &OwnedFrame, expected: &str) {
1227 let mut buf = vec![0; expected.len()];
1228 let len = complete::encode(&mut buf, input, false).unwrap();
1229
1230 assert_eq!(
1231 buf,
1232 expected.as_bytes(),
1233 "empty buf contents match {:?} == {:?}",
1234 str::from_utf8(&buf),
1235 expected
1236 );
1237 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
1238 }
1239
1240 fn encode_and_verify_empty_unordered(input: &OwnedFrame, expected_start: &str, expected_middle: &[&str]) {
1241 let mut buf = vec![0; input.encode_len(false)];
1242 let len = complete::encode(&mut buf, input, false).unwrap();
1243
1244 unordered_assert_eq(&buf, expected_start.as_bytes(), expected_middle);
1245 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
1246 assert_eq!(
1247 len,
1248 expected_start.as_bytes().len() + expected_middle_len,
1249 "empty expected len is correct"
1250 );
1251 }
1252
1253 fn encode_and_verify_empty_with_attributes(input: &OwnedFrame, expected: &str) {
1254 let (attributes, encoded_attributes) = create_attributes();
1255 let mut frame = input.clone();
1256 frame.add_attributes(attributes).unwrap();
1257 let mut buf = vec![0; expected.len() + encoded_attributes.len()];
1258 let len = complete::encode(&mut buf, &frame, false).unwrap();
1259
1260 let mut expected_bytes = Vec::new();
1261 expected_bytes.extend_from_slice(&encoded_attributes);
1262 expected_bytes.extend_from_slice(expected.as_bytes());
1263
1264 assert_eq!(buf, expected_bytes, "non empty buf contents match with attrs");
1265 assert_eq!(
1266 len,
1267 expected.as_bytes().len() + encoded_attributes.len(),
1268 "non empty expected len is correct with attrs"
1269 );
1270 }
1271
1272 fn encode_and_verify_empty_with_attributes_unordered(
1273 input: &OwnedFrame,
1274 expected_start: &str,
1275 expected_middle: &[&str],
1276 ) {
1277 let (attributes, encoded_attributes) = create_attributes();
1278 let mut frame = input.clone();
1279 frame.add_attributes(attributes).unwrap();
1280 let mut buf = vec![0; input.encode_len(false) + encoded_attributes.len()];
1281 let len = complete::encode(&mut buf, &frame, false).unwrap();
1282
1283 let mut expected_start_bytes = Vec::new();
1284 expected_start_bytes.extend_from_slice(&encoded_attributes);
1285 expected_start_bytes.extend_from_slice(expected_start.as_bytes());
1286 unordered_assert_eq(&buf, &expected_start_bytes, expected_middle);
1287
1288 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
1289 assert_eq!(
1290 len,
1291 expected_start.as_bytes().len() + expected_middle_len + encoded_attributes.len(),
1292 "non empty expected len is correct with attrs"
1293 );
1294 }
1295
1296 #[test]
1299 fn should_encode_llen_req_example() {
1300 let expected = "*2\r\n$4\r\nLLEN\r\n$6\r\nmylist\r\n";
1301 let input = blobstring_array(vec!["LLEN", "mylist"]);
1302
1303 encode_and_verify_empty(&input, expected);
1304 encode_and_verify_empty_with_attributes(&input, expected);
1305 }
1306
1307 #[test]
1308 fn should_encode_incr_req_example() {
1309 let expected = "*2\r\n$4\r\nINCR\r\n$5\r\nmykey\r\n";
1310 let input = blobstring_array(vec!["INCR", "mykey"]);
1311
1312 encode_and_verify_empty(&input, expected);
1313 encode_and_verify_empty_with_attributes(&input, expected);
1314 }
1315
1316 #[test]
1317 fn should_encode_bitcount_req_example() {
1318 let expected = "*2\r\n$8\r\nBITCOUNT\r\n$5\r\nmykey\r\n";
1319 let input = blobstring_array(vec!["BITCOUNT", "mykey"]);
1320
1321 encode_and_verify_empty(&input, expected);
1322 encode_and_verify_empty_with_attributes(&input, expected);
1323 }
1324
1325 #[test]
1326 fn should_encode_array_bulk_string_test() {
1327 let expected = "*3\r\n$5\r\nWATCH\r\n$6\r\nWIBBLE\r\n$9\r\nfooBARbaz\r\n";
1328 let input = blobstring_array(vec!["WATCH", "WIBBLE", "fooBARbaz"]);
1329
1330 encode_and_verify_empty(&input, expected);
1331 encode_and_verify_empty_with_attributes(&input, expected);
1332 }
1333
1334 #[test]
1335 fn should_encode_array_null_test() {
1336 let expected = "*3\r\n$4\r\nHSET\r\n$3\r\nfoo\r\n_\r\n";
1337 let mut input = blobstring_array(vec!["HSET", "foo"]);
1338 push_frame_to_array(&mut input, OwnedFrame::Null);
1339
1340 encode_and_verify_empty(&input, expected);
1341 }
1342
1343 #[test]
1344 fn should_encode_raw_llen_req_example() {
1345 let expected = "*2\r\n$4\r\nLLEN\r\n$6\r\nmylist\r\n";
1346 let input = blobstring_array(vec!["LLEN", "mylist"]);
1347
1348 encode_and_verify_empty(&input, expected);
1349 }
1350
1351 #[test]
1352 fn should_encode_raw_incr_req_example() {
1353 let expected = "*2\r\n$4\r\nINCR\r\n$5\r\nmykey\r\n";
1354 let input = blobstring_array(vec!["INCR", "mykey"]);
1355
1356 encode_and_verify_empty(&input, expected);
1357 }
1358
1359 #[test]
1360 fn should_encode_raw_bitcount_req_example() {
1361 let expected = "*2\r\n$8\r\nBITCOUNT\r\n$5\r\nmykey\r\n";
1362 let input = blobstring_array(vec!["BITCOUNT", "mykey"]);
1363
1364 encode_and_verify_empty(&input, expected);
1365 }
1366
1367 #[test]
1368 fn should_encode_raw_array_bulk_string_test() {
1369 let expected = "*3\r\n$5\r\nWATCH\r\n$6\r\nWIBBLE\r\n$9\r\nfooBARbaz\r\n";
1370 let input = blobstring_array(vec!["WATCH", "WIBBLE", "fooBARbaz"]);
1371
1372 encode_and_verify_empty(&input, expected);
1373 }
1374
1375 #[test]
1376 fn should_encode_raw_array_null_test() {
1377 let expected = "*3\r\n$4\r\nHSET\r\n$3\r\nfoo\r\n_\r\n";
1378 let mut input = blobstring_array(vec!["HSET", "foo"]);
1379 push_frame_to_array(&mut input, OwnedFrame::Null);
1380
1381 encode_and_verify_empty(&input, expected);
1382 }
1383
1384 #[test]
1385 fn should_encode_moved_error() {
1386 let expected = "-MOVED 3999 127.0.0.1:6381\r\n";
1387 let input = (FrameKind::SimpleError, "MOVED 3999 127.0.0.1:6381")
1388 .try_into()
1389 .unwrap();
1390
1391 encode_and_verify_empty(&input, expected);
1392 encode_and_verify_empty_with_attributes(&input, expected);
1393 }
1394
1395 #[test]
1396 fn should_encode_ask_error() {
1397 let expected = "-ASK 3999 127.0.0.1:6381\r\n";
1398 let input = (FrameKind::SimpleError, "ASK 3999 127.0.0.1:6381").try_into().unwrap();
1399
1400 encode_and_verify_empty(&input, expected);
1401 encode_and_verify_empty_with_attributes(&input, expected);
1402 }
1403
1404 #[test]
1405 fn should_encode_error() {
1406 let expected = "-WRONGTYPE Operation against a key holding the wrong kind of value\r\n";
1407 let input = (
1408 FrameKind::SimpleError,
1409 "WRONGTYPE Operation against a key holding the wrong kind of value",
1410 )
1411 .try_into()
1412 .unwrap();
1413
1414 encode_and_verify_empty(&input, expected);
1415 encode_and_verify_empty_with_attributes(&input, expected);
1416 }
1417
1418 #[test]
1419 fn should_encode_simplestring() {
1420 let expected = "+OK\r\n";
1421 let input = (FrameKind::SimpleString, "OK").try_into().unwrap();
1422
1423 encode_and_verify_empty(&input, expected);
1424 encode_and_verify_empty_with_attributes(&input, expected);
1425 }
1426
1427 #[test]
1428 fn should_encode_number() {
1429 let expected = ":1000\r\n";
1430 let input: OwnedFrame = 1000.into();
1431
1432 encode_and_verify_empty(&input, expected);
1433 encode_and_verify_empty_with_attributes(&input, expected);
1434 }
1435
1436 #[test]
1437 fn should_encode_negative_number() {
1438 let expected = ":-1000\r\n";
1439 let input: OwnedFrame = (-1000).into();
1440
1441 encode_and_verify_empty(&input, expected);
1442 encode_and_verify_empty_with_attributes(&input, expected);
1443 }
1444
1445 #[test]
1448 fn should_encode_bool_true() {
1449 let expected = BOOL_TRUE_BYTES;
1450 let input: OwnedFrame = true.into();
1451
1452 encode_and_verify_empty(&input, expected);
1453 encode_and_verify_empty_with_attributes(&input, expected);
1454 }
1455
1456 #[test]
1457 fn should_encode_bool_false() {
1458 let expected = BOOL_FALSE_BYTES;
1459 let input: OwnedFrame = false.into();
1460
1461 encode_and_verify_empty(&input, expected);
1462 encode_and_verify_empty_with_attributes(&input, expected);
1463 }
1464
1465 #[test]
1466 fn should_encode_double_positive() {
1467 let expected = ",12.34567\r\n";
1468 let input: OwnedFrame = 12.34567.try_into().unwrap();
1469
1470 encode_and_verify_empty(&input, expected);
1471 encode_and_verify_empty_with_attributes(&input, expected);
1472 }
1473
1474 #[test]
1475 fn should_encode_double_negative() {
1476 let expected = ",-12.34567\r\n";
1477 let input: OwnedFrame = (-12.34567).try_into().unwrap();
1478
1479 encode_and_verify_empty(&input, expected);
1480 encode_and_verify_empty_with_attributes(&input, expected);
1481 }
1482
1483 #[test]
1484 fn should_encode_double_nan() {
1485 let expected = ",nan\r\n";
1486 let input = OwnedFrame::Double {
1487 data: f64::NAN,
1488 attributes: None,
1489 };
1490
1491 encode_and_verify_empty(&input, expected);
1492 encode_and_verify_empty_with_attributes(&input, expected);
1493 }
1494
1495 #[test]
1496 fn should_encode_double_inf() {
1497 let expected = ",inf\r\n";
1498 let input: OwnedFrame = f64::INFINITY.try_into().unwrap();
1499
1500 encode_and_verify_empty(&input, expected);
1501 encode_and_verify_empty_with_attributes(&input, expected);
1502 }
1503
1504 #[test]
1505 fn should_encode_double_neg_inf() {
1506 let expected = ",-inf\r\n";
1507 let input: OwnedFrame = f64::NEG_INFINITY.try_into().unwrap();
1508
1509 encode_and_verify_empty(&input, expected);
1510 encode_and_verify_empty_with_attributes(&input, expected);
1511 }
1512
1513 #[test]
1514 fn should_encode_bignumber() {
1515 let expected = "(3492890328409238509324850943850943825024385\r\n";
1516 let input: OwnedFrame = (
1517 FrameKind::BigNumber,
1518 "3492890328409238509324850943850943825024385".as_bytes().to_vec(),
1519 )
1520 .try_into()
1521 .unwrap();
1522
1523 encode_and_verify_empty(&input, expected);
1524 encode_and_verify_empty_with_attributes(&input, expected);
1525 }
1526
1527 #[test]
1528 fn should_encode_null() {
1529 let expected = "_\r\n";
1530 let input = OwnedFrame::Null;
1531
1532 encode_and_verify_empty(&input, expected);
1533 }
1534
1535 #[test]
1536 fn should_encode_blobstring() {
1537 let expected = "$9\r\nfoobarbaz\r\n";
1538 let input: OwnedFrame = (FrameKind::BlobString, "foobarbaz").try_into().unwrap();
1539
1540 encode_and_verify_empty(&input, expected);
1541 encode_and_verify_empty_with_attributes(&input, expected);
1542 }
1543
1544 #[test]
1545 fn should_encode_bloberror() {
1546 let expected = "!21\r\nSYNTAX invalid syntax\r\n";
1547 let input: OwnedFrame = (FrameKind::BlobError, "SYNTAX invalid syntax").try_into().unwrap();
1548
1549 encode_and_verify_empty(&input, expected);
1550 encode_and_verify_empty_with_attributes(&input, expected);
1551 }
1552
1553 #[test]
1554 fn should_encode_verbatimstring_txt() {
1555 let expected = "=15\r\ntxt:Some string\r\n";
1556 let input = OwnedFrame::VerbatimString {
1557 format: VerbatimStringFormat::Text,
1558 data: "Some string".as_bytes().into(),
1559 attributes: None,
1560 };
1561
1562 encode_and_verify_empty(&input, expected);
1563 encode_and_verify_empty_with_attributes(&input, expected);
1564 }
1565
1566 #[test]
1567 fn should_encode_verbatimstring_mkd() {
1568 let expected = "=15\r\nmkd:Some string\r\n";
1569 let input = OwnedFrame::VerbatimString {
1570 format: VerbatimStringFormat::Markdown,
1571 data: "Some string".as_bytes().into(),
1572 attributes: None,
1573 };
1574
1575 encode_and_verify_empty(&input, expected);
1576 encode_and_verify_empty_with_attributes(&input, expected);
1577 }
1578
1579 #[test]
1580 fn should_encode_push_pubsub() {
1581 let expected = ">4\r\n+pubsub\r\n+message\r\n+somechannel\r\n+this is the message\r\n";
1582 let input = OwnedFrame::Push {
1583 data: vec![
1584 (FrameKind::SimpleString, "pubsub").try_into().unwrap(),
1585 (FrameKind::SimpleString, "message").try_into().unwrap(),
1586 (FrameKind::SimpleString, "somechannel").try_into().unwrap(),
1587 (FrameKind::SimpleString, "this is the message").try_into().unwrap(),
1588 ],
1589 attributes: None,
1590 };
1591
1592 assert!(input.is_normal_pubsub_message());
1593 encode_and_verify_empty(&input, expected);
1594 encode_and_verify_empty_with_attributes(&input, expected);
1595 }
1596
1597 #[test]
1598 fn should_encode_push_keyspace_event() {
1599 let expected = ">4\r\n+pubsub\r\n+message\r\n+__keyspace@0__:mykey\r\n+del\r\n";
1600 let input = OwnedFrame::Push {
1601 data: vec![
1602 (FrameKind::SimpleString, "pubsub").try_into().unwrap(),
1603 (FrameKind::SimpleString, "message").try_into().unwrap(),
1604 (FrameKind::SimpleString, "__keyspace@0__:mykey").try_into().unwrap(),
1605 (FrameKind::SimpleString, "del").try_into().unwrap(),
1606 ],
1607 attributes: None,
1608 };
1609
1610 assert!(input.is_normal_pubsub_message());
1611 encode_and_verify_empty(&input, expected);
1612 encode_and_verify_empty_with_attributes(&input, expected);
1613 }
1614
1615 #[test]
1616 fn should_encode_simple_set() {
1617 let expected_start = "~5\r\n";
1618 let expected_middle = ["+orange\r\n", "+apple\r\n", "#t\r\n", ":100\r\n", ":999\r\n"];
1619 let mut inner = resp3_utils::new_set(0);
1620 let v1: OwnedFrame = (FrameKind::SimpleString, "orange").try_into().unwrap();
1621 let v2: OwnedFrame = (FrameKind::SimpleString, "apple").try_into().unwrap();
1622 let v3: OwnedFrame = true.into();
1623 let v4: OwnedFrame = 100.into();
1624 let v5: OwnedFrame = 999.into();
1625
1626 inner.insert(v1);
1627 inner.insert(v2);
1628 inner.insert(v3);
1629 inner.insert(v4);
1630 inner.insert(v5);
1631 let input = OwnedFrame::Set {
1632 data: inner,
1633 attributes: None,
1634 };
1635
1636 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
1637 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
1638 }
1639
1640 #[test]
1641 fn should_encode_simple_map() {
1642 let expected_start = "%2\r\n";
1643 let expected_middle = ["+first\r\n:1\r\n", "+second\r\n:2\r\n"];
1644 let mut inner = resp3_utils::new_map(0);
1645 let k1: OwnedFrame = (FrameKind::SimpleString, "first").try_into().unwrap();
1646 let v1: OwnedFrame = 1.into();
1647 let k2: OwnedFrame = (FrameKind::SimpleString, "second").try_into().unwrap();
1648 let v2: OwnedFrame = 2.into();
1649
1650 inner.insert(k1, v1);
1651 inner.insert(k2, v2);
1652 let input = OwnedFrame::Map {
1653 data: inner,
1654 attributes: None,
1655 };
1656
1657 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
1658 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
1659 }
1660
1661 #[test]
1662 fn should_encode_nested_map() {
1663 let expected_start = "%2\r\n";
1664 let expected_middle = ["+first\r\n:1\r\n", "+second\r\n%1\r\n+third\r\n:3\r\n"];
1665 let mut inner = resp3_utils::new_map(0);
1666 let k1: OwnedFrame = (FrameKind::SimpleString, "first").try_into().unwrap();
1667 let v1: OwnedFrame = 1.into();
1668 let k2: OwnedFrame = (FrameKind::SimpleString, "second").try_into().unwrap();
1669 let k3: OwnedFrame = (FrameKind::SimpleString, "third").try_into().unwrap();
1670 let v3: OwnedFrame = 3.into();
1671
1672 let mut v2_inner = resp3_utils::new_map(0);
1673 v2_inner.insert(k3, v3);
1674 let v2 = OwnedFrame::Map {
1675 data: v2_inner,
1676 attributes: None,
1677 };
1678
1679 inner.insert(k1, v1);
1680 inner.insert(k2, v2);
1681 let input = OwnedFrame::Map {
1682 data: inner,
1683 attributes: None,
1684 };
1685
1686 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
1687 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
1688 }
1689
1690 #[test]
1691 fn should_encode_hello() {
1692 let expected = "HELLO 3\r\n";
1693 let input = OwnedFrame::Hello {
1694 version: RespVersion::RESP3,
1695 auth: None,
1696 setname: None,
1697 };
1698
1699 encode_and_verify_empty(&input, expected);
1700
1701 let expected = "HELLO 2\r\n";
1702 let input = OwnedFrame::Hello {
1703 version: RespVersion::RESP2,
1704 auth: None,
1705 setname: None,
1706 };
1707
1708 encode_and_verify_empty(&input, expected);
1709 }
1710
1711 #[test]
1712 fn should_encode_hello_with_auth() {
1713 let expected = "HELLO 3 AUTH default mypassword\r\n";
1714 let input = OwnedFrame::Hello {
1715 version: RespVersion::RESP3,
1716 auth: Some(("default".into(), "mypassword".into())),
1717 setname: None,
1718 };
1719
1720 encode_and_verify_empty(&input, expected);
1721 }
1722
1723 #[test]
1724 fn should_encode_hello_with_auth_and_setname() {
1725 let expected = "HELLO 3 AUTH default mypassword SETNAME myname\r\n";
1726 let input = OwnedFrame::Hello {
1727 version: RespVersion::RESP3,
1728 auth: Some(("default".into(), "mypassword".into())),
1729 setname: Some("myname".into()),
1730 };
1731
1732 encode_and_verify_empty(&input, expected);
1733 }
1734
1735 #[test]
1736 fn should_encode_streaming_blobstring() {
1737 let expected = "$?\r\n;2\r\nhe\r\n;4\r\nllow\r\n;1\r\no\r\n;3\r\nrld\r\n;0\r\n";
1738 let chunk1 = "he";
1739 let chunk2 = "llow";
1740 let chunk3 = "o";
1741 let chunk4 = "rld";
1742
1743 let mut buf = vec![0; expected.len()];
1744 let mut offset = 0;
1745
1746 offset = streaming::encode_start_string(&mut buf, offset).unwrap();
1747 offset = streaming::encode_string_chunk(&mut buf, offset, chunk1.as_bytes()).unwrap();
1748 offset = streaming::encode_string_chunk(&mut buf, offset, chunk2.as_bytes()).unwrap();
1749 offset = streaming::encode_string_chunk(&mut buf, offset, chunk3.as_bytes()).unwrap();
1750 offset = streaming::encode_string_chunk(&mut buf, offset, chunk4.as_bytes()).unwrap();
1751 offset = streaming::encode_end_string(&mut buf, offset).unwrap();
1752
1753 assert_eq!(offset, expected.as_bytes().len());
1754 assert_eq!(buf, expected.as_bytes());
1755 }
1756
1757 #[test]
1758 fn should_encode_streaming_array() {
1759 let expected = "*?\r\n:1\r\n+foo\r\n#f\r\n$9\r\nfoobarbaz\r\n.\r\n";
1760 let chunk1 = OwnedFrame::Number {
1761 data: 1,
1762 attributes: None,
1763 };
1764 let chunk2 = OwnedFrame::SimpleString {
1765 data: "foo".into(),
1766 attributes: None,
1767 };
1768 let chunk3 = OwnedFrame::Boolean {
1769 data: false,
1770 attributes: None,
1771 };
1772 let chunk4 = OwnedFrame::BlobString {
1773 data: "foobarbaz".as_bytes().into(),
1774 attributes: None,
1775 };
1776
1777 let mut buf = vec![0; expected.len()];
1778 let mut offset = 0;
1779
1780 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Array).unwrap();
1781 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk1, false).unwrap();
1782 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk2, false).unwrap();
1783 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk3, false).unwrap();
1784 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk4, false).unwrap();
1785 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
1786
1787 assert_eq!(offset, expected.as_bytes().len());
1788 assert_eq!(buf, expected.as_bytes());
1789 }
1790
1791 #[test]
1792 fn should_encode_streaming_set() {
1793 let expected = "~?\r\n:1\r\n+foo\r\n#f\r\n$9\r\nfoobarbaz\r\n.\r\n";
1794 let chunk1 = OwnedFrame::Number {
1795 data: 1,
1796 attributes: None,
1797 };
1798 let chunk2 = OwnedFrame::SimpleString {
1799 data: "foo".into(),
1800 attributes: None,
1801 };
1802 let chunk3 = OwnedFrame::Boolean {
1803 data: false,
1804 attributes: None,
1805 };
1806 let chunk4 = OwnedFrame::BlobString {
1807 data: "foobarbaz".as_bytes().into(),
1808 attributes: None,
1809 };
1810
1811 let mut buf = vec![0; expected.len()];
1812 let mut offset = 0;
1813
1814 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Set).unwrap();
1815 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk1, false).unwrap();
1816 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk2, false).unwrap();
1817 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk3, false).unwrap();
1818 offset = streaming::encode_owned_aggregate_type_inner_value(&mut buf, offset, &chunk4, false).unwrap();
1819 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
1820
1821 assert_eq!(offset, expected.as_bytes().len());
1822 assert_eq!(buf, expected.as_bytes());
1823 }
1824
1825 #[test]
1826 fn should_encode_streaming_map() {
1827 let expected = "%?\r\n+a\r\n:1\r\n+b\r\n:2\r\n.\r\n";
1828 let k1 = OwnedFrame::SimpleString {
1829 data: "a".into(),
1830 attributes: None,
1831 };
1832 let v1 = OwnedFrame::Number {
1833 data: 1,
1834 attributes: None,
1835 };
1836 let k2 = OwnedFrame::SimpleString {
1837 data: "b".into(),
1838 attributes: None,
1839 };
1840 let v2 = OwnedFrame::Number {
1841 data: 2,
1842 attributes: None,
1843 };
1844
1845 let mut buf = vec![0; expected.len()];
1846 let mut offset = 0;
1847
1848 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Map).unwrap();
1849 offset = streaming::encode_owned_aggregate_type_inner_kv_pair(&mut buf, offset, &k1, &v1, false).unwrap();
1850 offset = streaming::encode_owned_aggregate_type_inner_kv_pair(&mut buf, offset, &k2, &v2, false).unwrap();
1851 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
1852
1853 assert_eq!(offset, expected.as_bytes().len());
1854 assert_eq!(buf, expected.as_bytes());
1855 }
1856}
1857
1858#[cfg(test)]
1859#[cfg(feature = "bytes")]
1860mod bytes_tests {
1861 use super::*;
1862 use itertools::Itertools;
1863 use std::{convert::TryInto, str};
1864
1865 const PADDING: &str = "foobar";
1866
1867 fn create_attributes() -> (FrameMap<BytesFrame, BytesFrame>, Vec<u8>) {
1868 let mut out = resp3_utils::new_map(0);
1869 let key = BytesFrame::SimpleString {
1870 data: "foo".into(),
1871 attributes: None,
1872 };
1873 let value = BytesFrame::Number {
1874 data: 42,
1875 attributes: None,
1876 };
1877 out.insert(key, value);
1878 let encoded = "|1\r\n+foo\r\n:42\r\n".to_owned().into_bytes();
1879
1880 (out, encoded)
1881 }
1882
1883 fn create_attributes_as_blobstring() -> (FrameMap<BytesFrame, BytesFrame>, Vec<u8>) {
1884 let mut out = resp3_utils::new_map(0);
1885 let key = BytesFrame::SimpleString {
1886 data: "foo".into(),
1887 attributes: None,
1888 };
1889 let value = BytesFrame::Number {
1890 data: 42,
1891 attributes: None,
1892 };
1893 out.insert(key, value);
1894 let encoded = "|1\r\n+foo\r\n$2\r\n42\r\n".to_owned().into_bytes();
1895
1896 (out, encoded)
1897 }
1898
1899 fn blobstring_array(data: Vec<&'static str>) -> BytesFrame {
1900 let inner: Vec<BytesFrame> = data
1901 .into_iter()
1902 .map(|s| (FrameKind::BlobString, s).try_into().unwrap())
1903 .collect();
1904
1905 BytesFrame::Array {
1906 data: inner,
1907 attributes: None,
1908 }
1909 }
1910
1911 fn push_frame_to_array(frame: &mut BytesFrame, inner: BytesFrame) {
1912 if let BytesFrame::Array { ref mut data, .. } = frame {
1913 data.push(inner);
1914 }
1915 }
1916
1917 fn unordered_assert_eq(data: BytesMut, expected_start: BytesMut, expected_middle: &[&str]) {
1918 let mut exptected_permutations = vec![];
1919 for middle_permutation in expected_middle.iter().permutations(expected_middle.len()) {
1920 let mut expected = expected_start.clone();
1921 for middle in middle_permutation {
1922 expected.extend_from_slice(middle.as_bytes())
1923 }
1924 exptected_permutations.push(expected);
1925 }
1926
1927 assert!(
1928 exptected_permutations.contains(&data),
1929 "No middle permutations matched: data {:?} needs to match with one of the following {:#?}",
1930 data,
1931 exptected_permutations
1932 );
1933 }
1934
1935 fn encode_and_verify_empty(input: &BytesFrame, expected: &str) {
1936 let mut buf = BytesMut::new();
1937 let len = complete::extend_encode(&mut buf, input, false).unwrap();
1938
1939 assert_eq!(
1940 buf,
1941 expected.as_bytes(),
1942 "empty buf contents match {:?} == {:?}",
1943 str::from_utf8(&buf),
1944 expected
1945 );
1946 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
1947 }
1948
1949 fn encode_and_verify_empty_unordered(input: &BytesFrame, expected_start: &str, expected_middle: &[&str]) {
1950 let mut buf = BytesMut::new();
1951 let len = complete::extend_encode(&mut buf, input, false).unwrap();
1952
1953 unordered_assert_eq(buf, BytesMut::from(expected_start.as_bytes()), expected_middle);
1954 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
1955 assert_eq!(
1956 len,
1957 expected_start.as_bytes().len() + expected_middle_len,
1958 "empty expected len is correct"
1959 );
1960 }
1961
1962 fn encode_and_verify_non_empty(input: &BytesFrame, expected: &str) {
1963 let mut buf = BytesMut::new();
1964 buf.extend_from_slice(PADDING.as_bytes());
1965
1966 let len = complete::extend_encode(&mut buf, input, false).unwrap();
1967 let padded = [PADDING, expected].join("");
1968
1969 assert_eq!(
1970 buf,
1971 padded.as_bytes(),
1972 "padded buf contents match {:?} == {:?}",
1973 str::from_utf8(&buf),
1974 expected
1975 );
1976 assert_eq!(len, padded.as_bytes().len(), "padded expected len is correct");
1977 }
1978
1979 fn encode_and_verify_non_empty_unordered(input: &BytesFrame, expected_start: &str, expected_middle: &[&str]) {
1980 let mut buf = BytesMut::new();
1981 buf.extend_from_slice(PADDING.as_bytes());
1982
1983 let len = complete::extend_encode(&mut buf, input, false).unwrap();
1984 let expected_start_padded = [PADDING, expected_start].join("");
1985
1986 unordered_assert_eq(buf, BytesMut::from(expected_start_padded.as_bytes()), expected_middle);
1987 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
1988 assert_eq!(
1989 len,
1990 expected_start_padded.as_bytes().len() + expected_middle_len,
1991 "padded expected len is correct"
1992 );
1993 }
1994
1995 fn encode_raw_and_verify_empty(input: &BytesFrame, expected: &str) {
1996 let mut buf = vec![0; expected.as_bytes().len()];
1997 let len = complete::encode_bytes(&mut buf, input, false).unwrap();
1998
1999 assert_eq!(
2000 buf,
2001 expected.as_bytes(),
2002 "empty buf contents match {:?} == {:?}",
2003 str::from_utf8(&buf),
2004 expected
2005 );
2006 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
2007 }
2008
2009 fn encode_and_verify_empty_with_attributes(input: &BytesFrame, expected: &str) {
2010 let (attributes, encoded_attributes) = create_attributes();
2011 let mut frame = input.clone();
2012 frame.add_attributes(attributes).unwrap();
2013 let mut buf = BytesMut::new();
2014 let len = complete::extend_encode(&mut buf, &frame, false).unwrap();
2015
2016 let mut expected_bytes = BytesMut::new();
2017 expected_bytes.extend_from_slice(&encoded_attributes);
2018 expected_bytes.extend_from_slice(expected.as_bytes());
2019
2020 assert_eq!(buf, expected_bytes, "non empty buf contents match with attrs");
2021 assert_eq!(
2022 len,
2023 expected.as_bytes().len() + encoded_attributes.len(),
2024 "non empty expected len is correct with attrs"
2025 );
2026 }
2027
2028 fn encode_and_verify_empty_with_attributes_unordered(
2029 input: &BytesFrame,
2030 expected_start: &str,
2031 expected_middle: &[&str],
2032 ) {
2033 let (attributes, encoded_attributes) = create_attributes();
2034 let mut frame = input.clone();
2035 frame.add_attributes(attributes).unwrap();
2036 let mut buf = BytesMut::new();
2037 let len = complete::extend_encode(&mut buf, &frame, false).unwrap();
2038
2039 let mut expected_start_bytes = BytesMut::new();
2040 expected_start_bytes.extend_from_slice(&encoded_attributes);
2041 expected_start_bytes.extend_from_slice(expected_start.as_bytes());
2042 unordered_assert_eq(buf, expected_start_bytes, expected_middle);
2043
2044 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
2045 assert_eq!(
2046 len,
2047 expected_start.as_bytes().len() + expected_middle_len + encoded_attributes.len(),
2048 "non empty expected len is correct with attrs"
2049 );
2050 }
2051
2052 fn encode_and_verify_non_empty_with_attributes(input: &BytesFrame, expected: &str) {
2053 let (attributes, encoded_attributes) = create_attributes();
2054 let mut frame = input.clone();
2055 frame.add_attributes(attributes).unwrap();
2056
2057 let mut buf = BytesMut::new();
2058 buf.extend_from_slice(PADDING.as_bytes());
2059
2060 let len = complete::extend_encode(&mut buf, &frame, false).unwrap();
2061 let mut expected_bytes = BytesMut::new();
2062 expected_bytes.extend_from_slice(PADDING.as_bytes());
2063 expected_bytes.extend_from_slice(&encoded_attributes);
2064 expected_bytes.extend_from_slice(expected.as_bytes());
2065
2066 assert_eq!(buf, expected_bytes, "empty buf contents match with attrs");
2067 assert_eq!(
2068 len,
2069 expected.as_bytes().len() + encoded_attributes.len() + PADDING.as_bytes().len(),
2070 "empty expected len is correct with attrs"
2071 );
2072 }
2073
2074 fn encode_and_verify_non_empty_with_attributes_unordered(
2075 input: &BytesFrame,
2076 expected_start: &str,
2077 expected_middle: &[&str],
2078 ) {
2079 let (attributes, encoded_attributes) = create_attributes();
2080 let mut frame = input.clone();
2081 frame.add_attributes(attributes).unwrap();
2082
2083 let mut buf = BytesMut::new();
2084 buf.extend_from_slice(PADDING.as_bytes());
2085
2086 let len = complete::extend_encode(&mut buf, &frame, false).unwrap();
2087 let mut expected_start_bytes = BytesMut::new();
2088 expected_start_bytes.extend_from_slice(PADDING.as_bytes());
2089 expected_start_bytes.extend_from_slice(&encoded_attributes);
2090 expected_start_bytes.extend_from_slice(expected_start.as_bytes());
2091 unordered_assert_eq(buf, expected_start_bytes, expected_middle);
2092
2093 let expected_middle_len: usize = expected_middle.iter().map(|x| x.as_bytes().len()).sum();
2094 assert_eq!(
2095 len,
2096 expected_start.as_bytes().len() + expected_middle_len + encoded_attributes.len() + PADDING.as_bytes().len(),
2097 "empty expected len is correct with attrs"
2098 );
2099 }
2100
2101 #[test]
2104 fn should_encode_llen_req_example() {
2105 let expected = "*2\r\n$4\r\nLLEN\r\n$6\r\nmylist\r\n";
2106 let input = blobstring_array(vec!["LLEN", "mylist"]);
2107
2108 encode_and_verify_empty(&input, expected);
2109 encode_and_verify_non_empty(&input, expected);
2110 encode_and_verify_empty_with_attributes(&input, expected);
2111 encode_and_verify_non_empty_with_attributes(&input, expected);
2112 }
2113
2114 #[test]
2115 fn should_encode_incr_req_example() {
2116 let expected = "*2\r\n$4\r\nINCR\r\n$5\r\nmykey\r\n";
2117 let input = blobstring_array(vec!["INCR", "mykey"]);
2118
2119 encode_and_verify_empty(&input, expected);
2120 encode_and_verify_non_empty(&input, expected);
2121 encode_and_verify_empty_with_attributes(&input, expected);
2122 encode_and_verify_non_empty_with_attributes(&input, expected);
2123 }
2124
2125 #[test]
2126 fn should_encode_bitcount_req_example() {
2127 let expected = "*2\r\n$8\r\nBITCOUNT\r\n$5\r\nmykey\r\n";
2128 let input = blobstring_array(vec!["BITCOUNT", "mykey"]);
2129
2130 encode_and_verify_empty(&input, expected);
2131 encode_and_verify_non_empty(&input, expected);
2132 encode_and_verify_empty_with_attributes(&input, expected);
2133 encode_and_verify_non_empty_with_attributes(&input, expected);
2134 }
2135
2136 #[test]
2137 fn should_encode_array_bulk_string_test() {
2138 let expected = "*3\r\n$5\r\nWATCH\r\n$6\r\nWIBBLE\r\n$9\r\nfooBARbaz\r\n";
2139 let input = blobstring_array(vec!["WATCH", "WIBBLE", "fooBARbaz"]);
2140
2141 encode_and_verify_empty(&input, expected);
2142 encode_and_verify_non_empty(&input, expected);
2143 encode_and_verify_empty_with_attributes(&input, expected);
2144 encode_and_verify_non_empty_with_attributes(&input, expected);
2145 }
2146
2147 #[test]
2148 fn should_encode_array_null_test() {
2149 let expected = "*3\r\n$4\r\nHSET\r\n$3\r\nfoo\r\n_\r\n";
2150 let mut input = blobstring_array(vec!["HSET", "foo"]);
2151 push_frame_to_array(&mut input, BytesFrame::Null);
2152
2153 encode_and_verify_empty(&input, expected);
2154 encode_and_verify_non_empty(&input, expected);
2155 }
2156
2157 #[test]
2158 fn should_encode_raw_llen_req_example() {
2159 let expected = "*2\r\n$4\r\nLLEN\r\n$6\r\nmylist\r\n";
2160 let input = blobstring_array(vec!["LLEN", "mylist"]);
2161
2162 encode_raw_and_verify_empty(&input, expected);
2163 }
2164
2165 #[test]
2166 fn should_encode_raw_incr_req_example() {
2167 let expected = "*2\r\n$4\r\nINCR\r\n$5\r\nmykey\r\n";
2168 let input = blobstring_array(vec!["INCR", "mykey"]);
2169
2170 encode_raw_and_verify_empty(&input, expected);
2171 }
2172
2173 #[test]
2174 fn should_encode_raw_bitcount_req_example() {
2175 let expected = "*2\r\n$8\r\nBITCOUNT\r\n$5\r\nmykey\r\n";
2176 let input = blobstring_array(vec!["BITCOUNT", "mykey"]);
2177
2178 encode_raw_and_verify_empty(&input, expected);
2179 }
2180
2181 #[test]
2182 fn should_encode_raw_array_bulk_string_test() {
2183 let expected = "*3\r\n$5\r\nWATCH\r\n$6\r\nWIBBLE\r\n$9\r\nfooBARbaz\r\n";
2184 let input = blobstring_array(vec!["WATCH", "WIBBLE", "fooBARbaz"]);
2185
2186 encode_raw_and_verify_empty(&input, expected);
2187 }
2188
2189 #[test]
2190 fn should_encode_raw_array_null_test() {
2191 let expected = "*3\r\n$4\r\nHSET\r\n$3\r\nfoo\r\n_\r\n";
2192 let mut input = blobstring_array(vec!["HSET", "foo"]);
2193 push_frame_to_array(&mut input, BytesFrame::Null);
2194
2195 encode_raw_and_verify_empty(&input, expected);
2196 }
2197
2198 #[test]
2199 fn should_encode_moved_error() {
2200 let expected = "-MOVED 3999 127.0.0.1:6381\r\n";
2201 let input = (FrameKind::SimpleError, "MOVED 3999 127.0.0.1:6381")
2202 .try_into()
2203 .unwrap();
2204
2205 encode_and_verify_empty(&input, expected);
2206 encode_and_verify_non_empty(&input, expected);
2207 encode_and_verify_empty_with_attributes(&input, expected);
2208 encode_and_verify_non_empty_with_attributes(&input, expected);
2209 }
2210
2211 #[test]
2212 fn should_encode_ask_error() {
2213 let expected = "-ASK 3999 127.0.0.1:6381\r\n";
2214 let input = (FrameKind::SimpleError, "ASK 3999 127.0.0.1:6381").try_into().unwrap();
2215
2216 encode_and_verify_empty(&input, expected);
2217 encode_and_verify_non_empty(&input, expected);
2218 encode_and_verify_empty_with_attributes(&input, expected);
2219 encode_and_verify_non_empty_with_attributes(&input, expected);
2220 }
2221
2222 #[test]
2223 fn should_encode_error() {
2224 let expected = "-WRONGTYPE Operation against a key holding the wrong kind of value\r\n";
2225 let input = (
2226 FrameKind::SimpleError,
2227 "WRONGTYPE Operation against a key holding the wrong kind of value",
2228 )
2229 .try_into()
2230 .unwrap();
2231
2232 encode_and_verify_empty(&input, expected);
2233 encode_and_verify_non_empty(&input, expected);
2234 encode_and_verify_empty_with_attributes(&input, expected);
2235 encode_and_verify_non_empty_with_attributes(&input, expected);
2236 }
2237
2238 #[test]
2239 fn should_encode_simplestring() {
2240 let expected = "+OK\r\n";
2241 let input = (FrameKind::SimpleString, "OK").try_into().unwrap();
2242
2243 encode_and_verify_empty(&input, expected);
2244 encode_and_verify_non_empty(&input, expected);
2245 encode_and_verify_empty_with_attributes(&input, expected);
2246 encode_and_verify_non_empty_with_attributes(&input, expected);
2247 }
2248
2249 #[test]
2250 fn should_encode_number() {
2251 let expected = ":1000\r\n";
2252 let input: BytesFrame = 1000.into();
2253
2254 encode_and_verify_empty(&input, expected);
2255 encode_and_verify_non_empty(&input, expected);
2256 encode_and_verify_empty_with_attributes(&input, expected);
2257 encode_and_verify_non_empty_with_attributes(&input, expected);
2258 }
2259
2260 #[test]
2261 fn should_encode_negative_number() {
2262 let expected = ":-1000\r\n";
2263 let input: BytesFrame = (-1000).into();
2264
2265 encode_and_verify_empty(&input, expected);
2266 encode_and_verify_non_empty(&input, expected);
2267 encode_and_verify_empty_with_attributes(&input, expected);
2268 encode_and_verify_non_empty_with_attributes(&input, expected);
2269 }
2270
2271 #[test]
2272 fn should_encode_number_as_blobstring() {
2274 let expected = "$4\r\n1000\r\n";
2275 let input: BytesFrame = 1000.into();
2276
2277 let mut buf = BytesMut::new();
2278 let len = complete::extend_encode(&mut buf, &input, true).unwrap();
2279 assert_eq!(
2280 buf,
2281 expected.as_bytes(),
2282 "empty buf contents match {:?} == {:?}",
2283 str::from_utf8(&buf),
2284 expected
2285 );
2286 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
2287
2288 let (attributes, encoded_attributes) = create_attributes_as_blobstring();
2289 let mut frame = input.clone();
2290 frame.add_attributes(attributes).unwrap();
2291 let mut buf = BytesMut::new();
2292 let len = complete::extend_encode(&mut buf, &frame, true).unwrap();
2293
2294 let mut expected_bytes = BytesMut::new();
2295 expected_bytes.extend_from_slice(&encoded_attributes);
2296 expected_bytes.extend_from_slice(expected.as_bytes());
2297 assert_eq!(buf, expected_bytes, "non empty buf contents match with attrs");
2298 assert_eq!(
2299 len,
2300 expected.as_bytes().len() + encoded_attributes.len(),
2301 "non empty expected len is correct with attrs"
2302 );
2303 }
2304
2305 #[test]
2306 fn should_encode_negative_number_as_blobstring() {
2308 let expected = "$5\r\n-1000\r\n";
2309 let input: BytesFrame = (-1000).into();
2310
2311 let mut buf = BytesMut::new();
2312 let len = complete::extend_encode(&mut buf, &input, true).unwrap();
2313 assert_eq!(
2314 buf,
2315 expected.as_bytes(),
2316 "empty buf contents match {:?} == {:?}",
2317 str::from_utf8(&buf),
2318 expected
2319 );
2320 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
2321
2322 let (attributes, encoded_attributes) = create_attributes_as_blobstring();
2323 let mut frame = input.clone();
2324 frame.add_attributes(attributes).unwrap();
2325 let mut buf = BytesMut::new();
2326 let len = complete::extend_encode(&mut buf, &frame, true).unwrap();
2327
2328 let mut expected_bytes = BytesMut::new();
2329 expected_bytes.extend_from_slice(&encoded_attributes);
2330 expected_bytes.extend_from_slice(expected.as_bytes());
2331 assert_eq!(buf, expected_bytes, "non empty buf contents match with attrs");
2332 assert_eq!(
2333 len,
2334 expected.as_bytes().len() + encoded_attributes.len(),
2335 "non empty expected len is correct with attrs"
2336 );
2337 }
2338
2339 #[test]
2340 fn should_encode_negative_number_as_blobstring_overflow() {
2342 let expected = "$10\r\n-999999999\r\n";
2343 let input: BytesFrame = (-999999999).into();
2344
2345 let mut buf = BytesMut::new();
2346 let len = complete::extend_encode(&mut buf, &input, true).unwrap();
2347 assert_eq!(
2348 buf,
2349 expected.as_bytes(),
2350 "empty buf contents match {:?} == {:?}",
2351 str::from_utf8(&buf),
2352 expected
2353 );
2354 assert_eq!(len, expected.as_bytes().len(), "empty expected len is correct");
2355
2356 let (attributes, encoded_attributes) = create_attributes_as_blobstring();
2357 let mut frame = input.clone();
2358 frame.add_attributes(attributes).unwrap();
2359 let mut buf = BytesMut::new();
2360 let len = complete::extend_encode(&mut buf, &frame, true).unwrap();
2361
2362 let mut expected_bytes = BytesMut::new();
2363 expected_bytes.extend_from_slice(&encoded_attributes);
2364 expected_bytes.extend_from_slice(expected.as_bytes());
2365 assert_eq!(buf, expected_bytes, "non empty buf contents match with attrs");
2366 assert_eq!(
2367 len,
2368 expected.as_bytes().len() + encoded_attributes.len(),
2369 "non empty expected len is correct with attrs"
2370 );
2371 }
2372
2373 #[test]
2376 fn should_encode_bool_true() {
2377 let expected = BOOL_TRUE_BYTES;
2378 let input: BytesFrame = true.into();
2379
2380 encode_and_verify_empty(&input, expected);
2381 encode_and_verify_non_empty(&input, expected);
2382 encode_and_verify_empty_with_attributes(&input, expected);
2383 encode_and_verify_non_empty_with_attributes(&input, expected);
2384 }
2385
2386 #[test]
2387 fn should_encode_bool_false() {
2388 let expected = BOOL_FALSE_BYTES;
2389 let input: BytesFrame = false.into();
2390
2391 encode_and_verify_empty(&input, expected);
2392 encode_and_verify_non_empty(&input, expected);
2393 encode_and_verify_empty_with_attributes(&input, expected);
2394 encode_and_verify_non_empty_with_attributes(&input, expected);
2395 }
2396
2397 #[test]
2398 fn should_encode_double_positive() {
2399 let expected = ",12.34567\r\n";
2400 let input: BytesFrame = 12.34567.try_into().unwrap();
2401
2402 encode_and_verify_empty(&input, expected);
2403 encode_and_verify_non_empty(&input, expected);
2404 encode_and_verify_empty_with_attributes(&input, expected);
2405 encode_and_verify_non_empty_with_attributes(&input, expected);
2406 }
2407
2408 #[test]
2409 fn should_encode_double_negative() {
2410 let expected = ",-12.34567\r\n";
2411 let input: BytesFrame = (-12.34567).try_into().unwrap();
2412
2413 encode_and_verify_empty(&input, expected);
2414 encode_and_verify_non_empty(&input, expected);
2415 encode_and_verify_empty_with_attributes(&input, expected);
2416 encode_and_verify_non_empty_with_attributes(&input, expected);
2417 }
2418
2419 #[test]
2420 fn should_encode_double_nan() {
2421 let expected = ",nan\r\n";
2422 let input = BytesFrame::Double {
2423 data: f64::NAN,
2424 attributes: None,
2425 };
2426
2427 encode_and_verify_empty(&input, expected);
2428 encode_and_verify_non_empty(&input, expected);
2429 encode_and_verify_empty_with_attributes(&input, expected);
2430 encode_and_verify_non_empty_with_attributes(&input, expected);
2431 }
2432
2433 #[test]
2434 fn should_encode_double_inf() {
2435 let expected = ",inf\r\n";
2436 let input: BytesFrame = f64::INFINITY.try_into().unwrap();
2437
2438 encode_and_verify_empty(&input, expected);
2439 encode_and_verify_non_empty(&input, expected);
2440 encode_and_verify_empty_with_attributes(&input, expected);
2441 encode_and_verify_non_empty_with_attributes(&input, expected);
2442 }
2443
2444 #[test]
2445 fn should_encode_double_neg_inf() {
2446 let expected = ",-inf\r\n";
2447 let input: BytesFrame = f64::NEG_INFINITY.try_into().unwrap();
2448
2449 encode_and_verify_empty(&input, expected);
2450 encode_and_verify_non_empty(&input, expected);
2451 encode_and_verify_empty_with_attributes(&input, expected);
2452 encode_and_verify_non_empty_with_attributes(&input, expected);
2453 }
2454
2455 #[test]
2456 fn should_encode_bignumber() {
2457 let expected = "(3492890328409238509324850943850943825024385\r\n";
2458 let input: BytesFrame = (
2459 FrameKind::BigNumber,
2460 "3492890328409238509324850943850943825024385".as_bytes().to_vec(),
2461 )
2462 .try_into()
2463 .unwrap();
2464
2465 encode_and_verify_empty(&input, expected);
2466 encode_and_verify_non_empty(&input, expected);
2467 encode_and_verify_empty_with_attributes(&input, expected);
2468 encode_and_verify_non_empty_with_attributes(&input, expected);
2469 }
2470
2471 #[test]
2472 fn should_encode_null() {
2473 let expected = "_\r\n";
2474 let input = BytesFrame::Null;
2475
2476 encode_and_verify_empty(&input, expected);
2477 encode_and_verify_non_empty(&input, expected);
2478 }
2479
2480 #[test]
2481 fn should_encode_blobstring() {
2482 let expected = "$9\r\nfoobarbaz\r\n";
2483 let input: BytesFrame = (FrameKind::BlobString, "foobarbaz").try_into().unwrap();
2484
2485 encode_and_verify_empty(&input, expected);
2486 encode_and_verify_non_empty(&input, expected);
2487 encode_and_verify_empty_with_attributes(&input, expected);
2488 encode_and_verify_non_empty_with_attributes(&input, expected);
2489 }
2490
2491 #[test]
2492 fn should_encode_bloberror() {
2493 let expected = "!21\r\nSYNTAX invalid syntax\r\n";
2494 let input: BytesFrame = (FrameKind::BlobError, "SYNTAX invalid syntax").try_into().unwrap();
2495
2496 encode_and_verify_empty(&input, expected);
2497 encode_and_verify_non_empty(&input, expected);
2498 encode_and_verify_empty_with_attributes(&input, expected);
2499 encode_and_verify_non_empty_with_attributes(&input, expected);
2500 }
2501
2502 #[test]
2503 fn should_encode_verbatimstring_txt() {
2504 let expected = "=15\r\ntxt:Some string\r\n";
2505 let input = BytesFrame::VerbatimString {
2506 format: VerbatimStringFormat::Text,
2507 data: "Some string".as_bytes().into(),
2508 attributes: None,
2509 };
2510
2511 encode_and_verify_empty(&input, expected);
2512 encode_and_verify_non_empty(&input, expected);
2513 encode_and_verify_empty_with_attributes(&input, expected);
2514 encode_and_verify_non_empty_with_attributes(&input, expected);
2515 }
2516
2517 #[test]
2518 fn should_encode_verbatimstring_mkd() {
2519 let expected = "=15\r\nmkd:Some string\r\n";
2520 let input = BytesFrame::VerbatimString {
2521 format: VerbatimStringFormat::Markdown,
2522 data: "Some string".as_bytes().into(),
2523 attributes: None,
2524 };
2525
2526 encode_and_verify_empty(&input, expected);
2527 encode_and_verify_non_empty(&input, expected);
2528 encode_and_verify_empty_with_attributes(&input, expected);
2529 encode_and_verify_non_empty_with_attributes(&input, expected);
2530 }
2531
2532 #[test]
2533 fn should_encode_push_pubsub() {
2534 let expected = ">4\r\n+pubsub\r\n+message\r\n+somechannel\r\n+this is the message\r\n";
2535 let input = BytesFrame::Push {
2536 data: vec![
2537 (FrameKind::SimpleString, "pubsub").try_into().unwrap(),
2538 (FrameKind::SimpleString, "message").try_into().unwrap(),
2539 (FrameKind::SimpleString, "somechannel").try_into().unwrap(),
2540 (FrameKind::SimpleString, "this is the message").try_into().unwrap(),
2541 ],
2542 attributes: None,
2543 };
2544
2545 assert!(input.is_normal_pubsub_message());
2546 encode_and_verify_empty(&input, expected);
2547 encode_and_verify_non_empty(&input, expected);
2548 encode_and_verify_empty_with_attributes(&input, expected);
2549 encode_and_verify_non_empty_with_attributes(&input, expected);
2550 }
2551
2552 #[test]
2553 fn should_encode_push_keyspace_event() {
2554 let expected = ">4\r\n+pubsub\r\n+message\r\n+__keyspace@0__:mykey\r\n+del\r\n";
2555 let input = BytesFrame::Push {
2556 data: vec![
2557 (FrameKind::SimpleString, "pubsub").try_into().unwrap(),
2558 (FrameKind::SimpleString, "message").try_into().unwrap(),
2559 (FrameKind::SimpleString, "__keyspace@0__:mykey").try_into().unwrap(),
2560 (FrameKind::SimpleString, "del").try_into().unwrap(),
2561 ],
2562 attributes: None,
2563 };
2564
2565 assert!(input.is_normal_pubsub_message());
2566 encode_and_verify_empty(&input, expected);
2567 encode_and_verify_non_empty(&input, expected);
2568 encode_and_verify_empty_with_attributes(&input, expected);
2569 encode_and_verify_non_empty_with_attributes(&input, expected);
2570 }
2571
2572 #[test]
2573 fn should_encode_simple_set() {
2574 let expected_start = "~5\r\n";
2575 let expected_middle = ["+orange\r\n", "+apple\r\n", "#t\r\n", ":100\r\n", ":999\r\n"];
2576 let mut inner = resp3_utils::new_set(0);
2577 let v1: BytesFrame = (FrameKind::SimpleString, "orange").try_into().unwrap();
2578 let v2: BytesFrame = (FrameKind::SimpleString, "apple").try_into().unwrap();
2579 let v3: BytesFrame = true.into();
2580 let v4: BytesFrame = 100.into();
2581 let v5: BytesFrame = 999.into();
2582
2583 inner.insert(v1);
2584 inner.insert(v2);
2585 inner.insert(v3);
2586 inner.insert(v4);
2587 inner.insert(v5);
2588 let input = BytesFrame::Set {
2589 data: inner,
2590 attributes: None,
2591 };
2592
2593 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
2594 encode_and_verify_non_empty_unordered(&input, expected_start, &expected_middle);
2595 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2596 encode_and_verify_non_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2597 }
2598
2599 #[test]
2600 fn should_encode_simple_map() {
2601 let expected_start = "%2\r\n";
2602 let expected_middle = ["+first\r\n:1\r\n", "+second\r\n:2\r\n"];
2603 let mut inner = resp3_utils::new_map(0);
2604 let k1: BytesFrame = (FrameKind::SimpleString, "first").try_into().unwrap();
2605 let v1: BytesFrame = 1.into();
2606 let k2: BytesFrame = (FrameKind::SimpleString, "second").try_into().unwrap();
2607 let v2: BytesFrame = 2.into();
2608
2609 inner.insert(k1, v1);
2610 inner.insert(k2, v2);
2611 let input = BytesFrame::Map {
2612 data: inner,
2613 attributes: None,
2614 };
2615
2616 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
2617 encode_and_verify_non_empty_unordered(&input, expected_start, &expected_middle);
2618 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2619 encode_and_verify_non_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2620 }
2621
2622 #[test]
2623 fn should_encode_nested_map() {
2624 let expected_start = "%2\r\n";
2625 let expected_middle = ["+first\r\n:1\r\n", "+second\r\n%1\r\n+third\r\n:3\r\n"];
2626 let mut inner = resp3_utils::new_map(0);
2627 let k1: BytesFrame = (FrameKind::SimpleString, "first").try_into().unwrap();
2628 let v1: BytesFrame = 1.into();
2629 let k2: BytesFrame = (FrameKind::SimpleString, "second").try_into().unwrap();
2630 let k3: BytesFrame = (FrameKind::SimpleString, "third").try_into().unwrap();
2631 let v3: BytesFrame = 3.into();
2632
2633 let mut v2_inner = resp3_utils::new_map(0);
2634 v2_inner.insert(k3, v3);
2635 let v2 = BytesFrame::Map {
2636 data: v2_inner,
2637 attributes: None,
2638 };
2639
2640 inner.insert(k1, v1);
2641 inner.insert(k2, v2);
2642 let input = BytesFrame::Map {
2643 data: inner,
2644 attributes: None,
2645 };
2646
2647 encode_and_verify_empty_unordered(&input, expected_start, &expected_middle);
2648 encode_and_verify_non_empty_unordered(&input, expected_start, &expected_middle);
2649 encode_and_verify_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2650 encode_and_verify_non_empty_with_attributes_unordered(&input, expected_start, &expected_middle);
2651 }
2652
2653 #[test]
2654 fn should_encode_hello() {
2655 let expected = "HELLO 3\r\n";
2656 let input = BytesFrame::Hello {
2657 version: RespVersion::RESP3,
2658 auth: None,
2659 setname: None,
2660 };
2661
2662 encode_and_verify_empty(&input, expected);
2663 encode_and_verify_non_empty(&input, expected);
2664
2665 let expected = "HELLO 2\r\n";
2666 let input = BytesFrame::Hello {
2667 version: RespVersion::RESP2,
2668 auth: None,
2669 setname: None,
2670 };
2671
2672 encode_and_verify_empty(&input, expected);
2673 encode_and_verify_non_empty(&input, expected);
2674 }
2675
2676 #[test]
2677 fn should_encode_hello_with_auth() {
2678 let expected = "HELLO 3 AUTH default mypassword\r\n";
2679 let input = BytesFrame::Hello {
2680 version: RespVersion::RESP3,
2681 auth: Some(("default".into(), "mypassword".into())),
2682 setname: None,
2683 };
2684
2685 encode_and_verify_empty(&input, expected);
2686 encode_and_verify_non_empty(&input, expected);
2687 }
2688
2689 #[test]
2690 fn should_encode_hello_with_auth_and_setname() {
2691 let expected = "HELLO 3 AUTH default mypassword SETNAME myname\r\n";
2692 let input = BytesFrame::Hello {
2693 version: RespVersion::RESP3,
2694 auth: Some(("default".into(), "mypassword".into())),
2695 setname: Some("myname".into()),
2696 };
2697
2698 encode_and_verify_empty(&input, expected);
2699 encode_and_verify_non_empty(&input, expected);
2700 }
2701
2702 #[test]
2703 fn should_encode_streaming_blobstring() {
2704 let expected = "$?\r\n;2\r\nhe\r\n;4\r\nllow\r\n;1\r\no\r\n;3\r\nrld\r\n;0\r\n";
2705 let chunk1 = "he";
2706 let chunk2 = "llow";
2707 let chunk3 = "o";
2708 let chunk4 = "rld";
2709
2710 let mut buf = BytesMut::new();
2711 utils::zero_extend(&mut buf, expected.as_bytes().len());
2712 let mut offset = 0;
2713
2714 offset = streaming::encode_start_string(&mut buf, offset).unwrap();
2715 offset = streaming::encode_string_chunk(&mut buf, offset, chunk1.as_bytes()).unwrap();
2716 offset = streaming::encode_string_chunk(&mut buf, offset, chunk2.as_bytes()).unwrap();
2717 offset = streaming::encode_string_chunk(&mut buf, offset, chunk3.as_bytes()).unwrap();
2718 offset = streaming::encode_string_chunk(&mut buf, offset, chunk4.as_bytes()).unwrap();
2719 offset = streaming::encode_end_string(&mut buf, offset).unwrap();
2720
2721 assert_eq!(offset, expected.as_bytes().len());
2722 assert_eq!(buf, expected);
2723 }
2724
2725 #[test]
2726 fn should_encode_streaming_array() {
2727 let expected = "*?\r\n:1\r\n+foo\r\n#f\r\n$9\r\nfoobarbaz\r\n.\r\n";
2728 let chunk1 = BytesFrame::Number {
2729 data: 1,
2730 attributes: None,
2731 };
2732 let chunk2 = BytesFrame::SimpleString {
2733 data: "foo".into(),
2734 attributes: None,
2735 };
2736 let chunk3 = BytesFrame::Boolean {
2737 data: false,
2738 attributes: None,
2739 };
2740 let chunk4 = BytesFrame::BlobString {
2741 data: "foobarbaz".as_bytes().into(),
2742 attributes: None,
2743 };
2744
2745 let mut buf = BytesMut::new();
2746 utils::zero_extend(&mut buf, expected.as_bytes().len());
2747 let mut offset = 0;
2748
2749 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Array).unwrap();
2750 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk1, false).unwrap();
2751 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk2, false).unwrap();
2752 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk3, false).unwrap();
2753 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk4, false).unwrap();
2754 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
2755
2756 assert_eq!(offset, expected.as_bytes().len());
2757 assert_eq!(buf, expected);
2758 }
2759
2760 #[test]
2761 fn should_encode_streaming_set() {
2762 let expected = "~?\r\n:1\r\n+foo\r\n#f\r\n$9\r\nfoobarbaz\r\n.\r\n";
2763 let chunk1 = BytesFrame::Number {
2764 data: 1,
2765 attributes: None,
2766 };
2767 let chunk2 = BytesFrame::SimpleString {
2768 data: "foo".into(),
2769 attributes: None,
2770 };
2771 let chunk3 = BytesFrame::Boolean {
2772 data: false,
2773 attributes: None,
2774 };
2775 let chunk4 = BytesFrame::BlobString {
2776 data: "foobarbaz".as_bytes().into(),
2777 attributes: None,
2778 };
2779
2780 let mut buf = BytesMut::new();
2781 utils::zero_extend(&mut buf, expected.as_bytes().len());
2782 let mut offset = 0;
2783
2784 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Set).unwrap();
2785 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk1, false).unwrap();
2786 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk2, false).unwrap();
2787 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk3, false).unwrap();
2788 offset = streaming::encode_bytes_aggregate_type_inner_value(&mut buf, offset, &chunk4, false).unwrap();
2789 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
2790
2791 assert_eq!(offset, expected.as_bytes().len());
2792 assert_eq!(buf, expected);
2793 }
2794
2795 #[test]
2796 fn should_encode_streaming_map() {
2797 let expected = "%?\r\n+a\r\n:1\r\n+b\r\n:2\r\n.\r\n";
2798 let k1 = BytesFrame::SimpleString {
2799 data: "a".into(),
2800 attributes: None,
2801 };
2802 let v1 = BytesFrame::Number {
2803 data: 1,
2804 attributes: None,
2805 };
2806 let k2 = BytesFrame::SimpleString {
2807 data: "b".into(),
2808 attributes: None,
2809 };
2810 let v2 = BytesFrame::Number {
2811 data: 2,
2812 attributes: None,
2813 };
2814
2815 let mut buf = BytesMut::new();
2816 utils::zero_extend(&mut buf, expected.as_bytes().len());
2817 let mut offset = 0;
2818
2819 offset = streaming::encode_start_aggregate_type(&mut buf, offset, FrameKind::Map).unwrap();
2820 offset = streaming::encode_bytes_aggregate_type_inner_kv_pair(&mut buf, offset, &k1, &v1, false).unwrap();
2821 offset = streaming::encode_bytes_aggregate_type_inner_kv_pair(&mut buf, offset, &k2, &v2, false).unwrap();
2822 offset = streaming::encode_end_aggregate_type(&mut buf, offset).unwrap();
2823
2824 assert_eq!(offset, expected.as_bytes().len());
2825 assert_eq!(buf, expected);
2826 }
2827}