From b8772a1e402bb258e5754e3dedd0bf892fcc9124 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Tue, 22 Oct 2019 22:29:30 +0200 Subject: [PATCH] Deserialize Box through PathBuf::into_boxed_path Including Rc et al. Fixes https://github.com/serde-rs/serde/issues/1633 --- serde/build.rs | 3 ++- serde/src/de/impls.rs | 3 +++ test_suite/tests/test_de.rs | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/serde/build.rs b/serde/build.rs index e36ed62f5..a78b6d79a 100644 --- a/serde/build.rs +++ b/serde/build.rs @@ -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"); } diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index c1f3dad91..cffe05900 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1610,6 +1610,9 @@ impl<'de> Deserialize<'de> for PathBuf { } } +#[cfg(all(feature = "std", de_boxed_c_str))] +forwarded_impl!((), Box, PathBuf::into_boxed_path); + //////////////////////////////////////////////////////////////////////////////// // If this were outside of the serde crate, it would just use: diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index 97ca875c4..025d87b09 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -907,6 +907,20 @@ declare_tests! { 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() => &[ Token::Bytes(b"abc"),