Skip to content

Commit bd7268c

Browse files
authored
Merge pull request #27 from dtolnay/serde-1.0
Update to Serde 1.0
2 parents dcb708d + 2a299bf commit bd7268c

File tree

3 files changed

+37
-47
lines changed

3 files changed

+37
-47
lines changed

.travis.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,5 @@ env:
55
matrix:
66
- FEATURES=
77
- FEATURES="serde"
8-
- FEATURES="rustc-serialize"
9-
- FEATURES="serde rustc-serialize"
108
script:
119
- cargo test -v --features "$FEATURES"

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ repository = "https://github.com/reem/rust-ordered-float"
99

1010
[dependencies]
1111
num-traits = { version = "0.1", default_features = false }
12-
serde = { version = "0.8", optional = true }
13-
rustc-serialize = { version = "0.3", optional = true }
12+
serde = { version = "1.0", optional = true }
1413
unreachable = "0.1"
1514

1615
[dev-dependencies]
1716
stainless = "0.1"
17+
serde_test = "1.0"

src/lib.rs

Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -559,71 +559,63 @@ fn raw_double_bits<F: Float>(f: &F) -> u64 {
559559
(man & MAN_MASK) | ((exp_u64 << 52) & EXP_MASK) | ((sign_u64 << 63) & SIGN_MASK)
560560
}
561561

562-
#[cfg(feature = "rustc-serialize")]
563-
mod impl_rustc {
564-
extern crate rustc_serialize;
565-
use self::rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
566-
use super::{OrderedFloat, NotNaN};
567-
use std::error::Error;
568-
use num_traits::Float;
569-
570-
impl<T: Float + Encodable> Encodable for OrderedFloat<T> {
571-
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
572-
self.0.encode(s)
573-
}
574-
}
575-
576-
impl<T: Float + Decodable> Decodable for OrderedFloat<T> {
577-
fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> {
578-
T::decode(d).map(OrderedFloat)
579-
}
580-
}
581-
582-
impl<T: Float + Encodable> Encodable for NotNaN<T> {
583-
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
584-
self.0.encode(s)
585-
}
586-
}
587-
588-
impl<T: Float + Decodable> Decodable for NotNaN<T> {
589-
fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> {
590-
T::decode(d).and_then(|v| NotNaN::new(v).map_err(|e| d.error(e.description())))
591-
}
592-
}
593-
}
594-
595562
#[cfg(feature = "serde")]
596563
mod impl_serde {
597564
extern crate serde;
598565
use self::serde::{Serialize, Serializer, Deserialize, Deserializer};
599-
use self::serde::de::Error;
566+
use self::serde::de::{Error, Unexpected};
600567
use super::{OrderedFloat, NotNaN};
601568
use num_traits::Float;
569+
use std::f64;
570+
571+
#[cfg(test)]
572+
extern crate serde_test;
573+
#[cfg(test)]
574+
use self::serde_test::{Token, assert_tokens, assert_de_tokens_error};
602575

603576
impl<T: Float + Serialize> Serialize for OrderedFloat<T> {
604-
fn serialize<S: Serializer>(&self, s: &mut S) -> Result<(), S::Error> {
577+
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
605578
self.0.serialize(s)
606579
}
607580
}
608581

609-
impl<T: Float + Deserialize> Deserialize for OrderedFloat<T> {
610-
fn deserialize<D: Deserializer>(d: &mut D) -> Result<Self, D::Error> {
582+
impl<'de, T: Float + Deserialize<'de>> Deserialize<'de> for OrderedFloat<T> {
583+
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
611584
T::deserialize(d).map(OrderedFloat)
612585
}
613586
}
614587

615588
impl<T: Float + Serialize> Serialize for NotNaN<T> {
616-
fn serialize<S: Serializer>(&self, s: &mut S) -> Result<(), S::Error> {
589+
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
617590
self.0.serialize(s)
618591
}
619592
}
620593

621-
impl<T: Float + Deserialize> Deserialize for NotNaN<T> {
622-
fn deserialize<D: Deserializer>(d: &mut D) -> Result<Self, D::Error> {
623-
T::deserialize(d).and_then(|v| {
624-
NotNaN::new(v)
625-
.map_err(|_| <D::Error as Error>::invalid_value("value cannot be NaN"))
594+
impl<'de, T: Float + Deserialize<'de>> Deserialize<'de> for NotNaN<T> {
595+
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
596+
let float = T::deserialize(d)?;
597+
NotNaN::new(float).map_err(|_| {
598+
Error::invalid_value(Unexpected::Float(f64::NAN), &"float (but not NaN)")
626599
})
627600
}
628601
}
602+
603+
#[test]
604+
fn test_ordered_float() {
605+
let float = OrderedFloat(1.0f64);
606+
assert_tokens(&float, &[Token::F64(1.0)]);
607+
}
608+
609+
#[test]
610+
fn test_not_nan() {
611+
let float = NotNaN(1.0f64);
612+
assert_tokens(&float, &[Token::F64(1.0)]);
613+
}
614+
615+
#[test]
616+
fn test_fail_on_nan() {
617+
assert_de_tokens_error::<NotNaN<f64>>(
618+
&[Token::F64(f64::NAN)],
619+
"invalid value: floating point `NaN`, expected float (but not NaN)");
620+
}
629621
}

0 commit comments

Comments
 (0)