Skip to content
This repository was archived by the owner on Dec 1, 2023. It is now read-only.

Commit d60f42b

Browse files
authored
Merge pull request #173 from vinipsmaker/encode-result
Add trait implementation for `Result<T, E>`
2 parents 93e50e2 + 65e0be7 commit d60f42b

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/json.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3206,6 +3206,15 @@ mod tests {
32063206
assert_eq!(value, Frog("Henry".to_string(), 349));
32073207
}
32083208

3209+
#[test]
3210+
fn test_decode_result() {
3211+
let value: Result<i32, i8> = Ok(4);
3212+
let json_value = super::encode(&value).unwrap();
3213+
assert_eq!(json_value, "{\"variant\":\"Ok\",\"fields\":[4]}");
3214+
let decoded_value: Result<i32, i8> = super::decode(&json_value).unwrap();
3215+
assert_eq!(decoded_value, Ok(4));
3216+
}
3217+
32093218
#[test]
32103219
fn test_decode_map() {
32113220
let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\

src/serialize.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,53 @@ impl<T:Decodable> Decodable for Option<T> {
12141214
}
12151215
}
12161216

1217+
impl<T:Encodable, E:Encodable> Encodable for Result<T, E> {
1218+
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
1219+
s.emit_enum("Result", |s| {
1220+
match *self {
1221+
Ok(ref v) => {
1222+
s.emit_enum_variant("Ok", 0, 1, |s| {
1223+
try!(s.emit_enum_variant_arg(0, |s| {
1224+
v.encode(s)
1225+
}));
1226+
Ok(())
1227+
})
1228+
}
1229+
Err(ref v) => {
1230+
s.emit_enum_variant("Err", 1, 1, |s| {
1231+
try!(s.emit_enum_variant_arg(0, |s| {
1232+
v.encode(s)
1233+
}));
1234+
Ok(())
1235+
})
1236+
}
1237+
}
1238+
})
1239+
}
1240+
}
1241+
1242+
impl<T: Decodable, E: Decodable> Decodable for Result<T, E> {
1243+
fn decode<D: Decoder>(d: &mut D) -> Result<Result<T, E>, D::Error> {
1244+
d.read_enum("Result", |d| {
1245+
d.read_enum_variant(&["Ok", "Err"], |d, idx| {
1246+
match idx {
1247+
0 => {
1248+
d.read_enum_variant_arg(0, |d| {
1249+
T::decode(d)
1250+
}).map(|v| Ok(v))
1251+
}
1252+
1 => {
1253+
d.read_enum_variant_arg(0, |d| {
1254+
E::decode(d)
1255+
}).map(|v| Err(v))
1256+
}
1257+
_ => panic!("Internal error"),
1258+
}
1259+
})
1260+
})
1261+
}
1262+
}
1263+
12171264
impl<T> Encodable for PhantomData<T> {
12181265
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
12191266
s.emit_nil()

0 commit comments

Comments
 (0)