@@ -17,62 +17,20 @@ pub enum Value {
1717}
1818
1919impl Value {
20- /// Returns the value as an `i32`.
21- ///
22- /// # Errors
23- ///
24- /// if the value is not an `Int`.
25- pub fn to_int ( & self ) -> Result < i32 > {
26- match self {
27- Value :: Int ( value) => Ok ( * value) ,
28- _ => Err ( InvalidValueType ( "Expected an int value" . to_string ( ) ) ) ,
29- }
30- }
31-
32- /// Returns the value as an `i64`.
33- ///
34- /// # Errors
35- ///
36- /// if the value is not a `Long`
37- pub fn to_long ( & self ) -> Result < i64 > {
38- match self {
39- Value :: Long ( value) => Ok ( * value) ,
40- _ => Err ( InvalidValueType ( "Expected a long value" . to_string ( ) ) ) ,
41- }
42- }
43-
44- /// Returns the value as an `f32`.
45- ///
46- /// # Errors
47- ///
48- /// if the value is not a `Float`
49- pub fn to_float ( & self ) -> Result < f32 > {
50- match self {
51- Value :: Float ( value) => Ok ( * value) ,
52- _ => Err ( InvalidValueType ( "Expected a float value" . to_string ( ) ) ) ,
53- }
54- }
55-
56- /// Returns the value as an `f64`.
57- ///
58- /// # Errors
59- ///
60- /// if the value is not a `Double`
61- pub fn to_double ( & self ) -> Result < f64 > {
62- match self {
63- Value :: Double ( value) => Ok ( * value) ,
64- _ => Err ( InvalidValueType ( "Expected a double value" . to_string ( ) ) ) ,
65- }
20+ /// Returns true if the value is null.
21+ #[ must_use]
22+ pub fn is_null ( & self ) -> bool {
23+ matches ! ( self , Value :: Object ( None ) )
6624 }
6725
68- /// Returns the value as an `Option<Reference>` .
26+ /// Returns a reference to the value if it is an object .
6927 ///
7028 /// # Errors
7129 ///
72- /// if the value is not a `Reference`
73- pub fn to_reference ( & self ) -> Result < Option < Reference > > {
30+ /// If the value is not an object or if it cannot be converted to a reference.
31+ pub fn as_reference ( & self ) -> Result < & Reference > {
7432 match self {
75- Value :: Object ( value ) => Ok ( value . clone ( ) ) ,
33+ Value :: Object ( Some ( reference ) ) => Ok ( reference ) ,
7634 _ => Err ( InvalidValueType ( "Expected a reference value" . to_string ( ) ) ) ,
7735 }
7836 }
@@ -689,88 +647,63 @@ mod tests {
689647 }
690648
691649 #[ test]
692- fn test_int_format ( ) -> Result < ( ) > {
650+ fn test_int_format ( ) {
693651 let value = Value :: Int ( 42 ) ;
694- assert_eq ! ( 42 , value. to_int( ) ?) ;
695652 assert_eq ! ( "int(42)" , value. to_string( ) ) ;
696653 assert ! ( value. is_category_1( ) ) ;
697654 assert ! ( !value. is_category_2( ) ) ;
698- Ok ( ( ) )
699- }
700-
701- #[ test]
702- fn test_to_int_error ( ) {
703- let result = Value :: Long ( 42 ) . to_int ( ) ;
704- assert ! ( matches!( result, Err ( InvalidValueType ( _) ) ) ) ;
705655 }
706656
707657 #[ test]
708- fn test_long_format ( ) -> Result < ( ) > {
658+ fn test_long_format ( ) {
709659 let value = Value :: Long ( 42 ) ;
710- assert_eq ! ( 42 , value. to_long( ) ?) ;
711660 assert_eq ! ( "long(42)" , value. to_string( ) ) ;
712661 assert ! ( !value. is_category_1( ) ) ;
713662 assert ! ( value. is_category_2( ) ) ;
714- Ok ( ( ) )
715- }
716-
717- #[ test]
718- fn test_to_long_error ( ) {
719- let result = Value :: Int ( 42 ) . to_long ( ) ;
720- assert ! ( matches!( result, Err ( InvalidValueType ( _) ) ) ) ;
721663 }
722664
723665 #[ test]
724- fn test_float_format ( ) -> Result < ( ) > {
666+ fn test_float_format ( ) {
725667 let value = Value :: Float ( 42.1 ) ;
726- let compare_value = value. to_float ( ) ? - 42.1f32 ;
727- assert ! ( compare_value. abs( ) < 0.1f32 ) ;
728668 assert_eq ! ( "float(42.1)" , value. to_string( ) ) ;
729669 assert ! ( value. is_category_1( ) ) ;
730670 assert ! ( !value. is_category_2( ) ) ;
731- Ok ( ( ) )
732671 }
733672
734673 #[ test]
735- fn test_to_float_error ( ) {
736- let result = Value :: Int ( 42 ) . to_float ( ) ;
737- assert ! ( matches!( result, Err ( InvalidValueType ( _) ) ) ) ;
738- }
739-
740- #[ test]
741- fn test_double_format ( ) -> Result < ( ) > {
674+ fn test_double_format ( ) {
742675 let value = Value :: Double ( 42.1 ) ;
743- let compare_value = value. to_double ( ) ? - 42.1f64 ;
744- assert ! ( compare_value. abs( ) < 0.1f64 ) ;
745676 assert_eq ! ( "double(42.1)" , value. to_string( ) ) ;
746677 assert ! ( !value. is_category_1( ) ) ;
747678 assert ! ( value. is_category_2( ) ) ;
748- Ok ( ( ) )
749679 }
750680
751681 #[ test]
752- fn test_to_double_error ( ) {
753- let result = Value :: Int ( 42 ) . to_double ( ) ;
754- assert ! ( matches!( result, Err ( InvalidValueType ( _) ) ) ) ;
755- }
756-
757- #[ test]
758- fn test_object_format ( ) -> Result < ( ) > {
682+ fn test_object_format ( ) {
759683 let value = Value :: Object ( None ) ;
760- assert_eq ! ( None , value. to_reference( ) ?) ;
761684 assert_eq ! ( "Object(null)" , value. to_string( ) ) ;
685+ assert ! ( value. is_null( ) ) ;
762686 assert ! ( value. is_category_1( ) ) ;
763687 assert ! ( !value. is_category_2( ) ) ;
764688 assert_eq ! (
765689 "byte[1, 2, 3]" ,
766690 format!( "{}" , Value :: from( vec![ 1i8 , 2i8 , 3i8 ] ) )
767691 ) ;
692+ }
693+
694+ #[ test]
695+ fn test_as_reference ( ) -> Result < ( ) > {
696+ let reference = Reference :: from ( vec ! [ 1i8 , 2i8 , 3i8 ] ) ;
697+ let value = Value :: Object ( Some ( reference) ) ;
698+ let reference = value. as_reference ( ) ?;
699+ let array = reference. as_byte_vec_ref ( ) ?;
700+ assert_eq ! ( array. to_vec( ) , vec![ 1 , 2 , 3 ] ) ;
768701 Ok ( ( ) )
769702 }
770703
771704 #[ test]
772- fn test_to_object_error ( ) {
773- let result = Value :: Int ( 42 ) . to_reference ( ) ;
705+ fn test_as_reference_error ( ) {
706+ let result: Result < & Reference > = Value :: Int ( 42 ) . as_reference ( ) ;
774707 assert ! ( matches!( result, Err ( InvalidValueType ( _) ) ) ) ;
775708 }
776709
@@ -782,6 +715,7 @@ mod tests {
782715 let object = Object :: new ( class) ?;
783716 let string_bytes: Vec < i8 > = "foo" . as_bytes ( ) . to_vec ( ) . iter ( ) . map ( |& b| b as i8 ) . collect ( ) ;
784717 let string_value = Value :: from ( string_bytes) ;
718+ assert ! ( !string_value. is_null( ) ) ;
785719 object. set_value ( "value" , string_value) ?;
786720 let value = Value :: from ( object) ;
787721 assert_eq ! ( "String(\" foo\" )" , value. to_string( ) ) ;
@@ -1322,7 +1256,7 @@ mod tests {
13221256 let value = Value :: from ( object) ;
13231257 let original_values = vec ! [ value] ;
13241258 let value = Value :: try_from ( ( original_class. clone ( ) , original_values. clone ( ) ) ) ?;
1325- let reference = value. to_reference ( ) ?. expect ( "vec" ) ;
1259+ let reference: Reference = value. try_into ( ) ?;
13261260 let reference_class_name = reference. class_name ( ) . to_string ( ) ;
13271261 let reference_values: Vec < Value > = reference. try_into ( ) ?;
13281262 assert_eq ! ( original_class. name( ) , reference_class_name) ;
0 commit comments