Skip to content

Commit 21a2229

Browse files
committed
feat(rad): drop deprecated json library and use serde_json instead
1 parent 0a540a4 commit 21a2229

File tree

4 files changed

+65
-96
lines changed

4 files changed

+65
-96
lines changed

Cargo.lock

Lines changed: 1 addition & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rad/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ if_rust_version = "1.0.0"
1515
# the http crate is used to perform additional validations before passing arguments to the surf http client
1616
# the version of http must be kept in sync with the version used by surf
1717
http = "0.2.1"
18-
json = "0.12.1"
1918
log = "0.4.8"
2019
minidom = { git = "https://github.com/witnet/xmpp-rs", rev = "bc8a33ff5da95ee4039ad7ee3376c100d9e35c74" }
2120
num_enum = "0.4.2"
2221
ordered-float = "3.0"
2322
rand = "0.7.3"
2423
serde = "1.0.111"
25-
serde_cbor = "0.11.1"
24+
serde_cbor = "0.11.2"
25+
serde_json = "1.0.96"
2626
# the url crate is used to perform additional validations before passing arguments to the surf http client
2727
# the version of url must be kept in sync with the version used by surf in the `witnet_net` crate
2828
url = "2.1.1"

rad/src/operators/string.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::{
55
};
66

77
use serde_cbor::value::{from_value, Value};
8+
use serde_json::Value as JsonValue;
89

910
use crate::{
1011
error::RadError,
@@ -21,9 +22,10 @@ const DEFAULT_DECIMAL_SEPARATOR: &str = ".";
2122

2223
/// Parse `RadonTypes` from a JSON-encoded `RadonString`.
2324
pub fn parse_json(input: &RadonString) -> Result<RadonTypes, RadError> {
24-
let json_value = json::parse(&input.value()).map_err(|err| RadError::JsonParse {
25-
description: err.to_string(),
26-
})?;
25+
let json_value: JsonValue =
26+
serde_json::from_str(&input.value()).map_err(|err| RadError::JsonParse {
27+
description: err.to_string(),
28+
})?;
2729

2830
RadonTypes::try_from(json_value)
2931
}
@@ -532,7 +534,7 @@ mod tests {
532534
let output = parse_json_map(&invalid_json).unwrap_err();
533535

534536
let expected_err = RadError::JsonParse {
535-
description: "Unexpected character: } at (1:13)".to_string(),
537+
description: "expected value at line 1 column 13".to_string(),
536538
};
537539
assert_eq!(output, expected_err);
538540

@@ -580,7 +582,7 @@ mod tests {
580582
let output = parse_json_array(&invalid_json).unwrap_err();
581583

582584
let expected_err = RadError::JsonParse {
583-
description: "Unexpected character: } at (1:13)".to_string(),
585+
description: "expected value at line 1 column 13".to_string(),
584586
};
585587
assert_eq!(output, expected_err);
586588

@@ -1133,44 +1135,44 @@ mod tests {
11331135

11341136
#[test]
11351137
fn test_json_numbers_to_radon_numbers() {
1136-
use json::{number::Number, JsonValue};
1138+
use serde_json::{value::Number, Value as JsonValue};
11371139

1138-
let json = JsonValue::Number(Number::from(2.0));
1140+
let json = JsonValue::Number(Number::from_f64(2.0).unwrap());
11391141
let resulting_radon = RadonTypes::try_from(json).unwrap();
11401142
let expected_radon = RadonInteger::from(2).into();
11411143
assert_eq!(resulting_radon, expected_radon);
11421144

1143-
let json = JsonValue::Number(Number::from(20.0));
1145+
let json = JsonValue::Number(Number::from_f64(20.0).unwrap());
11441146
let resulting_radon = RadonTypes::try_from(json).unwrap();
11451147
let expected_radon = RadonInteger::from(20).into();
11461148
assert_eq!(resulting_radon, expected_radon);
11471149

1148-
let json = JsonValue::Number(Number::from(2_000.0));
1150+
let json = JsonValue::Number(Number::from_f64(2_000.0).unwrap());
11491151
let resulting_radon = RadonTypes::try_from(json).unwrap();
11501152
let expected_radon = RadonInteger::from(2_000).into();
11511153
assert_eq!(resulting_radon, expected_radon);
11521154

1153-
let json = JsonValue::Number(Number::from(2_000_000.0));
1155+
let json = JsonValue::Number(Number::from_f64(2_000_000.0).unwrap());
11541156
let resulting_radon = RadonTypes::try_from(json).unwrap();
11551157
let expected_radon = RadonInteger::from(2_000_000).into();
11561158
assert_eq!(resulting_radon, expected_radon);
11571159

1158-
let json = JsonValue::Number(Number::from(std::f64::consts::PI));
1160+
let json = JsonValue::Number(Number::from_f64(std::f64::consts::PI).unwrap());
11591161
let resulting_radon = RadonTypes::try_from(json).unwrap();
11601162
let expected_radon = RadonFloat::from(std::f64::consts::PI).into();
11611163
assert_eq!(resulting_radon, expected_radon);
11621164

1163-
let json = JsonValue::Number(Number::from(1e100));
1165+
let json = JsonValue::Number(Number::from_f64(1e100).unwrap());
11641166
let resulting_radon = RadonTypes::try_from(json).unwrap();
11651167
let expected_radon = RadonFloat::from(1e100).into();
11661168
assert_eq!(resulting_radon, expected_radon);
11671169

1168-
let json = JsonValue::Number(Number::from(4.0));
1170+
let json = JsonValue::Number(Number::from_f64(4.0).unwrap());
11691171
let resulting_radon = RadonTypes::try_from(json).unwrap();
11701172
let expected_radon = RadonInteger::from(4).into();
11711173
assert_eq!(resulting_radon, expected_radon);
11721174

1173-
let json = JsonValue::Number(Number::from(4.1));
1175+
let json = JsonValue::Number(Number::from_f64(4.1).unwrap());
11741176
let resulting_radon = RadonTypes::try_from(json).unwrap();
11751177
let expected_radon = RadonFloat::from(4.1).into();
11761178
assert_eq!(resulting_radon, expected_radon);
@@ -1183,16 +1185,12 @@ mod tests {
11831185
// does not cause any overflows
11841186

11851187
// Parse the number using json::parse because otherwise it is just converted to 0.0
1186-
let json = json::parse("0.1E-99999").unwrap();
1187-
// The exponent is too small to fit in a i16, so the json library saturates the value to
1188-
// i16::MIN:
1189-
let (sign, mantissa, exponent) = json.as_number().unwrap().as_parts();
1190-
assert_eq!((sign, mantissa, exponent), (true, 1, i16::MIN));
1188+
let number: serde_json::Number = serde_json::from_str("0.1E-99999").unwrap();
11911189
// This number is rounded to exactly 0.0 when converted to f64
1192-
assert_eq!(json.as_f64().unwrap(), 0.0);
1190+
assert_eq!(number.as_f64().unwrap(), 0.0);
11931191

11941192
// Convert to RadonTypes
1195-
let resulting_radon = RadonTypes::try_from(json).unwrap();
1193+
let resulting_radon = RadonTypes::try_from(JsonValue::Number(number)).unwrap();
11961194

11971195
// This exponent is too small to fit in a f64, so expected_f64 is equal to 0.0
11981196
let expected_f64 = 0.1E-99999;

rad/src/types/mod.rs

Lines changed: 43 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ use std::{
44
fmt, panic,
55
};
66

7-
use json::JsonValue;
8-
97
use cbor::value::Value as CborValue;
108
use serde::{Serialize, Serializer};
119
use serde_cbor::{to_vec, Value};
10+
use serde_json::Value as JsonValue;
1211
use witnet_crypto::hash::calculate_sha256;
1312
use 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

Comments
 (0)