Skip to content

Commit 46141b5

Browse files
committed
Misc(serde): improve error types and its messages.
- New error type introduced - UnknownLength. Returned on attempt to serialize struct, map or serquence with unknown length (Serde allows this). - The new type is returned if necessary. - Added unit test to check proper empty map serialization.
1 parent e489c7c commit 46141b5

2 files changed

Lines changed: 30 additions & 5 deletions

File tree

rmp-serde/src/encode.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,25 @@ pub enum Error {
2525
/// Failed to write MessagePack'ed single-byte value into the write.
2626
InvalidFixedValueWrite(WriteError),
2727
InvalidValueWrite(ValueWriteError),
28+
29+
/// Failed to serialize struct, sequence or map, because its length is unknown.
30+
UnknownLength,
2831
}
2932

3033
impl ::std::error::Error for Error {
31-
fn description(&self) -> &str { "an error occurred while writing encoded value" }
34+
fn description(&self) -> &str {
35+
match *self {
36+
Error::InvalidFixedValueWrite(..) => "invalid fixed value write",
37+
Error::InvalidValueWrite(..) => "invalid value write",
38+
Error::UnknownLength => "attempt to serialize struct, sequence or map with unknown length",
39+
}
40+
}
3241

3342
fn cause(&self) -> Option<&::std::error::Error> {
3443
match *self {
3544
Error::InvalidFixedValueWrite(ref err) => Some(err),
3645
Error::InvalidValueWrite(ref err) => Some(err),
46+
Error::UnknownLength => None,
3747
}
3848
}
3949
}
@@ -229,7 +239,7 @@ impl<'a, W: VariantWriter> serde::Serializer for Serializer<'a, W> {
229239

230240
let len = match visitor.len() {
231241
Some(len) => len,
232-
None => panic!("do not know how to serialize a sequence with no length"),
242+
None => return Err(Error::UnknownLength),
233243
};
234244

235245
// ... and its arguments length.
@@ -266,7 +276,7 @@ impl<'a, W: VariantWriter> serde::Serializer for Serializer<'a, W> {
266276
{
267277
let len = match visitor.len() {
268278
Some(len) => len,
269-
None => panic!("do not know how to serialize a sequence with no length"),
279+
None => return Err(Error::UnknownLength),
270280
};
271281

272282
try!(write_array_len(&mut self.wr, len as u32));
@@ -287,7 +297,7 @@ impl<'a, W: VariantWriter> serde::Serializer for Serializer<'a, W> {
287297
{
288298
let len = match visitor.len() {
289299
Some(len) => len,
290-
None => panic!("do not know how to serialize a map with no length"),
300+
None => return Err(Error::UnknownLength),
291301
};
292302

293303
try!(write_map_len(&mut self.wr, len as u32));
@@ -316,7 +326,7 @@ impl<'a, W: VariantWriter> serde::Serializer for Serializer<'a, W> {
316326
{
317327
let len = match visitor.len() {
318328
Some(len) => len,
319-
None => panic!("do not know how to serialize a sequence with no length"),
329+
None => return Err(Error::UnknownLength),
320330
};
321331

322332
try!(self.vw.write_struct_len(&mut self.wr, len as u32));

rmp-serde/tests/se.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,21 @@ fn pass_map() {
251251
assert_eq!(out, buf);
252252
}
253253

254+
#[test]
255+
fn pass_empty_map() {
256+
use std::collections::BTreeMap;
257+
258+
let mut buf = vec![];
259+
260+
let val: BTreeMap<u64, u64> = BTreeMap::new();
261+
val.serialize(&mut Serializer::new(&mut buf)).ok().unwrap();
262+
263+
let out = vec![
264+
0x80, // (size: 0)
265+
];
266+
assert_eq!(out, buf);
267+
}
268+
254269
#[test]
255270
fn pass_encoding_struct_into_vec() {
256271
let val = (42u8, "the Answer");

0 commit comments

Comments
 (0)