@@ -2,6 +2,27 @@ use std::collections::BTreeMap;
2
2
use std:: ops:: { Index , IndexMut } ;
3
3
use iterators:: { Members , MembersMut , Entries , EntriesMut } ;
4
4
use { JsonResult , JsonError } ;
5
+ use std:: { usize, u8, u16, u32, u64, isize, i8, i16, i32, i64, f32 } ;
6
+
7
+ macro_rules! f64_to_unsinged {
8
+ ( $unsigned: ident, $value: expr) => {
9
+ if $value < 0.0 || $value > $unsigned:: MAX as f64 {
10
+ None
11
+ } else {
12
+ Some ( $value as $unsigned)
13
+ }
14
+ }
15
+ }
16
+
17
+ macro_rules! f64_to_singed {
18
+ ( $signed: ident, $value: expr) => {
19
+ if $value < $signed:: MIN as f64 || $value > $signed:: MAX as f64 {
20
+ None
21
+ } else {
22
+ Some ( $value as $signed)
23
+ }
24
+ }
25
+ }
5
26
6
27
#[ derive( Debug , PartialEq , Clone ) ]
7
28
pub enum JsonValue {
@@ -40,41 +61,111 @@ impl JsonValue {
40
61
}
41
62
}
42
63
64
+ /// Deprecated because the return type is planned to change to
65
+ /// `Option<String>` eventually down the road.
66
+ #[ deprecated( since="0.6.1" , note="Use `as_str` instead" ) ]
43
67
pub fn as_string ( & self ) -> JsonResult < & String > {
44
68
match * self {
45
69
JsonValue :: String ( ref value) => Ok ( value) ,
46
70
_ => Err ( JsonError :: wrong_type ( "String" ) )
47
71
}
48
72
}
49
73
74
+ pub fn as_str ( & self ) -> Option < & str > {
75
+ match * self {
76
+ JsonValue :: String ( ref value) => Some ( value. as_ref ( ) ) ,
77
+ _ => None
78
+ }
79
+ }
80
+
50
81
pub fn is_number ( & self ) -> bool {
51
82
match * self {
52
83
JsonValue :: Number ( _) => true ,
53
84
_ => false ,
54
85
}
55
86
}
56
87
88
+ #[ deprecated( since="0.6.1" , note="Use `as_f64` instead" ) ]
57
89
pub fn as_number ( & self ) -> JsonResult < & f64 > {
58
90
match * self {
59
91
JsonValue :: Number ( ref value) => Ok ( value) ,
60
92
_ => Err ( JsonError :: wrong_type ( "Number" ) )
61
93
}
62
94
}
63
95
96
+ pub fn as_f64 ( & self ) -> Option < f64 > {
97
+ match * self {
98
+ JsonValue :: Number ( ref value) => Some ( * value) ,
99
+ _ => None
100
+ }
101
+ }
102
+
103
+ pub fn as_f32 ( & self ) -> Option < f32 > {
104
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( f32 , value) )
105
+ }
106
+
107
+ pub fn as_u64 ( & self ) -> Option < u64 > {
108
+ self . as_f64 ( ) . and_then ( |value| f64_to_unsinged ! ( u64 , value) )
109
+ }
110
+
111
+ pub fn as_u32 ( & self ) -> Option < u32 > {
112
+ self . as_f64 ( ) . and_then ( |value| f64_to_unsinged ! ( u32 , value) )
113
+ }
114
+
115
+ pub fn as_u16 ( & self ) -> Option < u16 > {
116
+ self . as_f64 ( ) . and_then ( |value| f64_to_unsinged ! ( u16 , value) )
117
+ }
118
+
119
+ pub fn as_u8 ( & self ) -> Option < u8 > {
120
+ self . as_f64 ( ) . and_then ( |value| f64_to_unsinged ! ( u8 , value) )
121
+ }
122
+
123
+ pub fn as_usize ( & self ) -> Option < usize > {
124
+ self . as_f64 ( ) . and_then ( |value| f64_to_unsinged ! ( usize , value) )
125
+ }
126
+
127
+ pub fn as_i64 ( & self ) -> Option < i64 > {
128
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( i64 , value) )
129
+ }
130
+
131
+ pub fn as_i32 ( & self ) -> Option < i32 > {
132
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( i32 , value) )
133
+ }
134
+
135
+ pub fn as_i16 ( & self ) -> Option < i16 > {
136
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( i16 , value) )
137
+ }
138
+
139
+ pub fn as_i8 ( & self ) -> Option < i8 > {
140
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( i8 , value) )
141
+ }
142
+
143
+ pub fn as_isize ( & self ) -> Option < isize > {
144
+ self . as_f64 ( ) . and_then ( |value| f64_to_singed ! ( isize , value) )
145
+ }
146
+
64
147
pub fn is_boolean ( & self ) -> bool {
65
148
match * self {
66
149
JsonValue :: Boolean ( _) => true ,
67
150
_ => false
68
151
}
69
152
}
70
153
154
+ #[ deprecated( since="0.6.1" , note="Unnecessary, use `as_bool` instead" ) ]
71
155
pub fn as_boolean ( & self ) -> JsonResult < & bool > {
72
156
match * self {
73
157
JsonValue :: Boolean ( ref value) => Ok ( value) ,
74
158
_ => Err ( JsonError :: wrong_type ( "Boolean" ) )
75
159
}
76
160
}
77
161
162
+ pub fn as_bool ( & self ) -> Option < bool > {
163
+ match * self {
164
+ JsonValue :: Boolean ( ref value) => Some ( * value) ,
165
+ _ => None
166
+ }
167
+ }
168
+
78
169
pub fn is_null ( & self ) -> bool {
79
170
match * self {
80
171
JsonValue :: Null => true ,
0 commit comments