From 6b7aa269b889cfafaaa7976c8b1dc4dc0a72ca3d Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Thu, 5 Mar 2015 22:39:35 -0800 Subject: [PATCH] Implement impls for std::path::Path{,Buf} Closes #28. --- serde2/src/de.rs | 31 ++++++++++++++++++++++++++++++- serde2/src/lib.rs | 2 +- serde2/src/ser.rs | 36 +++++++++++++++++++++++++----------- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/serde2/src/de.rs b/serde2/src/de.rs index b5c55444..2bf7328d 100644 --- a/serde2/src/de.rs +++ b/serde2/src/de.rs @@ -1,7 +1,8 @@ -use std::marker::PhantomData; use std::collections::{HashMap, BTreeMap}; use std::hash::Hash; +use std::marker::PhantomData; use std::num::FromPrimitive; +use std::path; use std::str; /////////////////////////////////////////////////////////////////////////////// @@ -788,3 +789,31 @@ impl< deserializer.visit(BTreeMapVisitor::new()) } } + +/////////////////////////////////////////////////////////////////////////////// + +struct PathBufVisitor; + +impl Visitor for PathBufVisitor { + type Value = path::PathBuf; + + fn visit_str(&mut self, v: &str) -> Result + where E: Error, + { + Ok(path::PathBuf::new(&v)) + } + + fn visit_string(&mut self, v: String) -> Result + where E: Error, + { + self.visit_str(&v) + } +} + +impl Deserialize for path::PathBuf { + fn deserialize(deserializer: &mut D) -> Result + where D: Deserializer, + { + deserializer.visit(PathBufVisitor) + } +} diff --git a/serde2/src/lib.rs b/serde2/src/lib.rs index 85fd10c5..102a272b 100644 --- a/serde2/src/lib.rs +++ b/serde2/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(core, io, std_misc, unicode)] +#![feature(core, io, path, std_misc, unicode)] extern crate unicode; diff --git a/serde2/src/ser.rs b/serde2/src/ser.rs index c94c2335..a639bd32 100644 --- a/serde2/src/ser.rs +++ b/serde2/src/ser.rs @@ -1,6 +1,7 @@ -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::collections::hash_state::HashState; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::hash::Hash; +use std::path; use std::rc::Rc; use std::str; use std::sync::Arc; @@ -8,9 +9,8 @@ use std::sync::Arc; /////////////////////////////////////////////////////////////////////////////// pub trait Serialize { - fn visit< - V: Visitor, - >(&self, visitor: &mut V) -> Result; + fn visit(&self, visitor: &mut V) -> Result + where V: Visitor; } /////////////////////////////////////////////////////////////////////////////// @@ -605,7 +605,7 @@ impl<'a, T> Serialize for &'a T where T: Serialize { } } -impl<'a, T> Serialize for Box where T: Serialize { +impl Serialize for Box where T: Serialize { #[inline] fn visit(&self, visitor: &mut V) -> Result where V: Visitor, @@ -614,9 +614,7 @@ impl<'a, T> Serialize for Box where T: Serialize { } } -impl<'a, T> Serialize for Rc - where T: Serialize, -{ +impl Serialize for Rc where T: Serialize, { #[inline] fn visit(&self, visitor: &mut V) -> Result where V: Visitor, @@ -625,9 +623,7 @@ impl<'a, T> Serialize for Rc } } -impl<'a, T> Serialize for Arc - where T: Serialize, -{ +impl Serialize for Arc where T: Serialize, { #[inline] fn visit(&self, visitor: &mut V) -> Result where V: Visitor, @@ -635,3 +631,21 @@ impl<'a, T> Serialize for Arc (**self).visit(visitor) } } + +/////////////////////////////////////////////////////////////////////////////// + +impl Serialize for path::Path { + fn visit(&self, visitor: &mut V) -> Result + where V: Visitor, + { + self.to_str().unwrap().visit(visitor) + } +} + +impl Serialize for path::PathBuf { + fn visit(&self, visitor: &mut V) -> Result + where V: Visitor, + { + self.to_str().unwrap().visit(visitor) + } +}