@@ -2,6 +2,27 @@ use std::collections::BTreeMap;
22use std:: ops:: { Index , IndexMut } ;
33use iterators:: { Members , MembersMut , Entries , EntriesMut } ;
44use { 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+ }
526
627#[ derive( Debug , PartialEq , Clone ) ]
728pub enum JsonValue {
@@ -40,41 +61,111 @@ impl JsonValue {
4061 }
4162 }
4263
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" ) ]
4367 pub fn as_string ( & self ) -> JsonResult < & String > {
4468 match * self {
4569 JsonValue :: String ( ref value) => Ok ( value) ,
4670 _ => Err ( JsonError :: wrong_type ( "String" ) )
4771 }
4872 }
4973
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+
5081 pub fn is_number ( & self ) -> bool {
5182 match * self {
5283 JsonValue :: Number ( _) => true ,
5384 _ => false ,
5485 }
5586 }
5687
88+ #[ deprecated( since="0.6.1" , note="Use `as_f64` instead" ) ]
5789 pub fn as_number ( & self ) -> JsonResult < & f64 > {
5890 match * self {
5991 JsonValue :: Number ( ref value) => Ok ( value) ,
6092 _ => Err ( JsonError :: wrong_type ( "Number" ) )
6193 }
6294 }
6395
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+
64147 pub fn is_boolean ( & self ) -> bool {
65148 match * self {
66149 JsonValue :: Boolean ( _) => true ,
67150 _ => false
68151 }
69152 }
70153
154+ #[ deprecated( since="0.6.1" , note="Unnecessary, use `as_bool` instead" ) ]
71155 pub fn as_boolean ( & self ) -> JsonResult < & bool > {
72156 match * self {
73157 JsonValue :: Boolean ( ref value) => Ok ( value) ,
74158 _ => Err ( JsonError :: wrong_type ( "Boolean" ) )
75159 }
76160 }
77161
162+ pub fn as_bool ( & self ) -> Option < bool > {
163+ match * self {
164+ JsonValue :: Boolean ( ref value) => Some ( * value) ,
165+ _ => None
166+ }
167+ }
168+
78169 pub fn is_null ( & self ) -> bool {
79170 match * self {
80171 JsonValue :: Null => true ,
0 commit comments