diff --git a/src/lib.rs b/src/lib.rs index dfaebd0..46f1220 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -834,29 +834,33 @@ where } } +fn arbitrary_str<'a>(u: &mut Unstructured<'a>, size: usize) -> Result<&'a str> { + match str::from_utf8(u.peek_bytes(size).unwrap()) { + Ok(s) => { + u.bytes(size).unwrap(); + Ok(s) + } + Err(e) => { + let i = e.valid_up_to(); + let valid = u.bytes(i).unwrap(); + let s = unsafe { + debug_assert!(str::from_utf8(valid).is_ok()); + str::from_utf8_unchecked(valid) + }; + Ok(s) + } + } +} + impl<'a> Arbitrary<'a> for &'a str { fn arbitrary(u: &mut Unstructured<'a>) -> Result { let size = u.arbitrary_len::()?; - match str::from_utf8(u.peek_bytes(size).unwrap()) { - Ok(s) => { - u.bytes(size).unwrap(); - Ok(s) - } - Err(e) => { - let i = e.valid_up_to(); - let valid = u.bytes(i).unwrap(); - let s = unsafe { - debug_assert!(str::from_utf8(valid).is_ok()); - str::from_utf8_unchecked(valid) - }; - Ok(s) - } - } + arbitrary_str(u, size) } - fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { - let bytes = u.take_rest(); - str::from_utf8(bytes).map_err(|_| Error::IncorrectFormat) + fn arbitrary_take_rest(mut u: Unstructured<'a>) -> Result { + let size = u.len(); + arbitrary_str(&mut u, size) } #[inline]