diff --git a/Cargo.toml b/Cargo.toml index a72d83c..92cffaf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,6 @@ resolver = "2" members = [ "valuable", "valuable-derive", - "valuable-json", "valuable-serde", "tests", ] diff --git a/valuable-json/Cargo.toml b/valuable-json/Cargo.toml deleted file mode 100644 index 14a276d..0000000 --- a/valuable-json/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "valuable-json" -version = "0.1.0" -authors = ["Ning Sun "] -edition = "2018" -license = "MIT" -description = "Valuable instrument for `serde_json::Value`" - -[dependencies] -valuable = { version = "0.1", path = "../valuable", default-features = false } -serde_json = "1" diff --git a/valuable-json/src/lib.rs b/valuable-json/src/lib.rs deleted file mode 100644 index c0d6aec..0000000 --- a/valuable-json/src/lib.rs +++ /dev/null @@ -1,36 +0,0 @@ -use serde_json::{Value as JsonValue}; -use valuable::{Valuable, Value, Visit}; - -struct Json<'a>(&'a JsonValue); - -impl<'a> Valuable for Json<'a> { - fn as_value(&self) -> Value<'a> { - match self.0 { - // TODO: fixme - JsonValue::Array(ref array) => Value::Listable(array), - JsonValue::Bool(ref value) => Value::Bool(*value), - JsonValue::Number(ref num) => { - // TODO: check correctness for this - if num.is_f64() { - Value::F64(num.as_f64().unwrap()) - } else if num.is_i64() { - Value::I64(num.as_i64().unwrap()) - } else if num.is_u64() { - Value::U64(num.as_u64().unwrap()) - } else { - unreachable!() - } - } - JsonValue::Null => Value::Unit, - JsonValue::String(ref s) => Value::String(s), - JsonValue::Object(ref object) => { - // TODO: make map valuable - Value::Mappable(object), - } - } - } - - fn visit(&self, visit: &mut dyn Visit) { - //TODO: - } -} diff --git a/valuable/Cargo.toml b/valuable/Cargo.toml index 4d7818a..ff4bacd 100644 --- a/valuable/Cargo.toml +++ b/valuable/Cargo.toml @@ -18,8 +18,12 @@ std = ["alloc"] # Provide imps for types in Rust's `alloc` library. alloc = [] +# Provides serde_json::Value instrument for valuable +json = ["serde_json"] + [dependencies] valuable-derive = { version = "0.1.0", optional = true, path = "../valuable-derive" } +serde_json = { version = "1.0.46", optional = true } [dev-dependencies] criterion = "0.3" diff --git a/valuable/src/json.rs b/valuable/src/json.rs new file mode 100644 index 0000000..a106cb6 --- /dev/null +++ b/valuable/src/json.rs @@ -0,0 +1,68 @@ +use serde_json::{Map, Value as Json}; + +use crate::{Mappable, Valuable, Value, Visit}; + +impl Valuable for Json { + fn as_value(&self) -> Value<'_> { + match self { + Json::Array(ref array) => array.as_value(), + Json::Bool(ref value) => value.as_value(), + Json::Number(ref num) => { + // TODO: check correctness for this + if num.is_f64() { + Value::F64(num.as_f64().unwrap()) + } else if num.is_i64() { + Value::I64(num.as_i64().unwrap()) + } else if num.is_u64() { + Value::U64(num.as_u64().unwrap()) + } else { + unreachable!() + } + } + Json::Null => Value::Unit, + Json::String(ref s) => s.as_value(), + Json::Object(ref object) => object.as_value(), + } + } + + fn visit(&self, visit: &mut dyn Visit) { + match self { + Json::Array(ref array) => array.visit(visit), + Json::Bool(ref value) => value.visit(visit), + Json::Number(ref num) => { + // TODO: check correctness for this + if num.is_f64() { + num.as_f64().unwrap().visit(visit) + } else if num.is_i64() { + num.as_i64().unwrap().visit(visit) + } else if num.is_u64() { + num.as_u64().unwrap().visit(visit) + } else { + unreachable!() + } + } + Json::Null => Value::Unit.visit(visit), + Json::String(ref s) => s.visit(visit), + Json::Object(ref object) => object.visit(visit), + } + } +} + +impl Valuable for Map { + fn as_value(&self) -> Value<'_> { + Value::Mappable(self) + } + + fn visit(&self, visit: &mut dyn Visit) { + for (k, v) in self.iter() { + visit.visit_entry(k.as_value(), v.as_value()); + } + } +} + +impl Mappable for Map { + fn size_hint(&self) -> (usize, Option) { + let len = self.len(); + (len, Some(len)) + } +} diff --git a/valuable/src/lib.rs b/valuable/src/lib.rs index 7e61b5a..26c84e0 100644 --- a/valuable/src/lib.rs +++ b/valuable/src/lib.rs @@ -135,3 +135,6 @@ pub use visit::{visit, Visit}; #[cfg(feature = "derive")] pub use valuable_derive::*; + +#[cfg(feature = "json")] +mod json;