Skip to content

Commit 6ae5e92

Browse files
committed
Add encode and decode shortcut functions
Now you can just use `json::encode` and `json::decode`, which is very practical **Deprecated `Encoder::str_encode` in favor of `json::encode`** [breaking-change]
1 parent 1e55dce commit 6ae5e92

File tree

1 file changed

+49
-61
lines changed

1 file changed

+49
-61
lines changed

src/libserialize/json.rs

Lines changed: 49 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,23 @@ pub fn error_str(error: ErrorCode) -> &'static str {
314314
}
315315
}
316316

317+
/// Shortcut function to decode a JSON `&str` into an object
318+
pub fn decode<T: ::Decodable<Decoder, DecoderError>>(s: &str) -> DecodeResult<T> {
319+
let json = match from_str(s) {
320+
Ok(x) => x,
321+
Err(e) => return Err(ParseError(e))
322+
};
323+
324+
let mut decoder = Decoder::new(json);
325+
::Decodable::decode(&mut decoder)
326+
}
327+
328+
/// Shortcut function to encode a `T` into a JSON `String`
329+
pub fn encode<'a, T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
330+
let buff = Encoder::buffer_encode(object);
331+
str::from_utf8_owned(buff).unwrap()
332+
}
333+
317334
impl fmt::Show for ErrorCode {
318335
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
319336
error_str(*self).fmt(f)
@@ -382,9 +399,11 @@ impl<'a> Encoder<'a> {
382399
}
383400

384401
/// Encode the specified struct into a json str
402+
///
403+
/// Note: this function is deprecated. Consider using `json::encode` instead.
404+
#[deprecated = "Replaced by `json::encode`"]
385405
pub fn str_encode<T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
386-
let buff = Encoder::buffer_encode(object);
387-
str::from_utf8_owned(buff).unwrap()
406+
encode(object)
388407
}
389408
}
390409

@@ -2456,16 +2475,13 @@ mod tests {
24562475

24572476
#[test]
24582477
fn test_decode_identifiers() {
2459-
let mut decoder = Decoder::new(from_str("null").unwrap());
2460-
let v: () = Decodable::decode(&mut decoder).unwrap();
2478+
let v: () = super::decode("null").unwrap();
24612479
assert_eq!(v, ());
24622480

2463-
let mut decoder = Decoder::new(from_str("true").unwrap());
2464-
let v: bool = Decodable::decode(&mut decoder).unwrap();
2481+
let v: bool = super::decode("true").unwrap();
24652482
assert_eq!(v, true);
24662483

2467-
let mut decoder = Decoder::new(from_str("false").unwrap());
2468-
let v: bool = Decodable::decode(&mut decoder).unwrap();
2484+
let v: bool = super::decode("false").unwrap();
24692485
assert_eq!(v, false);
24702486
}
24712487

@@ -2492,32 +2508,25 @@ mod tests {
24922508

24932509
#[test]
24942510
fn test_decode_numbers() {
2495-
let mut decoder = Decoder::new(from_str("3").unwrap());
2496-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2511+
let v: f64 = super::decode("3").unwrap();
24972512
assert_eq!(v, 3.0);
24982513

2499-
let mut decoder = Decoder::new(from_str("3.1").unwrap());
2500-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2514+
let v: f64 = super::decode("3.1").unwrap();
25012515
assert_eq!(v, 3.1);
25022516

2503-
let mut decoder = Decoder::new(from_str("-1.2").unwrap());
2504-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2517+
let v: f64 = super::decode("-1.2").unwrap();
25052518
assert_eq!(v, -1.2);
25062519

2507-
let mut decoder = Decoder::new(from_str("0.4").unwrap());
2508-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2520+
let v: f64 = super::decode("0.4").unwrap();
25092521
assert_eq!(v, 0.4);
25102522

2511-
let mut decoder = Decoder::new(from_str("0.4e5").unwrap());
2512-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2523+
let v: f64 = super::decode("0.4e5").unwrap();
25132524
assert_eq!(v, 0.4e5);
25142525

2515-
let mut decoder = Decoder::new(from_str("0.4e15").unwrap());
2516-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2526+
let v: f64 = super::decode("0.4e15").unwrap();
25172527
assert_eq!(v, 0.4e15);
25182528

2519-
let mut decoder = Decoder::new(from_str("0.4e-01").unwrap());
2520-
let v: f64 = Decodable::decode(&mut decoder).unwrap();
2529+
let v: f64 = super::decode("0.4e-01").unwrap();
25212530
assert_eq!(v, 0.4e-01);
25222531
}
25232532

@@ -2551,13 +2560,8 @@ mod tests {
25512560
("\"\\uAB12\"", "\uAB12")];
25522561

25532562
for &(i, o) in s.iter() {
2554-
let mut decoder = Decoder::new(from_str(i).unwrap());
2555-
let v: String = Decodable::decode(&mut decoder).unwrap();
2563+
let v: String = super::decode(i).unwrap();
25562564
assert_eq!(v.as_slice(), o);
2557-
2558-
let mut decoder = Decoder::new(from_str(i).unwrap());
2559-
let v: String = Decodable::decode(&mut decoder).unwrap();
2560-
assert_eq!(v, o.to_string());
25612565
}
25622566
}
25632567

@@ -2584,28 +2588,19 @@ mod tests {
25842588

25852589
#[test]
25862590
fn test_decode_list() {
2587-
let mut decoder = Decoder::new(from_str("[]").unwrap());
2588-
let v: Vec<()> = Decodable::decode(&mut decoder).unwrap();
2591+
let v: Vec<()> = super::decode("[]").unwrap();
25892592
assert_eq!(v, vec![]);
25902593

2591-
let mut decoder = Decoder::new(from_str("[null]").unwrap());
2592-
let v: Vec<()> = Decodable::decode(&mut decoder).unwrap();
2594+
let v: Vec<()> = super::decode("[null]").unwrap();
25932595
assert_eq!(v, vec![()]);
25942596

2595-
let mut decoder = Decoder::new(from_str("[true]").unwrap());
2596-
let v: Vec<bool> = Decodable::decode(&mut decoder).unwrap();
2597+
let v: Vec<bool> = super::decode("[true]").unwrap();
25972598
assert_eq!(v, vec![true]);
25982599

2599-
let mut decoder = Decoder::new(from_str("[true]").unwrap());
2600-
let v: Vec<bool> = Decodable::decode(&mut decoder).unwrap();
2601-
assert_eq!(v, vec![true]);
2602-
2603-
let mut decoder = Decoder::new(from_str("[3, 1]").unwrap());
2604-
let v: Vec<int> = Decodable::decode(&mut decoder).unwrap();
2600+
let v: Vec<int> = super::decode("[3, 1]").unwrap();
26052601
assert_eq!(v, vec![3, 1]);
26062602

2607-
let mut decoder = Decoder::new(from_str("[[3], [1, 2]]").unwrap());
2608-
let v: Vec<Vec<uint>> = Decodable::decode(&mut decoder).unwrap();
2603+
let v: Vec<Vec<uint>> = super::decode("[[3], [1, 2]]").unwrap();
26092604
assert_eq!(v, vec![vec![3], vec![1, 2]]);
26102605
}
26112606

@@ -2671,8 +2666,8 @@ mod tests {
26712666
{ \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
26722667
]
26732668
}";
2674-
let mut decoder = Decoder::new(from_str(s).unwrap());
2675-
let v: Outer = Decodable::decode(&mut decoder).unwrap();
2669+
2670+
let v: Outer = super::decode(s).unwrap();
26762671
assert_eq!(
26772672
v,
26782673
Outer {
@@ -2690,44 +2685,37 @@ mod tests {
26902685
}
26912686
#[test]
26922687
fn test_decode_struct_with_nan() {
2693-
let encoded_str = "{\"f\":null,\"a\":[null,123]}";
2694-
let json_object = from_str(encoded_str.as_slice());
2695-
let mut decoder = Decoder::new(json_object.unwrap());
2696-
let after: FloatStruct = Decodable::decode(&mut decoder).unwrap();
2697-
assert!(after.f.is_nan());
2698-
assert!(after.a.get(0).is_nan());
2699-
assert_eq!(after.a.get(1), &123f64);
2688+
let s = "{\"f\":null,\"a\":[null,123]}";
2689+
let obj: FloatStruct = super::decode(s).unwrap();
2690+
assert!(obj.f.is_nan());
2691+
assert!(obj.a.get(0).is_nan());
2692+
assert_eq!(obj.a.get(1), &123f64);
27002693
}
27012694

27022695
#[test]
27032696
fn test_decode_option() {
2704-
let mut decoder = Decoder::new(from_str("null").unwrap());
2705-
let value: Option<String> = Decodable::decode(&mut decoder).unwrap();
2697+
let value: Option<String> = super::decode("null").unwrap();
27062698
assert_eq!(value, None);
27072699

2708-
let mut decoder = Decoder::new(from_str("\"jodhpurs\"").unwrap());
2709-
let value: Option<String> = Decodable::decode(&mut decoder).unwrap();
2700+
let value: Option<String> = super::decode("\"jodhpurs\"").unwrap();
27102701
assert_eq!(value, Some("jodhpurs".to_string()));
27112702
}
27122703

27132704
#[test]
27142705
fn test_decode_enum() {
2715-
let mut decoder = Decoder::new(from_str("\"Dog\"").unwrap());
2716-
let value: Animal = Decodable::decode(&mut decoder).unwrap();
2706+
let value: Animal = super::decode("\"Dog\"").unwrap();
27172707
assert_eq!(value, Dog);
27182708

27192709
let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2720-
let mut decoder = Decoder::new(from_str(s).unwrap());
2721-
let value: Animal = Decodable::decode(&mut decoder).unwrap();
2710+
let value: Animal = super::decode(s).unwrap();
27222711
assert_eq!(value, Frog("Henry".to_string(), 349));
27232712
}
27242713

27252714
#[test]
27262715
fn test_decode_map() {
27272716
let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
27282717
\"fields\":[\"Henry\", 349]}}";
2729-
let mut decoder = Decoder::new(from_str(s).unwrap());
2730-
let mut map: TreeMap<String, Animal> = Decodable::decode(&mut decoder).unwrap();
2718+
let mut map: TreeMap<String, Animal> = super::decode(s).unwrap();
27312719

27322720
assert_eq!(map.pop(&"a".to_string()), Some(Dog));
27332721
assert_eq!(map.pop(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));

0 commit comments

Comments
 (0)