1#![doc = include_str!("../README.md")]
2
3mod de; pub use de::*;
4
5#[cfg(test)] mod tests;
6
7fn from_utf8(s: &[u8], mut location: Location) -> Result<&str, DeserializeError> {
8 std::str::from_utf8(s)
9 .map_err(|e| {
10 if let Some(last_newline_rev) = &s[..e.valid_up_to()].iter().rev().position(|c| *c == b'\n') {
11 let last_newline = e.valid_up_to() - last_newline_rev;
12 location.add_lines(s[..last_newline].iter().filter(|c| **c == b'\n').count());
13 location.add_columns(last_newline - e.valid_up_to());
14 } else {
15 location.add_columns(e.valid_up_to());
16 }
17 crate::DeserializeErrorKind::InvalidUtf8.at(location)
18 })
19}
20
21unsafe fn from_utf8_unchecked(s: &[u8]) -> &str {
22 debug_assert!(std::str::from_utf8(s).is_ok(), "Assumed string was valid UTF-8 {:?}", String::from_utf8_lossy(s));
23 std::str::from_utf8_unchecked(s)
24}