about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-05-01 09:41:54 -0700
committerbors <bors@rust-lang.org>2014-05-01 09:41:54 -0700
commitee03529fa9c84471f0e24d749017ce88b7d2b81e (patch)
tree29e4e0998dd17a3a894c20e762e32496fde8dbc4
parent239557de6de72748a5c7604081b202d53f7d9ac9 (diff)
parentfa6efedccf63c283d7b0916c304ee456d20ab97e (diff)
downloadrust-ee03529fa9c84471f0e24d749017ce88b7d2b81e.tar.gz
rust-ee03529fa9c84471f0e24d749017ce88b7d2b81e.zip
auto merge of #13875 : hjr3/rust/serialize-strbuf, r=alexcrichton
- implement Encodable and Decodable for StrBuf
- implement to_json for StrBuf
-rw-r--r--src/libserialize/json.rs58
-rw-r--r--src/libserialize/serialize.rs12
2 files changed, 35 insertions, 35 deletions
diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs
index 189b8717d49..b87a02fcfd7 100644
--- a/src/libserialize/json.rs
+++ b/src/libserialize/json.rs
@@ -2205,6 +2205,10 @@ impl ToJson for ~str {
     fn to_json(&self) -> Json { String((*self).clone()) }
 }
 
+impl ToJson for StrBuf {
+    fn to_json(&self) -> Json { String((*self).as_slice().into_owned()) }
+}
+
 impl<A:ToJson,B:ToJson> ToJson for (A, B) {
     fn to_json(&self) -> Json {
         match *self {
@@ -2643,41 +2647,25 @@ mod tests {
 
     #[test]
     fn test_decode_str() {
-        let mut decoder = Decoder::new(from_str("\"\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"foo\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "foo".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\\"\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\"".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\b\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\x08".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\n\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\n".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\r\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\r".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\t\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\t".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\u12ab\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\u12ab".to_owned());
-
-        let mut decoder = Decoder::new(from_str("\"\\uAB12\"").unwrap());
-        let v: ~str = Decodable::decode(&mut decoder).unwrap();
-        assert_eq!(v, "\uAB12".to_owned());
+        let s = [("\"\"", ""),
+                 ("\"foo\"", "foo"),
+                 ("\"\\\"\"", "\""),
+                 ("\"\\b\"", "\x08"),
+                 ("\"\\n\"", "\n"),
+                 ("\"\\r\"", "\r"),
+                 ("\"\\t\"", "\t"),
+                 ("\"\\u12ab\"", "\u12ab"),
+                 ("\"\\uAB12\"", "\uAB12")];
+
+        for &(i, o) in s.iter() {
+            let mut decoder = Decoder::new(from_str(i).unwrap());
+            let v: StrBuf = Decodable::decode(&mut decoder).unwrap();
+            assert_eq!(v.as_slice(), o);
+
+            let mut decoder = Decoder::new(from_str(i).unwrap());
+            let v: ~str = Decodable::decode(&mut decoder).unwrap();
+            assert_eq!(v, o.to_owned());
+        }
     }
 
     #[test]
diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs
index d82d45e89a2..9801a243efa 100644
--- a/src/libserialize/serialize.rs
+++ b/src/libserialize/serialize.rs
@@ -313,6 +313,18 @@ impl<E, D:Decoder<E>> Decodable<D, E> for ~str {
     }
 }
 
+impl<E, S:Encoder<E>> Encodable<S, E> for StrBuf {
+    fn encode(&self, s: &mut S) -> Result<(), E> {
+        s.emit_str(self.as_slice())
+    }
+}
+
+impl<E, D:Decoder<E>> Decodable<D, E> for StrBuf {
+    fn decode(d: &mut D) -> Result<StrBuf, E> {
+        Ok(StrBuf::from_str(try!(d.read_str())))
+    }
+}
+
 impl<E, S:Encoder<E>> Encodable<S, E> for f32 {
     fn encode(&self, s: &mut S) -> Result<(), E> {
         s.emit_f32(*self)