diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index 101531b3..d08bae3b 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -218,6 +218,11 @@ primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32); primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64); primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char); +serde_if_integer128! { + primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128); + primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128); +} + /// A deserializer holding a `u32`. #[derive(Clone, Debug)] pub struct U32Deserializer { diff --git a/test_suite/tests/test_value.rs b/test_suite/tests/test_value.rs index acd3ddd6..80554663 100644 --- a/test_suite/tests/test_value.rs +++ b/test_suite/tests/test_value.rs @@ -25,3 +25,21 @@ fn test_u32_to_enum() { let e: E = E::deserialize(deserializer).unwrap(); assert_eq!(E::B, e); } + +#[test] +fn test_integer128() { + let de_u128 = IntoDeserializer::::into_deserializer(1u128); + let de_i128 = IntoDeserializer::::into_deserializer(1i128); + + // u128 to u128 + assert_eq!(1u128, u128::deserialize(de_u128.clone()).unwrap()); + + // u128 to i128 + assert_eq!(1i128, i128::deserialize(de_u128.clone()).unwrap()); + + // i128 to u128 + assert_eq!(1u128, u128::deserialize(de_i128.clone()).unwrap()); + + // i128 to i128 + assert_eq!(1i128, i128::deserialize(de_i128.clone()).unwrap()); +}