@@ -4,11 +4,10 @@ use std::{
44 fmt, panic,
55} ;
66
7- use json:: JsonValue ;
8-
97use cbor:: value:: Value as CborValue ;
108use serde:: { Serialize , Serializer } ;
119use serde_cbor:: { to_vec, Value } ;
10+ use serde_json:: Value as JsonValue ;
1211use witnet_crypto:: hash:: calculate_sha256;
1312use witnet_data_structures:: {
1413 chain:: { tapi:: ActiveWips , Hash } ,
@@ -471,22 +470,31 @@ impl TryFrom<JsonValue> for RadonTypes {
471470 from : "JsonValue::Null" ,
472471 to : "RadonTypes" ,
473472 } ) ,
474- JsonValue :: Short ( short) => Ok ( RadonString :: from ( short. as_str ( ) ) . into ( ) ) ,
475- JsonValue :: String ( string) => Ok ( RadonString :: from ( string) . into ( ) ) ,
473+ JsonValue :: Bool ( boolean) => Ok ( RadonBoolean :: from ( boolean) . into ( ) ) ,
476474 JsonValue :: Number ( number) => {
477- let ( positive, mantissa, exponent) = number. as_parts ( ) ;
478- let floating = f64:: from ( number) ;
479- // Cast the float into an integer if it has no fractional part and its value will fit
480- // into the range of `i128` (38 is the biggest power of 10 that `i128` can safely hold)
481- if floating. fract ( ) == 0.0 && exponent >= 0 && exponent. unsigned_abs ( ) < 38 {
482- let abs = i128:: from ( mantissa) * 10i128 . pow ( exponent. unsigned_abs ( ) . into ( ) ) ;
483- Ok ( RadonInteger :: from ( if positive { abs } else { -abs } ) . into ( ) )
475+ if number. is_i64 ( ) {
476+ Ok ( RadonInteger :: from ( i128:: from ( number. as_i64 ( ) . expect ( "i64" ) ) ) . into ( ) )
477+ } else if number. is_u64 ( ) {
478+ Ok ( RadonInteger :: from ( i128:: from ( number. as_u64 ( ) . expect ( "u64" ) ) ) . into ( ) )
484479 } else {
485- // All other numbers will be treated as a float
486- Ok ( RadonFloat :: from ( floating) . into ( ) )
480+ // Floats that can be safely represented as i128 are converted
481+ let floating = number. as_f64 ( ) . expect ( "f64" ) ;
482+ if floating. is_normal ( ) && floating. fract ( ) == 0.0 && floating. log10 ( ) < 38.0 {
483+ Ok ( RadonInteger :: from ( floating as i128 ) . into ( ) )
484+ } else {
485+ Ok ( RadonFloat :: from ( floating) . into ( ) )
486+ }
487487 }
488488 }
489- JsonValue :: Boolean ( boolean) => Ok ( RadonBoolean :: from ( boolean) . into ( ) ) ,
489+ JsonValue :: String ( string) => Ok ( RadonString :: from ( string) . into ( ) ) ,
490+ JsonValue :: Array ( array) => Ok ( RadonArray :: from (
491+ array
492+ . into_iter ( )
493+ // Skip null values
494+ . filter_map ( |value| RadonTypes :: try_from ( value) . ok ( ) )
495+ . collect :: < Vec < _ > > ( ) ,
496+ )
497+ . into ( ) ) ,
490498 JsonValue :: Object ( object) => Ok ( RadonMap :: from (
491499 object
492500 . iter ( )
@@ -499,14 +507,6 @@ impl TryFrom<JsonValue> for RadonTypes {
499507 . collect :: < BTreeMap < _ , _ > > ( ) ,
500508 )
501509 . into ( ) ) ,
502- JsonValue :: Array ( array) => Ok ( RadonArray :: from (
503- array
504- . into_iter ( )
505- // Skip null values
506- . filter_map ( |value| RadonTypes :: try_from ( value) . ok ( ) )
507- . collect :: < Vec < _ > > ( ) ,
508- )
509- . into ( ) ) ,
510510 }
511511 }
512512}
@@ -694,14 +694,6 @@ mod tests {
694694 assert_eq ! ( rad_decode_error_as_result, vec![ malformed_reveal] ) ;
695695 }
696696
697- #[ test]
698- fn test_json_short_to_radon_types ( ) {
699- let text = "Short" ;
700- let json_value = JsonValue :: Short ( unsafe { json:: short:: Short :: from_slice ( text) } ) ;
701- let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
702- assert_eq ! ( radon_types, RadonString :: from( text) . into( ) ) ;
703- }
704-
705697 #[ test]
706698 fn test_json_string_to_radon_types ( ) {
707699 let text = "This is a proper string because it contains more than 30 characters" ;
@@ -712,83 +704,68 @@ mod tests {
712704
713705 #[ test]
714706 fn test_json_number_to_radon_types ( ) {
715- let json_value = JsonValue :: Number ( json :: number :: Number :: from ( u8:: MAX ) ) ;
707+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( u8:: MAX ) ) ;
716708 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
717709 assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( u8 :: MAX ) ) . into( ) ) ;
718710
719- let json_value = JsonValue :: Number ( json :: number :: Number :: from ( u16:: MAX ) ) ;
711+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( u16:: MAX ) ) ;
720712 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
721713 assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( u16 :: MAX ) ) . into( ) ) ;
722714
723- let json_value = JsonValue :: Number ( json :: number :: Number :: from ( u32:: MAX ) ) ;
715+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( u32:: MAX ) ) ;
724716 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
725717 assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( u32 :: MAX ) ) . into( ) ) ;
726718
727719 // Not using u64::MAX because of precision loss
728- let json_value = JsonValue :: Number ( json :: number :: Number :: from ( u64:: MAX / 100 ) ) ;
720+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( u64:: MAX / 100 ) ) ;
729721 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
730722 assert_eq ! (
731723 radon_types,
732724 RadonInteger :: from( i128 :: from( u64 :: MAX / 100 ) ) . into( )
733725 ) ;
734726
735- // `Number::from` won't take negative numbers, so these are using a workaround
736- let json_value = JsonValue :: Number ( -json:: number:: Number :: from ( i8:: MAX ) ) ;
727+ let json_value = JsonValue :: Number ( serde_json:: Number :: from ( i8:: MIN ) ) ;
737728 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
738- assert_eq ! (
739- radon_types,
740- RadonInteger :: from( i128 :: from( i8 :: MIN + 1 ) ) . into( )
741- ) ;
729+ assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( i8 :: MIN ) ) . into( ) ) ;
742730
743- let json_value = JsonValue :: Number ( -json :: number :: Number :: from ( i16:: MAX ) ) ;
731+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( i16:: MIN ) ) ;
744732 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
745- assert_eq ! (
746- radon_types,
747- RadonInteger :: from( i128 :: from( i16 :: MIN + 1 ) ) . into( )
748- ) ;
733+ assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( i16 :: MIN ) ) . into( ) ) ;
749734
750- let json_value = JsonValue :: Number ( -json :: number :: Number :: from ( i32:: MAX ) ) ;
735+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( i32:: MIN ) ) ;
751736 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
752- assert_eq ! (
753- radon_types,
754- RadonInteger :: from( i128 :: from( i32 :: MIN + 1 ) ) . into( )
755- ) ;
737+ assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( i32 :: MIN ) ) . into( ) ) ;
756738
757- let json_value = JsonValue :: Number ( -json :: number :: Number :: from ( i64:: MAX ) ) ;
739+ let json_value = JsonValue :: Number ( serde_json :: Number :: from ( i64:: MIN ) ) ;
758740 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
759- assert_eq ! (
760- radon_types,
761- RadonInteger :: from( i128 :: from( i64 :: MIN + 1 ) ) . into( )
762- ) ;
741+ assert_eq ! ( radon_types, RadonInteger :: from( i128 :: from( i64 :: MIN ) ) . into( ) ) ;
763742
764- let json_value = JsonValue :: Number ( json:: number:: Number :: from ( std:: f64:: consts:: PI ) ) ;
743+ let json_value =
744+ JsonValue :: Number ( serde_json:: Number :: from_f64 ( std:: f64:: consts:: PI ) . unwrap ( ) ) ;
765745 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
766746 assert_eq ! ( radon_types, RadonFloat :: from( std:: f64 :: consts:: PI ) . into( ) ) ;
767747
768- let json_value = JsonValue :: Number ( -json:: number:: Number :: from ( std:: f64:: consts:: PI ) ) ;
748+ let json_value =
749+ JsonValue :: Number ( serde_json:: Number :: from_f64 ( -std:: f64:: consts:: PI ) . unwrap ( ) ) ;
769750 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
770751 assert_eq ! ( radon_types, RadonFloat :: from( -std:: f64 :: consts:: PI ) . into( ) ) ;
771-
772- let json_value = JsonValue :: Number ( json:: number:: Number :: from ( f64:: NAN ) ) ;
773- let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
774- assert_eq ! ( radon_types, RadonFloat :: from( f64 :: NAN ) . into( ) ) ;
775752 }
776753
777754 #[ test]
778755 fn test_json_boolean_to_radon_types ( ) {
779- let json_value = JsonValue :: Boolean ( true ) ;
756+ let json_value = JsonValue :: Bool ( true ) ;
780757 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
781758 assert_eq ! ( radon_types, RadonBoolean :: from( true ) . into( ) ) ;
782759
783- let json_value = JsonValue :: Boolean ( false ) ;
760+ let json_value = JsonValue :: Bool ( false ) ;
784761 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
785762 assert_eq ! ( radon_types, RadonBoolean :: from( false ) . into( ) ) ;
786763 }
787764
788765 #[ test]
789766 fn test_json_object_to_radon_types ( ) {
790- let data = Vec :: from ( [ ( "foo" , "bar" ) , ( "fee" , "beer" ) ] ) ;
791- let json_value = JsonValue :: Object ( json :: object :: Object :: from_iter ( data. iter ( ) . cloned ( ) ) ) ;
767+ let data = Vec :: from ( [ ( "foo" . into ( ) , "bar" . into ( ) ) , ( "fee" . into ( ) , "beer" . into ( ) ) ] ) ;
768+ let json_value = JsonValue :: Object ( serde_json :: Map :: from_iter ( data. iter ( ) . cloned ( ) ) ) ;
792769 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
793770 assert_eq ! (
794771 radon_types,
@@ -803,7 +780,7 @@ mod tests {
803780 #[ test]
804781 fn test_json_array_to_radon_types ( ) {
805782 let json_value = JsonValue :: Array ( Vec :: from ( [
806- JsonValue :: Boolean ( true ) ,
783+ JsonValue :: Bool ( true ) ,
807784 JsonValue :: String ( "awesomeness" . into ( ) ) ,
808785 ] ) ) ;
809786 let radon_types = RadonTypes :: try_from ( json_value) . unwrap ( ) ;
0 commit comments