Skip to content

Commit

Permalink
Merge pull request #1656 from heftig/path-improvements
Browse files Browse the repository at this point in the history
Improve Path deserialization
  • Loading branch information
dtolnay committed Oct 27, 2019
2 parents cf31418 + b8772a1 commit 4e31c99
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 1 deletion.
3 changes: 2 additions & 1 deletion serde/build.rs
Expand Up @@ -29,8 +29,9 @@ fn main() {
println!("cargo:rustc-cfg=core_reverse");
}

// CString::into_boxed_c_str stabilized in Rust 1.20:
// CString::into_boxed_c_str and PathBuf::into_boxed_path stabilized in Rust 1.20:
// https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
// https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.into_boxed_path
if minor >= 20 {
println!("cargo:rustc-cfg=de_boxed_c_str");
}
Expand Down
21 changes: 21 additions & 0 deletions serde/src/de/impls.rs
Expand Up @@ -1580,6 +1580,24 @@ impl<'de> Visitor<'de> for PathBufVisitor {
{
Ok(From::from(v))
}

fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
str::from_utf8(v)
.map(From::from)
.map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))
}

fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where
E: Error,
{
String::from_utf8(v)
.map(From::from)
.map_err(|e| Error::invalid_value(Unexpected::Bytes(&e.into_bytes()), &self))
}
}

#[cfg(feature = "std")]
Expand All @@ -1592,6 +1610,9 @@ impl<'de> Deserialize<'de> for PathBuf {
}
}

#[cfg(all(feature = "std", de_boxed_c_str))]
forwarded_impl!((), Box<Path>, PathBuf::into_boxed_path);

////////////////////////////////////////////////////////////////////////////////

// If this were outside of the serde crate, it would just use:
Expand Down
26 changes: 26 additions & 0 deletions test_suite/tests/test_de.rs
Expand Up @@ -889,11 +889,37 @@ declare_tests! {
Path::new("/usr/local/lib") => &[
Token::BorrowedStr("/usr/local/lib"),
],
Path::new("/usr/local/lib") => &[
Token::BorrowedBytes(b"/usr/local/lib"),
],
}
test_path_buf {
PathBuf::from("/usr/local/lib") => &[
Token::Str("/usr/local/lib"),
],
PathBuf::from("/usr/local/lib") => &[
Token::String("/usr/local/lib"),
],
PathBuf::from("/usr/local/lib") => &[
Token::Bytes(b"/usr/local/lib"),
],
PathBuf::from("/usr/local/lib") => &[
Token::ByteBuf(b"/usr/local/lib"),
],
}
test_boxed_path {
PathBuf::from("/usr/local/lib").into_boxed_path() => &[
Token::Str("/usr/local/lib"),
],
PathBuf::from("/usr/local/lib").into_boxed_path() => &[
Token::String("/usr/local/lib"),
],
PathBuf::from("/usr/local/lib").into_boxed_path() => &[
Token::Bytes(b"/usr/local/lib"),
],
PathBuf::from("/usr/local/lib").into_boxed_path() => &[
Token::ByteBuf(b"/usr/local/lib"),
],
}
test_cstring {
CString::new("abc").unwrap() => &[
Expand Down

0 comments on commit 4e31c99

Please sign in to comment.