1
Fork 0

libserialize: add error() to Decoder

A quick and dirty fix for #15036 until we get serious decoder reform.

Right now it is impossible for a Decodable to signal a decode error,
for example if it has only finitely many allowed values, is a string
which must be encoded a certain way, needs a valid checksum, etc. For
example in the libuuid implementation of Decodable an Option is
unwrapped, meaning that a decode of a malformed UUID will cause the
task to fail.

Since this adds a method to the `Decoder` trait, all users will need
to update their implementations to add it. The strategy used for the
current implementations for JSON and EBML is to add a new entry to
the error enum `ApplicationError(String)` which stores the string
provided to `.error()`.

[breaking-change]
This commit is contained in:
Andrew Poelstra 2014-07-30 19:35:32 -07:00
parent b495933a7f
commit 5bd8edc112
3 changed files with 19 additions and 6 deletions

View file

@ -257,6 +257,7 @@ pub enum DecoderError {
ExpectedError(String, String),
MissingFieldError(String),
UnknownVariantError(String),
ApplicationError(String)
}
/// Returns a readable error string for a given error code.
@ -2071,6 +2072,10 @@ impl ::Decoder<DecoderError> for Decoder {
debug!("read_map_elt_val(idx={})", idx);
f(self)
}
fn error(&mut self, err: &str) -> DecoderError {
ApplicationError(err.to_string())
}
}
/// A trait for converting values to JSON