aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2016-12-30 17:40:23 -0800
committerAlex Crichton <alex@alexcrichton.com>2016-12-30 17:40:40 -0800
commitc391600de19a326a5c9cacba3e833c95de9750a1 (patch)
tree2698d76c259adfb2e8a5c24813b74f0146e8e8af
parentf6992255dff64e42e690a2ab02bf3ea054157dd2 (diff)
downloadmilf-rs-c391600de19a326a5c9cacba3e833c95de9750a1.tar.gz
milf-rs-c391600de19a326a5c9cacba3e833c95de9750a1.zip
Return encoding errors for NaN and infinite
TOML can't actually represent them, so we should bail out. Closes #125
-rw-r--r--src/encoder/mod.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs
index cd52b66..910c970 100644
--- a/src/encoder/mod.rs
+++ b/src/encoder/mod.rs
@@ -62,6 +62,12 @@ pub enum Error {
/// Indicates that a type other than a string was attempted to be used as a
/// map key type.
InvalidMapKeyType,
+ /// An error returned whenever a `NaN` value for a float is attempted to be
+ /// encoded
+ NanEncoded,
+ /// An error returned whenever an infinity value for a float is attempted to
+ /// be encoded
+ InfinityEncoded,
/// A custom error type was generated
Custom(String),
}
@@ -91,6 +97,17 @@ impl Encoder {
}
fn emit_value(&mut self, v: Value) -> Result<(), Error> {
+ match v {
+ Value::Float(f) => {
+ if f.is_nan() {
+ return Err(Error::NanEncoded)
+ }
+ if f.is_infinite() {
+ return Err(Error::InfinityEncoded)
+ }
+ }
+ _ => {}
+ }
match mem::replace(&mut self.state, State::Start) {
State::NextKey(key) => { self.toml.insert(key, v); Ok(()) }
State::NextArray(mut vec) => {
@@ -193,6 +210,8 @@ impl fmt::Display for Error {
at this location"),
Error::InvalidMapKeyType => write!(f, "only strings can be used as \
key types"),
+ Error::NanEncoded => write!(f, "cannot encode NaN"),
+ Error::InfinityEncoded => write!(f, "cannot encode infinity"),
Error::Custom(ref s) => write!(f, "custom error: {}", s),
}
}