diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 881f0df9..e29a23d5 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1078,7 +1078,23 @@ impl<'de> Visitor<'de> for OsStringVisitor { variant.visit_newtype().map(OsString::from_vec) } (OsStringKind::Windows, _) => { - Err(Error::custom("cannot deserialize windows os string on unix")) + Err(Error::custom("cannot deserialize Windows OS string on Unix")) + } + } + } + + #[cfg(windows)] + fn visit_enum<V>(self, visitor: V) -> Result<OsString, V::Error> + where V: EnumVisitor, + { + use std::os::windows::ffi::OsStringExt; + + match try!(visitor.visit_variant()) { + (OsStringKind::Windows, variant) => { + variant.visit_newtype::<Vec<u16>>().map(|vec| OsString::from_wide(&vec)) + } + (OsStringKind::Unix, _) => { + Err(Error::custom("cannot deserialize Unix OS string on Windows")) } } }