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}