diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index ba0acae2..1ad97538 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -25,6 +25,8 @@ use std::net; #[cfg(feature = "std")] use std::path; use core::str; +#[cfg(feature = "std")] +use std::ffi::{CStr, CString}; #[cfg(feature = "std")] use std::rc::Rc; @@ -295,6 +297,33 @@ impl Deserialize for String { /////////////////////////////////////////////////////////////////////////////// +#[cfg(feature = "std")] +impl Deserialize for Box { + fn deserialize(deserializer: D) -> Result + where D: Deserializer + { + use std::mem; + let s = try!(CString::deserialize(deserializer)); + let slice = s.into_bytes_with_nul().into_boxed_slice(); + Ok(unsafe { mem::transmute::, Box>(slice) }) + } +} + + +#[cfg(feature = "std")] +impl Deserialize for CString { + fn deserialize(deserializer: D) -> Result + where D: Deserializer + { + let mut v: Vec = try!(Deserialize::deserialize(deserializer)); + v.pop(); // cut trailing NULL, because CString::new adds it + CString::new(v) + .map_err(|e| Error::custom(format!("unexpected NULL at byte {}", e.nul_position()))) + } +} + +/////////////////////////////////////////////////////////////////////////////// + struct OptionVisitor { marker: PhantomData, } diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index a7ac780f..32eb716f 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -22,6 +22,8 @@ use core::ops; #[cfg(feature = "std")] use std::path; #[cfg(feature = "std")] +use std::ffi::{CString, CStr}; +#[cfg(feature = "std")] use std::rc::Rc; #[cfg(all(feature = "alloc", not(feature = "std")))] use alloc::rc::Rc; @@ -98,6 +100,28 @@ impl Serialize for String { /////////////////////////////////////////////////////////////////////////////// +#[cfg(feature = "std")] +impl Serialize for CStr { + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + (self.to_bytes_with_nul()).serialize(serializer) + } +} + +#[cfg(feature = "std")] +impl Serialize for CString { + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + (self.to_bytes_with_nul()).serialize(serializer) + } +} + +/////////////////////////////////////////////////////////////////////////////// + impl Serialize for Option where T: Serialize {