arbitrary/foreign/core/
str.rs

1use {
2    crate::{Arbitrary, Result, Unstructured},
3    core::str,
4};
5
6fn 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
24impl<'a> Arbitrary<'a> for &'a str {
25    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
26        let size = u.arbitrary_len::<u8>()?;
27        arbitrary_str(u, size)
28    }
29
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]
36    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
37        (0, None)
38    }
39}