• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use {
2     crate::{Arbitrary, Result, Unstructured},
3     core::str,
4 };
5 
arbitrary_str<'a>(u: &mut Unstructured<'a>, size: usize) -> Result<&'a str>6 fn arbitrary_str<'a>(u: &mut Unstructured<'a>, size: usize) -> Result<&'a str> {
7     match str::from_utf8(u.peek_bytes(size).unwrap()) {
8         Ok(s) => {
9             u.bytes(size).unwrap();
10             Ok(s)
11         }
12         Err(e) => {
13             let i = e.valid_up_to();
14             let valid = u.bytes(i).unwrap();
15             let s = unsafe {
16                 debug_assert!(str::from_utf8(valid).is_ok());
17                 str::from_utf8_unchecked(valid)
18             };
19             Ok(s)
20         }
21     }
22 }
23 
24 impl<'a> Arbitrary<'a> for &'a str {
arbitrary(u: &mut Unstructured<'a>) -> Result<Self>25     fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
26         let size = u.arbitrary_len::<u8>()?;
27         arbitrary_str(u, size)
28     }
29 
arbitrary_take_rest(mut u: Unstructured<'a>) -> Result<Self>30     fn arbitrary_take_rest(mut u: Unstructured<'a>) -> Result<Self> {
31         let size = u.len();
32         arbitrary_str(&mut u, size)
33     }
34 
35     #[inline]
size_hint(_depth: usize) -> (usize, Option<usize>)36     fn size_hint(_depth: usize) -> (usize, Option<usize>) {
37         (0, None)
38     }
39 }
40