@@ -433,6 +433,42 @@ impl Int {
433433 Self :: new_saturating ( self . 0 . saturating_pow ( exp) )
434434 }
435435
436+ /// Deserialization function for use with `#[serde(deserialize_with = ...)]` that performs
437+ /// deserialization through `f64` instead of `i64`.
438+ /// This allows deserializing from numbers with a fractional component like `.0`.
439+ ///
440+ /// # Example
441+ /// ```rs
442+ /// use serde::Deserialize;
443+ /// use js_int::Int;
444+ ///
445+ /// #[derive(Deserialize)]
446+ /// struct Point {
447+ /// #[serde(deserialize_with = "Int::deserialize_via_float")]
448+ /// x: Int;
449+ /// #[serde(deserialize_with = "Int::deserialize_via_float")]
450+ /// y: Int;
451+ /// }
452+ #[ cfg( feature = "serde" ) ]
453+ pub fn deserialize_via_float < ' de , D > ( deserializer : D ) -> Result < Self , D :: Error >
454+ where
455+ D : Deserializer < ' de > ,
456+ {
457+ const EXPECTING : & str =
458+ "a number between -2^53 + 1 and 2^53 - 1 without fractional component" ;
459+
460+ let val = f64:: deserialize ( deserializer) ?;
461+
462+ if val > MAX_SAFE_INT as f64
463+ || val < MIN_SAFE_INT as f64
464+ || !super :: is_acceptable_float ( val)
465+ {
466+ Err ( D :: Error :: invalid_value ( Unexpected :: Float ( val) , & EXPECTING ) )
467+ } else {
468+ Ok ( Self ( val as i64 ) )
469+ }
470+ }
471+
436472 // TODO: wrapping_* methods, overflowing_* methods
437473}
438474
@@ -576,34 +612,14 @@ impl<'de> Deserialize<'de> for Int {
576612 where
577613 D : Deserializer < ' de > ,
578614 {
579- #[ cfg( not( feature = "float_deserialize" ) ) ]
580- {
581- let val = i64:: deserialize ( deserializer) ?;
582-
583- Self :: new ( val) . ok_or_else ( || {
584- D :: Error :: invalid_value (
585- Unexpected :: Signed ( val) ,
586- & "an integer between -2^53 + 1 and 2^53 - 1" ,
587- )
588- } )
589- }
590-
591- #[ cfg( feature = "float_deserialize" ) ]
592- {
593- const EXPECTING : & str =
594- "a number between -2^53 + 1 and 2^53 - 1 without fractional component" ;
615+ let val = i64:: deserialize ( deserializer) ?;
595616
596- let val = f64:: deserialize ( deserializer) ?;
597-
598- if val > MAX_SAFE_INT as f64
599- || val < MIN_SAFE_INT as f64
600- || !super :: is_acceptable_float ( val)
601- {
602- Err ( D :: Error :: invalid_value ( Unexpected :: Float ( val) , & EXPECTING ) )
603- } else {
604- Ok ( Self ( val as i64 ) )
605- }
606- }
617+ Self :: new ( val) . ok_or_else ( || {
618+ D :: Error :: invalid_value (
619+ Unexpected :: Signed ( val) ,
620+ & "an integer between -2^53 + 1 and 2^53 - 1" ,
621+ )
622+ } )
607623 }
608624}
609625
0 commit comments