From 5bd8edc1121a5736994d69b2dc9cf3efb6fbc116 Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Wed, 30 Jul 2014 19:35:32 -0700 Subject: 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] --- src/libserialize/json.rs | 5 +++++ src/libserialize/serialize.rs | 3 +++ 2 files changed, 8 insertions(+) (limited to 'src/libserialize') diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 0752c68f4d0..58d69e38cc6 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -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 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 diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 03d9445b9b9..95c677bcbd7 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -163,6 +163,9 @@ pub trait Decoder { fn read_map(&mut self, f: |&mut Self, uint| -> Result) -> Result; fn read_map_elt_key(&mut self, idx: uint, f: |&mut Self| -> Result) -> Result; fn read_map_elt_val(&mut self, idx: uint, f: |&mut Self| -> Result) -> Result; + + // Failure + fn error(&mut self, err: &str) -> E; } pub trait Encodable, E> { -- cgit 1.4.1-3-g733a5