Skip to content

Commit

Permalink
(feat) impl valuable for json
Browse files Browse the repository at this point in the history
  • Loading branch information
sunng87 committed Jul 11, 2021
1 parent b9c72f0 commit c6df4ef
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 48 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ resolver = "2"
members = [
"valuable",
"valuable-derive",
"valuable-json",
"valuable-serde",
"tests",
]
11 changes: 0 additions & 11 deletions valuable-json/Cargo.toml

This file was deleted.

36 changes: 0 additions & 36 deletions valuable-json/src/lib.rs

This file was deleted.

4 changes: 4 additions & 0 deletions valuable/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
68 changes: 68 additions & 0 deletions valuable/src/json.rs
Original file line number Diff line number Diff line change
@@ -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<String, Json> {
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<String, Json> {
fn size_hint(&self) -> (usize, Option<usize>) {
let len = self.len();
(len, Some(len))
}
}
3 changes: 3 additions & 0 deletions valuable/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,6 @@ pub use visit::{visit, Visit};

#[cfg(feature = "derive")]
pub use valuable_derive::*;

#[cfg(feature = "json")]
mod json;

0 comments on commit c6df4ef

Please sign in to comment.