redis_protocol/resp3/
encode.rs

1//! Functions for encoding Frames into the RESP3 protocol.
2//!
3//! <https://github.com/antirez/RESP3/blob/master/spec.md>
4
5use 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    // a more optimized way to encode an i64 as a BulkString, which is how Redis expects integers in practice
85    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    // signal the end of the chunked stream
545    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
671/// Encoding functions for complete frames.
672///
673/// ## Examples
674///
675/// ### Using owned types:
676///
677/// ```rust
678/// # use redis_protocol::resp3::encode::complete::*;
679/// # use redis_protocol::resp3::types::{OwnedFrame, FrameKind, Resp3Frame};
680/// use std::net::TcpStream;
681/// # use std::io::Write;
682/// fn example(socket: &mut TcpStream) {
683///   // in many cases the starting buffer won't be empty, so this example shows how to track the offset as well
684///   let frame = OwnedFrame::Array {
685///     // send `HGET foo bar`
686///     data: vec![
687///       OwnedFrame::BlobString { data: "HGET".into(), attributes: None },
688///       OwnedFrame::BlobString { data: "foo".into(), attributes: None },
689///       OwnedFrame::BlobString { data: "bar".into(), attributes: None },
690///     ],
691///     attributes: None
692///   };
693///   let mut buf = Vec::with_capacity(frame.encode_len(false));
694///   let amt = encode(&mut buf, &frame, false).expect("Failed to encode frame");
695///   debug_assert_eq!(buf.len(), amt);
696///
697///   socket.write_all(&buf).expect("Failed to write to socket");
698/// }
699/// ```
700///
701/// ### Using bytes types with Tokio:
702///
703/// ```rust
704/// # use redis_protocol::resp3::encode::complete::*;
705/// # use redis_protocol::resp3::types::{BytesFrame, FrameKind};
706/// # use bytes::BytesMut;
707/// use tokio::net::TcpStream;
708/// # use tokio::io::AsyncWriteExt;
709/// async fn example(socket: &mut TcpStream, buf: &mut BytesMut) {
710///   // in many cases the starting buffer won't be empty, so this example shows how to track the offset as well
711///   let frame = BytesFrame::Array {
712///     // send `HGET foo bar`
713///     data: vec![
714///       BytesFrame::BlobString { data: "HGET".into(), attributes: None },
715///       BytesFrame::BlobString { data: "foo".into(), attributes: None },
716///       BytesFrame::BlobString { data: "bar".into(), attributes: None },
717///     ],
718///     attributes: None
719///   };
720///   let amt = extend_encode(buf, &frame, false).expect("Failed to encode frame");
721///
722///   socket.write_all(&buf).await.expect("Failed to write to socket");
723///   let _ = buf.split_to(amt);
724/// }
725/// ```
726pub mod complete {
727  use super::*;
728
729  /// Attempt to encode a frame into `buf`.
730  ///
731  /// The caller is responsible for extending `buf` if a `BufferTooSmall` error is returned.
732  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  /// Attempt to encode a borrowed frame into `buf`.
740  ///
741  /// The caller is responsible for extending `buf` if a `BufferTooSmall` error is returned.
742  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  /// Attempt to encode a frame into `buf`.
754  ///
755  /// The caller is responsible for extending `buf` if a `BufferTooSmall` error is returned.
756  ///
757  /// Returns the number of bytes encoded.
758  #[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  /// Attempt to encode a frame at the end of `buf`, extending the buffer before encoding.
772  ///
773  /// Returns the number of bytes encoded.
774  #[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  /// Attempt to encode a borrowed frame at the end of `buf`, extending the buffer before encoding.
791  ///
792  /// Returns the number of bytes encoded.
793  #[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
810/// Encoding functions for streaming blobs and aggregate types.
811///
812/// ### Using `Bytes` and Tokio
813///
814/// Stream an array of frames via a Tokio unbounded channel.
815///
816/// ```rust no_run
817/// # use redis_protocol::{zero_extend, resp3::{encode::streaming::*, types::{BytesFrame, FrameKind, Resp3Frame}}, error::RedisProtocolError};
818/// # use bytes::BytesMut;
819/// # use std::{future::Future, time::Duration};
820/// # use tokio::{net::TcpStream, time::sleep, io::{AsyncWrite, AsyncWriteExt}};
821/// # use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
822///
823/// async fn write_all(socket: &mut TcpStream, buf: &mut BytesMut) -> usize {
824///   let len = buf.len();
825///   socket.write_all(&buf).await.expect("Failed to write to socket.");
826///   // we could just clear the buffer here since we use `write_all`, but in many cases it's common to not flush the socket on
827///   // each `write` call. in those scenarios the caller should split the buffer based on the result from `write`.
828///   let _ = buf.split_to(len);
829///   len
830/// }
831///
832/// /// Start a new array stream, sending frames received from `rx` out to `socket` and ending the stream when `rx` closes.
833/// async fn stream_array(socket: &mut TcpStream, mut rx: UnboundedReceiver<BytesFrame>) {
834///   let mut buf = BytesMut::new();
835///   let mut written = 0;
836///
837///   zero_extend(&mut buf, START_STREAM_ENCODE_LEN);
838///   encode_start_aggregate_type(&mut buf, 0, FrameKind::Array).unwrap();
839///   written += write_all(socket, &mut buf).await;
840///
841///   while let Some(frame) = rx.recv().await {
842///     zero_extend(&mut buf, frame.encode_len(false));
843///     encode_bytes_aggregate_type_inner_value(&mut buf, 0, &frame, false).unwrap();
844///     written += write_all(socket, &mut buf).await;
845///   }
846///
847///   zero_extend(&mut buf, END_STREAM_AGGREGATE_TYPE_ENCODE_LEN);
848///   encode_end_aggregate_type(&mut buf, 0).unwrap();
849///   written += write_all(socket, &mut buf).await;
850///
851///   println!("Streamed {} bytes to the socket.", written);
852/// }
853///
854/// async fn generate_frames(tx: UnboundedSender<BytesFrame>) {
855///   // read from another socket or somehow generate frames
856///   sleep(Duration::from_secs(1)).await;
857///   tx.send(BytesFrame::BlobString { data: "foo".into(), attributes: None }).unwrap();
858///   sleep(Duration::from_secs(1)).await;
859///   tx.send(BytesFrame::BlobString { data: "bar".into(), attributes: None }).unwrap();
860///   sleep(Duration::from_secs(1)).await;
861///   tx.send(BytesFrame::BlobString { data: "baz".into(), attributes: None }).unwrap();
862/// }
863///
864/// #[tokio::main]
865/// async fn main() {
866///   let (tx, rx) = unbounded_channel();
867///   let mut socket = TcpStream::connect("127.0.0.1:6379").await.unwrap();
868///
869///   tokio::spawn(generate_frames(tx));
870///   stream_array(&mut socket, rx).await;
871/// }
872/// ```
873pub mod streaming {
874  use super::*;
875
876  /// Number of bytes needed to encode the prefix when starting a stream.
877  pub const START_STREAM_ENCODE_LEN: usize = 4;
878  /// Number of bytes needed to encode the terminating bytes after a blob string.
879  pub const END_STREAM_STRING_ENCODE_LEN: usize = 4;
880  /// Number of bytes needed to encode the terminating bytes after an aggregate type.
881  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  /// Encode the starting bytes in a streaming blob string.
979  ///
980  /// Returns the new offset in `buf`.
981  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  /// Encode the bytes making up one chunk of a streaming blob string.
990  ///
991  /// If `data` is empty this will do the same thing as [encode_end_string] to signal that the streamed string is
992  /// finished.
993  ///
994  /// Returns the new offset in `buf`.
995  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  /// Encode the terminating bytes at the end of a streaming blob string.
1004  ///
1005  /// Returns the new offset in `buf`.
1006  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  /// Encode the starting bytes for a streaming aggregate type (array, set, or map).
1015  ///
1016  /// Returns the new offset in `buf`.
1017  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  /// Encode the inner frame inside a streamed array or set.
1033  ///
1034  /// Use [encode_owned_aggregate_type_inner_kv_pair] to encode a key-value pair inside a streaming map.
1035  ///
1036  /// Returns the new offset in `buf`.
1037  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  /// Encode the inner borrowed frame inside a streamed array or set.
1051  ///
1052  /// Use [encode_borrowed_aggregate_type_inner_kv_pair] to encode a key-value pair inside a streaming map.
1053  ///
1054  /// Returns the new offset in `buf`.
1055  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  /// Encode the inner frames that make up a key-value pair in a streamed map.
1069  ///
1070  /// Returns the new offset in `buf`.
1071  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  /// Encode the inner borrowed frames that make up a key-value pair in a streamed map.
1090  ///
1091  /// Returns the new offset in `buf`.
1092  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  /// Encode the inner frame inside a streamed array or set.
1111  ///
1112  /// Use [encode_bytes_aggregate_type_inner_kv_pair] to encode a key-value pair inside a streaming map.
1113  ///
1114  /// Returns the new offset in `buf`.
1115  #[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  /// Encode the inner frames that make up a key-value pair in a streamed map.
1131  ///
1132  /// Returns the new offset in `buf`.
1133  #[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  /// Encode the terminating bytes at the end of a streaming aggregate type (array, set, or map).
1154  ///
1155  /// Returns the new offset in `buf`.
1156  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// Regression tests duplicated for each frame type.
1166
1167#[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  // ------------- tests adapted from RESP2 --------------------------
1297
1298  #[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  // ------------- end tests adapted from RESP2 --------------------------
1446
1447  #[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  // ------------- tests adapted from RESP2 --------------------------
2102
2103  #[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  // TODO clean this up
2273  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  // TODO clean this up
2307  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  // TODO clean this up
2341  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  // ------------- end tests adapted from RESP2 --------------------------
2374
2375  #[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}