1mod header;
2mod request;
3mod response;
4mod value;
5
6use std::io::Cursor;
7
8pub use header::*;
9pub use request::*;
10pub use response::*;
11pub use value::*;
12
13pub type Id = String;
15
16fn read_header_bytes(input: &[u8]) -> Result<(&[u8], &[u8]), &[u8]> {
21 let mut cursor = Cursor::new(input);
22 let input_len = input.len();
23
24 let len = match rmp::decode::read_map_len(&mut cursor) {
26 Ok(x) => x,
27 Err(_) => return Err(input),
28 };
29
30 for _i in 0..len {
33 let key_len = match rmp::decode::read_str_len(&mut cursor) {
35 Ok(x) => x as u64,
36 Err(_) => return Err(input),
37 };
38
39 cursor.set_position(cursor.position() + key_len);
41
42 if cursor.position() as usize > input_len {
44 return Err(input);
45 }
46
47 let input = &input[cursor.position() as usize..];
49
50 match find_msgpack_byte_len(input) {
52 Some(len) => cursor.set_position(cursor.position() + len),
53 None => return Err(input),
54 }
55
56 if cursor.position() as usize > input_len {
58 return Err(input);
59 }
60 }
61
62 let pos = cursor.position() as usize;
63
64 if pos > input_len {
67 return Err(input);
68 }
69
70 Ok((&input[..pos], &input[pos..]))
71}
72
73fn find_msgpack_byte_len(input: &[u8]) -> Option<u64> {
81 if input.is_empty() {
82 return None;
83 }
84
85 macro_rules! read_len {
86 (u8: $input:expr $(, start = $start:expr)?) => {{
87 let input = $input;
88
89 $(
90 if input.len() < $start {
91 return None;
92 }
93 let input = &input[$start..];
94 )?
95
96 if input.is_empty() {
97 return None;
98 } else {
99 input[0] as u64
100 }
101 }};
102 (u16: $input:expr $(, start = $start:expr)?) => {{
103 let input = $input;
104
105 $(
106 if input.len() < $start {
107 return None;
108 }
109 let input = &input[$start..];
110 )?
111
112 if input.len() < 2 {
113 return None;
114 } else {
115 u16::from_be_bytes([input[0], input[1]]) as u64
116 }
117 }};
118 (u32: $input:expr $(, start = $start:expr)?) => {{
119 let input = $input;
120
121 $(
122 if input.len() < $start {
123 return None;
124 }
125 let input = &input[$start..];
126 )?
127
128 if input.len() < 4 {
129 return None;
130 } else {
131 u32::from_be_bytes([input[0], input[1], input[2], input[3]]) as u64
132 }
133 }};
134 ($cnt:expr => $input:expr $(, start = $start:expr)?) => {{
135 let input = $input;
136
137 $(
138 if input.len() < $start {
139 return None;
140 }
141 let input = &input[$start..];
142 )?
143
144 let cnt = $cnt;
145 let mut len = 0;
146 for _i in 0..cnt {
147 if input.len() < len {
148 return None;
149 }
150
151 let input = &input[len..];
152 match find_msgpack_byte_len(input) {
153 Some(x) => len += x as usize,
154 None => return None,
155 }
156 }
157 len as u64
158 }};
159 }
160
161 Some(match rmp::Marker::from_u8(input[0]) {
162 rmp::Marker::Null => 1,
164 rmp::Marker::True => 1,
165 rmp::Marker::False => 1,
166
167 rmp::Marker::FixPos(_) => 1,
169 rmp::Marker::FixNeg(_) => 1,
170 rmp::Marker::U8 => 2,
171 rmp::Marker::U16 => 3,
172 rmp::Marker::U32 => 5,
173 rmp::Marker::U64 => 9,
174 rmp::Marker::I8 => 2,
175 rmp::Marker::I16 => 3,
176 rmp::Marker::I32 => 5,
177 rmp::Marker::I64 => 9,
178
179 rmp::Marker::F32 => 5,
181 rmp::Marker::F64 => 9,
182
183 rmp::Marker::FixStr(len) => 1 + len as u64,
185 rmp::Marker::Str8 => 2 + read_len!(u8: input, start = 1),
186 rmp::Marker::Str16 => 3 + read_len!(u16: input, start = 1),
187 rmp::Marker::Str32 => 5 + read_len!(u32: input, start = 1),
188
189 rmp::Marker::Bin8 => 2 + read_len!(u8: input, start = 1),
191 rmp::Marker::Bin16 => 3 + read_len!(u16: input, start = 1),
192 rmp::Marker::Bin32 => 5 + read_len!(u32: input, start = 1),
193
194 rmp::Marker::FixArray(cnt) => 1 + read_len!(cnt => input, start = 1),
196 rmp::Marker::Array16 => {
197 let cnt = read_len!(u16: input, start = 1);
198 3 + read_len!(cnt => input, start = 3)
199 }
200 rmp::Marker::Array32 => {
201 let cnt = read_len!(u32: input, start = 1);
202 5 + read_len!(cnt => input, start = 5)
203 }
204
205 rmp::Marker::FixMap(cnt) => 1 + read_len!(2 * cnt => input, start = 1),
207 rmp::Marker::Map16 => {
208 let cnt = read_len!(u16: input, start = 1);
209 3 + read_len!(2 * cnt => input, start = 3)
210 }
211 rmp::Marker::Map32 => {
212 let cnt = read_len!(u32: input, start = 1);
213 5 + read_len!(2 * cnt => input, start = 5)
214 }
215
216 rmp::Marker::FixExt1 => 3,
218 rmp::Marker::FixExt2 => 4,
219 rmp::Marker::FixExt4 => 6,
220 rmp::Marker::FixExt8 => 10,
221 rmp::Marker::FixExt16 => 18,
222 rmp::Marker::Ext8 => 3 + read_len!(u8: input, start = 1),
223 rmp::Marker::Ext16 => 4 + read_len!(u16: input, start = 1),
224 rmp::Marker::Ext32 => 6 + read_len!(u32: input, start = 1),
225
226 rmp::Marker::Reserved => return None,
229 })
230}
231
232fn read_str_bytes(input: &[u8]) -> Result<(&str, &[u8]), &[u8]> {
237 match rmp::decode::read_str_from_slice(input) {
238 Ok(x) => Ok(x),
239 Err(_) => Err(input),
240 }
241}
242
243fn read_key_eq<'a>(input: &'a [u8], key: &str) -> Result<((), &'a [u8]), &'a [u8]> {
249 match read_str_bytes(input) {
250 Ok((s, input)) if s == key => Ok(((), input)),
251 _ => Err(input),
252 }
253}
254
255#[cfg(test)]
256mod tests {
257 use super::*;
258
259 mod read_str_bytes {
260 use test_log::test;
261
262 use super::*;
263
264 #[test]
265 fn should_fail_if_input_is_empty() {
266 let input = read_str_bytes(&[]).unwrap_err();
267 assert!(input.is_empty());
268 }
269
270 #[test]
271 fn should_fail_if_input_does_not_start_with_str() {
272 let input = read_str_bytes(&[0xff, 0xa5, b'h', b'e', b'l', b'l', b'o']).unwrap_err();
273 assert_eq!(input, [0xff, 0xa5, b'h', b'e', b'l', b'l', b'o']);
274 }
275
276 #[test]
277 fn should_succeed_if_input_starts_with_str() {
278 let (s, remaining) =
279 read_str_bytes(&[0xa5, b'h', b'e', b'l', b'l', b'o', 0xff]).unwrap();
280 assert_eq!(s, "hello");
281 assert_eq!(remaining, [0xff]);
282 }
283 }
284
285 mod read_key_eq {
286 use test_log::test;
287
288 use super::*;
289
290 #[test]
291 fn should_fail_if_input_is_empty() {
292 let input = read_key_eq(&[], "key").unwrap_err();
293 assert!(input.is_empty());
294 }
295
296 #[test]
297 fn should_fail_if_input_does_not_start_with_str() {
298 let input = &[
299 0xff,
300 rmp::Marker::FixStr(5).to_u8(),
301 b'h',
302 b'e',
303 b'l',
304 b'l',
305 b'o',
306 ];
307 let remaining = read_key_eq(input, "key").unwrap_err();
308 assert_eq!(remaining, input);
309 }
310
311 #[test]
312 fn should_fail_if_read_key_does_not_match_specified_key() {
313 let input = &[
314 rmp::Marker::FixStr(5).to_u8(),
315 b'h',
316 b'e',
317 b'l',
318 b'l',
319 b'o',
320 0xff,
321 ];
322 let remaining = read_key_eq(input, "key").unwrap_err();
323 assert_eq!(remaining, input);
324 }
325
326 #[test]
327 fn should_succeed_if_read_key_matches_specified_key() {
328 let input = &[
329 rmp::Marker::FixStr(5).to_u8(),
330 b'h',
331 b'e',
332 b'l',
333 b'l',
334 b'o',
335 0xff,
336 ];
337 let (_, remaining) = read_key_eq(input, "hello").unwrap();
338 assert_eq!(remaining, [0xff]);
339 }
340 }
341
342 mod read_header_bytes {
343 use test_log::test;
344
345 use super::*;
346
347 #[test]
348 fn should_fail_if_input_is_empty() {
349 let input = vec![];
350 assert!(read_header_bytes(&input).is_err());
351 }
352
353 #[test]
354 fn should_fail_if_not_a_map() {
355 let input = vec![0x93, 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc2];
357 assert!(read_header_bytes(&input).is_err());
358 }
359
360 #[test]
361 fn should_fail_if_cannot_read_str_key_length() {
362 let input = vec![
363 0x81, 0x03, 0xa3, b'a', b'b', b'c', ];
366 assert!(read_header_bytes(&input).is_err());
367 }
368 #[test]
369 fn should_fail_if_key_length_exceeds_remaining_bytes() {
370 let input = vec![
371 0x81, 0xa8, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', ];
375 assert!(read_header_bytes(&input).is_err());
376 }
377
378 #[test]
379 fn should_fail_if_missing_value_for_key() {
380 let input = vec![
381 0x81, 0xa3, b'a', b'b', b'c', ];
384 assert!(read_header_bytes(&input).is_err());
385 }
386
387 #[test]
388 fn should_fail_if_unable_to_read_value_length() {
389 let input = vec![
390 0x81, 0xa3, b'a', b'b', b'c', 0xd9, ];
394 assert!(read_header_bytes(&input).is_err());
395 }
396
397 #[test]
398 fn should_fail_if_value_length_exceeds_remaining_bytes() {
399 let input = vec![
400 0x81, 0xa3, b'a', b'b', b'c', 0xa2, b'd', ];
404 assert!(read_header_bytes(&input).is_err());
405 }
406
407 #[test]
408 fn should_succeed_with_empty_map() {
409 let input = vec![0x80];
411 let (header, _) = read_header_bytes(&input).unwrap();
412 assert_eq!(header, input);
413
414 let input = vec![0xde, 0x00, 0x00];
416 let (header, _) = read_header_bytes(&input).unwrap();
417 assert_eq!(header, input);
418
419 let input = vec![0xdf, 0x00, 0x00, 0x00, 0x00];
421 let (header, _) = read_header_bytes(&input).unwrap();
422 assert_eq!(header, input);
423 }
424
425 #[test]
426 fn should_succeed_with_single_key_value_map() {
427 let input = vec![
429 0x81, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', ];
433 let (header, _) = read_header_bytes(&input).unwrap();
434 assert_eq!(header, input);
435
436 let input = vec![
438 0xde, 0x00, 0x01, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', ];
442 let (header, _) = read_header_bytes(&input).unwrap();
443 assert_eq!(header, input);
444
445 let input = vec![
447 0xdf, 0x00, 0x00, 0x00, 0x01, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', ];
451 let (header, _) = read_header_bytes(&input).unwrap();
452 assert_eq!(header, input);
453 }
454
455 #[test]
456 fn should_succeed_with_multiple_key_value_map() {
457 let input = vec![
459 0x82, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', 0xa3, b'y', b'e', b'k', 0x7b, ];
465 let (header, _) = read_header_bytes(&input).unwrap();
466 assert_eq!(header, input);
467
468 let input = vec![
470 0xde, 0x00, 0x02, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', 0xa3, b'y', b'e', b'k', 0x7b, ];
476 let (header, _) = read_header_bytes(&input).unwrap();
477 assert_eq!(header, input);
478
479 let input = vec![
481 0xdf, 0x00, 0x00, 0x00, 0x02, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', 0xa3, b'y', b'e', b'k', 0x7b, ];
487 let (header, _) = read_header_bytes(&input).unwrap();
488 assert_eq!(header, input);
489 }
490
491 #[test]
492 fn should_succeed_with_nested_map() {
493 let input = vec![
495 0x81, 0xa3, b'm', b'a', b'p', 0x81, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', ];
501 let (header, _) = read_header_bytes(&input).unwrap();
502 assert_eq!(header, input);
503 }
504
505 #[test]
506 fn should_only_consume_map_from_input() {
507 let input = vec![
509 0x81, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', 0xa4, b'm', b'o', b'r', b'e', ];
514 let (header, remaining) = read_header_bytes(&input).unwrap();
515 assert_eq!(
516 header,
517 vec![
518 0x81, 0xa3, b'k', b'e', b'y', 0xa5, b'v', b'a', b'l', b'u', b'e', ]
522 );
523 assert_eq!(
524 remaining,
525 vec![
526 0xa4, b'm', b'o', b'r', b'e', ]
528 );
529 }
530 }
531
532 mod find_msgpack_byte_len {
533 use test_log::test;
534
535 use super::*;
536
537 #[test]
538 fn should_return_none_if_input_is_empty() {
539 let input = vec![];
540 let len = find_msgpack_byte_len(&input);
541 assert_eq!(len, None, "Wrong len for {input:X?}");
542 }
543
544 #[test]
545 fn should_return_none_if_input_has_reserved_marker() {
546 let input = vec![rmp::Marker::Reserved.to_u8()];
547 let len = find_msgpack_byte_len(&input);
548 assert_eq!(len, None, "Wrong len for {input:X?}");
549 }
550
551 #[test]
552 fn should_return_1_if_input_is_nil() {
553 let input = vec![0xc0];
554 let len = find_msgpack_byte_len(&input);
555 assert_eq!(len, Some(1), "Wrong len for {input:X?}");
556 }
557
558 #[test]
559 fn should_return_1_if_input_is_a_boolean() {
560 let input = vec![0xc2]; let len = find_msgpack_byte_len(&input);
562 assert_eq!(len, Some(1), "Wrong len for {input:X?}");
563
564 let input = vec![0xc3]; let len = find_msgpack_byte_len(&input);
566 assert_eq!(len, Some(1), "Wrong len for {input:X?}");
567 }
568
569 #[test]
570 fn should_return_appropriate_len_if_input_is_some_integer() {
571 let input = vec![0x00]; let len = find_msgpack_byte_len(&input);
573 assert_eq!(len, Some(1), "Wrong len for {input:X?}");
574
575 let input = vec![0xff]; let len = find_msgpack_byte_len(&input);
577 assert_eq!(len, Some(1), "Wrong len for {input:X?}");
578
579 let input = vec![0xcc, 0xff]; let len = find_msgpack_byte_len(&input);
581 assert_eq!(len, Some(2), "Wrong len for {input:X?}");
582
583 let input = vec![0xcd, 0xff, 0xff]; let len = find_msgpack_byte_len(&input);
585 assert_eq!(len, Some(3), "Wrong len for {input:X?}");
586
587 let input = vec![0xce, 0xff, 0xff, 0xff, 0xff]; let len = find_msgpack_byte_len(&input);
589 assert_eq!(len, Some(5), "Wrong len for {input:X?}");
590
591 let input = vec![0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]; let len = find_msgpack_byte_len(&input);
593 assert_eq!(len, Some(9), "Wrong len for {input:X?}");
594
595 let input = vec![0xd0, 0x81]; let len = find_msgpack_byte_len(&input);
597 assert_eq!(len, Some(2), "Wrong len for {input:X?}");
598
599 let input = vec![0xd1, 0x80, 0x01]; let len = find_msgpack_byte_len(&input);
601 assert_eq!(len, Some(3), "Wrong len for {input:X?}");
602
603 let input = vec![0xd2, 0x80, 0x00, 0x00, 0x01]; let len = find_msgpack_byte_len(&input);
605 assert_eq!(len, Some(5), "Wrong len for {input:X?}");
606
607 let input = vec![0xd3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00]; let len = find_msgpack_byte_len(&input);
609 assert_eq!(len, Some(9), "Wrong len for {input:X?}");
610 }
611
612 #[test]
613 fn should_return_appropriate_len_if_input_is_some_float() {
614 let input = vec![0xca, 0x3d, 0xcc, 0xcc, 0xcd]; let len = find_msgpack_byte_len(&input);
616 assert_eq!(len, Some(5), "Wrong len for {input:X?}");
617
618 let input = vec![0xcb, 0x3f, 0xb9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a]; let len = find_msgpack_byte_len(&input);
620 assert_eq!(len, Some(9), "Wrong len for {input:X?}");
621 }
622
623 #[test]
624 fn should_return_appropriate_len_if_input_is_some_str() {
625 let input = vec![0xa5, b'h', b'e', b'l', b'l', b'o'];
627 let len = find_msgpack_byte_len(&input);
628 assert_eq!(len, Some(5 + 1), "Wrong len for {input:X?}");
629
630 let input = vec![0xd9, 0xff, b'd', b'a', b't', b'a'];
632 let len = find_msgpack_byte_len(&input);
633 assert_eq!(len, Some(u8::MAX as u64 + 2), "Wrong len for {input:X?}");
634
635 let input = vec![0xda, 0xff, 0xff, b'd', b'a', b't', b'a'];
637 let len = find_msgpack_byte_len(&input);
638 assert_eq!(len, Some(u16::MAX as u64 + 3), "Wrong len for {input:X?}");
639
640 let input = vec![0xdb, 0xff, 0xff, 0xff, 0xff, b'd', b'a', b't', b'a'];
642 let len = find_msgpack_byte_len(&input);
643 assert_eq!(len, Some(u32::MAX as u64 + 5), "Wrong len for {input:X?}");
644 }
645
646 #[test]
647 fn should_return_appropriate_len_if_input_is_some_bin() {
648 let input = vec![0xc4, 0xff, b'd', b'a', b't', b'a'];
650 let len = find_msgpack_byte_len(&input);
651 assert_eq!(len, Some(u8::MAX as u64 + 2), "Wrong len for {input:X?}");
652
653 let input = vec![0xc5, 0xff, 0xff, b'd', b'a', b't', b'a'];
655 let len = find_msgpack_byte_len(&input);
656 assert_eq!(len, Some(u16::MAX as u64 + 3), "Wrong len for {input:X?}");
657
658 let input = vec![0xc6, 0xff, 0xff, 0xff, 0xff, b'd', b'a', b't', b'a'];
660 let len = find_msgpack_byte_len(&input);
661 assert_eq!(len, Some(u32::MAX as u64 + 5), "Wrong len for {input:X?}");
662 }
663
664 #[test]
665 fn should_return_appropriate_len_if_input_is_some_array() {
666 let input = vec![0x93, 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc2];
670 let len = find_msgpack_byte_len(&input);
671 assert_eq!(len, Some(1 + 4 + 2 + 1), "Wrong len for {input:X?}");
672
673 let input = vec![0x93, 0xa3, b'a', b'b', b'c', 0xcc, 0xff];
675 let len = find_msgpack_byte_len(&input);
676 assert_eq!(len, None, "Wrong len for {input:X?}");
677
678 let input = vec![0xdc, 0x00, 0x03, 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc2];
682 let len = find_msgpack_byte_len(&input);
683 assert_eq!(len, Some(3 + 4 + 2 + 1), "Wrong len for {input:X?}");
684
685 let input = vec![0xdc, 0x00, 0x03, 0xa3, b'a', b'b', b'c', 0xcc, 0xff];
687 let len = find_msgpack_byte_len(&input);
688 assert_eq!(len, None, "Wrong len for {input:X?}");
689
690 let input = vec![
692 0xdd, 0x00, 0x00, 0x00, 0x03, 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc2,
693 ];
694 let len = find_msgpack_byte_len(&input);
695 assert_eq!(len, Some(5 + 4 + 2 + 1), "Wrong len for {input:X?}");
696
697 let input = vec![
699 0xdd, 0x00, 0x00, 0x00, 0x03, 0xa3, b'a', b'b', b'c', 0xcc, 0xff,
700 ];
701 let len = find_msgpack_byte_len(&input);
702 assert_eq!(len, None, "Wrong len for {input:X?}");
703 }
704
705 #[test]
706 fn should_return_appropriate_len_if_input_is_some_map() {
707 let input = vec![
709 0x83, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, 0xc2, ];
714 let len = find_msgpack_byte_len(&input);
715 assert_eq!(len, Some(1 + 5 + 6 + 2), "Wrong len for {input:X?}");
716
717 let input = vec![
719 0x83, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, ];
724 let len = find_msgpack_byte_len(&input);
725 assert_eq!(len, None, "Wrong len for {input:X?}");
726
727 let input = vec![
729 0xde, 0x00, 0x03, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, 0xc2, ];
734 let len = find_msgpack_byte_len(&input);
735 assert_eq!(len, Some(3 + 5 + 6 + 2), "Wrong len for {input:X?}");
736
737 let input = vec![
739 0xde, 0x00, 0x03, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, ];
744 let len = find_msgpack_byte_len(&input);
745 assert_eq!(len, None, "Wrong len for {input:X?}");
746
747 let input = vec![
749 0xdf, 0x00, 0x00, 0x00, 0x03, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, 0xc2, ];
754 let len = find_msgpack_byte_len(&input);
755 assert_eq!(len, Some(5 + 5 + 6 + 2), "Wrong len for {input:X?}");
756
757 let input = vec![
759 0xdf, 0x00, 0x00, 0x00, 0x03, 0x03, 0xa3, b'a', b'b', b'c', 0xa3, b'a', b'b', b'c', 0xcc, 0xff, 0xc3, ];
764 let len = find_msgpack_byte_len(&input);
765 assert_eq!(len, None, "Wrong len for {input:X?}");
766 }
767
768 #[test]
769 fn should_return_appropriate_len_if_input_is_some_ext() {
770 let input = vec![0xd4, 0x00, 0x12];
772 let len = find_msgpack_byte_len(&input);
773 assert_eq!(len, Some(1 + 1 + 1), "Wrong len for {input:X?}");
774
775 let input = vec![0xd5, 0x00, 0x12, 0x34];
777 let len = find_msgpack_byte_len(&input);
778 assert_eq!(len, Some(1 + 1 + 2), "Wrong len for {input:X?}");
779
780 let input = vec![0xd6, 0x00, 0x12, 0x34, 0x56, 0x78];
782 let len = find_msgpack_byte_len(&input);
783 assert_eq!(len, Some(1 + 1 + 4), "Wrong len for {input:X?}");
784
785 let input = vec![0xd7, 0x00, 0x12, 0x34, 0x56, 0x78];
787 let len = find_msgpack_byte_len(&input);
788 assert_eq!(len, Some(1 + 1 + 8), "Wrong len for {input:X?}");
789
790 let input = vec![0xd8, 0x00, 0x12, 0x34, 0x56, 0x78];
792 let len = find_msgpack_byte_len(&input);
793 assert_eq!(len, Some(1 + 1 + 16), "Wrong len for {input:X?}");
794
795 let input = vec![0xc7, 0xff, 0x00, b'd', b'a', b't', b'a'];
797 let len = find_msgpack_byte_len(&input);
798 assert_eq!(len, Some(u8::MAX as u64 + 3), "Wrong len for {input:X?}");
799
800 let input = vec![0xc8, 0xff, 0xff, 0x00, b'd', b'a', b't', b'a'];
802 let len = find_msgpack_byte_len(&input);
803 assert_eq!(len, Some(u16::MAX as u64 + 4), "Wrong len for {input:X?}");
804
805 let input = vec![0xc9, 0xff, 0xff, 0xff, 0xff, 0x00, b'd', b'a', b't', b'a'];
807 let len = find_msgpack_byte_len(&input);
808 assert_eq!(len, Some(u32::MAX as u64 + 6), "Wrong len for {input:X?}");
809 }
810 }
811}