Skip to content

Commit 81644f0

Browse files
committed
0.6.1 sort out type casting helpers (#9)
1 parent feccd83 commit 81644f0

File tree

4 files changed

+131
-8
lines changed

4 files changed

+131
-8
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "json"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
authors = ["Maciej Hirsz <[email protected]>"]
55
description = "JSON implementation in Rust"
66
repository = "https://github.com/maciejhirsz/json-rust"

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ macro_rules! object {
296296

297297
macro_rules! implement_extras {
298298
($from:ty) => {
299-
impl From<Option<$from>> for JsonValue{
299+
impl From<Option<$from>> for JsonValue {
300300
fn from(val: Option<$from>) -> JsonValue {
301301
match val {
302302
Some(value) => value.into(),
@@ -305,7 +305,7 @@ macro_rules! implement_extras {
305305
}
306306
}
307307

308-
impl From<Vec<$from>> for JsonValue{
308+
impl From<Vec<$from>> for JsonValue {
309309
fn from(mut val: Vec<$from>) -> JsonValue {
310310
JsonValue::Array(val.drain(..)
311311
.map(|value| value.into())

src/value.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,27 @@ use std::collections::BTreeMap;
22
use std::ops::{ Index, IndexMut };
33
use iterators::{ Members, MembersMut, Entries, EntriesMut };
44
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+
}
526

627
#[derive(Debug, PartialEq, Clone)]
728
pub 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,

tests/lib.rs

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,58 @@ use json::{ stringify, stringify_pretty, parse, JsonValue, Null };
77

88
#[test]
99
fn is_as_string() {
10-
let string = JsonValue::String("foo".to_string());
10+
let string = JsonValue::from("foo");
1111

1212
assert!(string.is_string());
13-
assert_eq!(*string.as_string().unwrap(), "foo".to_string());
13+
assert_eq!(string.as_str().unwrap(), "foo");
1414
}
1515

1616
#[test]
1717
fn is_as_number() {
18-
let number = JsonValue::Number(42.0);
18+
let number = JsonValue::from(42);
1919

2020
assert!(number.is_number());
21-
assert_eq!(*number.as_number().unwrap(), 42.0);
21+
assert_eq!(number.as_f64().unwrap(), 42.0f64);
22+
assert_eq!(number.as_f32().unwrap(), 42.0f32);
23+
assert_eq!(number.as_u64().unwrap(), 42u64);
24+
assert_eq!(number.as_u32().unwrap(), 42u32);
25+
assert_eq!(number.as_u16().unwrap(), 42u16);
26+
assert_eq!(number.as_u8().unwrap(), 42u8);
27+
assert_eq!(number.as_usize().unwrap(), 42usize);
28+
assert_eq!(number.as_i64().unwrap(), 42i64);
29+
assert_eq!(number.as_i32().unwrap(), 42i32);
30+
assert_eq!(number.as_i16().unwrap(), 42i16);
31+
assert_eq!(number.as_i8().unwrap(), 42i8);
32+
assert_eq!(number.as_isize().unwrap(), 42isize);
33+
34+
let number = JsonValue::from(-1);
35+
36+
assert_eq!(number.as_u64(), None);
37+
assert_eq!(number.as_u32(), None);
38+
assert_eq!(number.as_u16(), None);
39+
assert_eq!(number.as_u8(), None);
40+
assert_eq!(number.as_usize(), None);
41+
assert_eq!(number.as_i64(), Some(-1));
42+
assert_eq!(number.as_i32(), Some(-1));
43+
assert_eq!(number.as_i16(), Some(-1));
44+
assert_eq!(number.as_i8(), Some(-1));
45+
assert_eq!(number.as_isize(), Some(-1));
46+
47+
let number = JsonValue::from(40_000);
48+
49+
assert_eq!(number.as_u8(), None);
50+
assert_eq!(number.as_u16(), Some(40_000));
51+
assert_eq!(number.as_i8(), None);
52+
assert_eq!(number.as_i16(), None);
53+
assert_eq!(number.as_i32(), Some(40_000));
2254
}
2355

2456
#[test]
2557
fn is_as_boolean() {
2658
let boolean = JsonValue::Boolean(true);
2759

2860
assert!(boolean.is_boolean());
29-
assert_eq!(*boolean.as_boolean().unwrap(), true);
61+
assert_eq!(boolean.as_bool().unwrap(), true);
3062
}
3163

3264
#[test]

0 commit comments

Comments
 (0)