diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index f6c76f2c7b86b70259739b38c4e981ed4f0957ca..9a14e738801b5a2fa1c571447868b40ead861a08 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -97,7 +97,7 @@ //! }; //! //! // Serialize using `json::encode` -//! let encoded = json::encode(&object); +//! let encoded = json::encode(&object).unwrap(); //! //! // Deserialize using `json::decode` //! let decoded: TestStruct = json::decode(encoded.as_slice()).unwrap(); @@ -143,7 +143,7 @@ //! uid: 1, //! dsc: "test".to_string(), //! val: num.to_json(), -//! }); +//! }).unwrap(); //! println!("data: {}", data); //! // data: {"uid":1,"dsc":"test","val":"0.0001+12.539j"}; //! } @@ -316,13 +316,13 @@ pub fn decode(s: &str) -> DecodeResult { } /// Shortcut function to encode a `T` into a JSON `String` -pub fn encode(object: &T) -> string::String { +pub fn encode(object: &T) -> Result { let mut s = String::new(); { let mut encoder = Encoder::new(&mut s); - let _ = object.encode(&mut encoder); + try!(object.encode(&mut encoder)); } - s + Ok(s) } impl fmt::Display for ErrorCode { @@ -536,7 +536,6 @@ fn emit_str(&mut self, v: &str) -> EncodeResult { fn emit_enum(&mut self, _name: &str, f: F) -> EncodeResult where F: FnOnce(&mut Encoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } f(self) } @@ -550,10 +549,10 @@ fn emit_enum_variant(&mut self, // enums are encoded as strings or objects // Bunny => "Bunny" // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]} - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } if cnt == 0 { escape_str(self.writer, name) } else { + if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } try!(write!(self.writer, "{{\"variant\":")); try!(escape_str(self.writer, name)); try!(write!(self.writer, ",\"fields\":[")); @@ -785,7 +784,6 @@ fn emit_str(&mut self, v: &str) -> EncodeResult { fn emit_enum(&mut self, _name: &str, f: F) -> EncodeResult where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } f(self) } @@ -797,10 +795,10 @@ fn emit_enum_variant(&mut self, -> EncodeResult where F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, { - if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } if cnt == 0 { escape_str(self.writer, name) } else { + if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); } try!(write!(self.writer, "{{\n")); self.curr_indent += self.indent; try!(spaces(self.writer, self.curr_indent)); @@ -3537,6 +3535,24 @@ fn indents(source: &str) -> uint { } } + #[test] + fn test_hashmap_with_enum_key() { + use std::collections::HashMap; + use json; + #[derive(RustcEncodable, Eq, Hash, PartialEq, RustcDecodable, Show)] + enum Enum { + Foo, + #[allow(dead_code)] + Bar, + } + let mut map = HashMap::new(); + map.insert(Enum::Foo, 0); + let result = json::encode(&map).unwrap(); + assert_eq!(&result[], r#"{"Foo":0}"#); + let decoded: HashMap = json::decode(result.as_slice()).unwrap(); + assert_eq!(map, decoded); + } + #[test] fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() { use std::collections::HashMap; diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 4bd476885a04cecd1b7f06ce05e4e79bf0e7c046..0be7b605e5769cf758d87b14eebf6816a8841739 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -854,7 +854,7 @@ fn string_to_tts_macro () { #[test] fn string_to_tts_1 () { let tts = string_to_tts("fn a (b : i32) { b; }".to_string()); - assert_eq!(json::encode(&tts), + assert_eq!(json::encode(&tts).unwrap(), "[\ {\ \"variant\":\"TtToken\",\ diff --git a/src/test/run-pass/deriving-encodable-decodable-box.rs b/src/test/run-pass/deriving-encodable-decodable-box.rs index 1a204fa3e206e4f3f92f805a09eeee8167ada6aa..a0888850aaf1408104bd6442fb2dc362300b5011 100644 --- a/src/test/run-pass/deriving-encodable-decodable-box.rs +++ b/src/test/run-pass/deriving-encodable-decodable-box.rs @@ -24,7 +24,7 @@ struct A { fn main() { let obj = A { foo: box [true, false] }; - let s = json::encode(&obj); + let s = json::encode(&obj).unwrap(); let obj2: A = json::decode(s.as_slice()).unwrap(); assert!(obj.foo == obj2.foo); } diff --git a/src/test/run-pass/deriving-encodable-decodable-cell-refcell.rs b/src/test/run-pass/deriving-encodable-decodable-cell-refcell.rs index 3b2c1d9f27c72f0c14a7ff68c71dd3d037e828ad..a5453d26170ad62833dfa45d88d3d6583bc3ea78 100644 --- a/src/test/run-pass/deriving-encodable-decodable-cell-refcell.rs +++ b/src/test/run-pass/deriving-encodable-decodable-cell-refcell.rs @@ -35,7 +35,7 @@ fn main() { foo: Cell::new(true), bar: RefCell::new( A { baz: 2 } ) }; - let s = json::encode(&obj); + let s = json::encode(&obj).unwrap(); let obj2: B = json::decode(s.as_slice()).unwrap(); assert!(obj.foo.get() == obj2.foo.get()); assert!(obj.bar.borrow().baz == obj2.bar.borrow().baz); diff --git a/src/test/run-pass/issue-14021.rs b/src/test/run-pass/issue-14021.rs index 509459a2ab338dab6865de39a9ad865db9db1482..8c4dd7ddc9a3144bc13e5df294248651ec1a8ba1 100644 --- a/src/test/run-pass/issue-14021.rs +++ b/src/test/run-pass/issue-14021.rs @@ -20,7 +20,7 @@ pub fn main() { let obj = UnitLikeStruct; - let json_str: String = json::encode(&obj); + let json_str: String = json::encode(&obj).unwrap(); let json_object = json::from_str(json_str.as_slice()); let mut decoder = json::Decoder::new(json_object.unwrap());