From 0d540465a5047e578fc66f1380500d8a91385453 Mon Sep 17 00:00:00 2001 From: sunli Date: Sat, 9 May 2020 22:16:39 +0800 Subject: [PATCH] =?UTF-8?q?Remove=20the=20disgusting=20functions=20json=5F?= =?UTF-8?q?value=5Fto=5Fgql=5Fvalue=20and=20gql=5Fvalue=5Fto=5Fjson=5Fvalu?= =?UTF-8?q?e.=F0=9F=98=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- async-graphql-parser/Cargo.toml | 1 + async-graphql-parser/src/value.rs | 42 +++++++++++++++++++++++++++++++ src/context.rs | 20 +-------------- src/scalars/any.rs | 25 +----------------- src/scalars/json.rs | 5 +--- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/async-graphql-parser/Cargo.toml b/async-graphql-parser/Cargo.toml index 4ed79d2b..5337ad87 100644 --- a/async-graphql-parser/Cargo.toml +++ b/async-graphql-parser/Cargo.toml @@ -16,3 +16,4 @@ categories = ["network-programming", "asynchronous"] pest = "2.1.3" pest_derive = "2.1.0" thiserror = "1.0.11" +serde_json = "1.0.48" diff --git a/async-graphql-parser/src/value.rs b/async-graphql-parser/src/value.rs index 0c7c41ab..0e2186c1 100644 --- a/async-graphql-parser/src/value.rs +++ b/async-graphql-parser/src/value.rs @@ -115,3 +115,45 @@ impl fmt::Display for Value { } } } + +impl From for serde_json::Value { + fn from(value: Value) -> Self { + match value { + Value::Null => serde_json::Value::Null, + Value::Variable(name) => name.into(), + Value::Int(n) => n.into(), + Value::Float(n) => n.into(), + Value::String(s) => s.into(), + Value::Boolean(v) => v.into(), + Value::Enum(e) => e.into(), + Value::List(values) => values + .into_iter() + .map(Into::into) + .collect::>() + .into(), + Value::Object(obj) => serde_json::Value::Object( + obj.into_iter() + .map(|(name, value)| (name, value.into())) + .collect(), + ), + } + } +} + +impl From for Value { + fn from(value: serde_json::Value) -> Self { + match value { + serde_json::Value::Null => Value::Null, + serde_json::Value::Bool(n) => Value::Boolean(n), + serde_json::Value::Number(n) if n.is_f64() => Value::Float(n.as_f64().unwrap()), + serde_json::Value::Number(n) => Value::Int(n.as_i64().unwrap()), + serde_json::Value::String(s) => Value::String(s), + serde_json::Value::Array(ls) => Value::List(ls.into_iter().map(Into::into).collect()), + serde_json::Value::Object(obj) => Value::Object( + obj.into_iter() + .map(|(name, value)| (name, value.into())) + .collect(), + ), + } + } +} diff --git a/src/context.rs b/src/context.rs index 5c2a4c1d..57fc0c11 100644 --- a/src/context.rs +++ b/src/context.rs @@ -46,7 +46,7 @@ impl DerefMut for Variables { impl Variables { /// Parse variables from JSON object. pub fn parse_from_json(value: serde_json::Value) -> Result { - if let Value::Object(obj) = json_value_to_gql_value(value) { + if let Value::Object(obj) = value.into() { Ok(Variables(Value::Object(obj))) } else { Ok(Default::default()) @@ -109,24 +109,6 @@ fn file_string(filename: &str, content_type: Option<&str>, path: &Path) -> Strin } } -fn json_value_to_gql_value(value: serde_json::Value) -> Value { - match value { - serde_json::Value::Null => Value::Null, - serde_json::Value::Bool(n) => Value::Boolean(n), - serde_json::Value::Number(n) if n.is_f64() => Value::Float(n.as_f64().unwrap()), - serde_json::Value::Number(n) => Value::Int(n.as_i64().unwrap()), - serde_json::Value::String(s) => Value::String(s), - serde_json::Value::Array(ls) => { - Value::List(ls.into_iter().map(json_value_to_gql_value).collect()) - } - serde_json::Value::Object(obj) => Value::Object( - obj.into_iter() - .map(|(name, value)| (name, json_value_to_gql_value(value))) - .collect(), - ), - } -} - #[derive(Default)] /// Schema/Context data pub struct Data(FnvHashMap>); diff --git a/src/scalars/any.rs b/src/scalars/any.rs index 36526561..e176e4ce 100644 --- a/src/scalars/any.rs +++ b/src/scalars/any.rs @@ -1,6 +1,5 @@ use crate::{Result, ScalarType, Value}; use async_graphql_derive::Scalar; -use itertools::Itertools; use serde::de::DeserializeOwned; /// Any scalar @@ -28,7 +27,7 @@ impl ScalarType for Any { } fn to_json(&self) -> Result { - Ok(gql_value_to_json_value(self.0.clone())) + Ok(self.0.clone().into()) } } @@ -39,28 +38,6 @@ impl Any { } } -pub(crate) fn gql_value_to_json_value(value: Value) -> serde_json::Value { - match value { - Value::Null => serde_json::Value::Null, - Value::Variable(name) => name.into(), - Value::Int(n) => n.into(), - Value::Float(n) => n.into(), - Value::String(s) => s.into(), - Value::Boolean(v) => v.into(), - Value::Enum(e) => e.into(), - Value::List(values) => values - .into_iter() - .map(gql_value_to_json_value) - .collect_vec() - .into(), - Value::Object(obj) => serde_json::Value::Object( - obj.into_iter() - .map(|(k, v)| (k, gql_value_to_json_value(v))) - .collect(), - ), - } -} - impl From for Any where T: Into, diff --git a/src/scalars/json.rs b/src/scalars/json.rs index 584e9045..bfd4b476 100644 --- a/src/scalars/json.rs +++ b/src/scalars/json.rs @@ -1,4 +1,3 @@ -use crate::scalars::any::gql_value_to_json_value; use crate::{Result, ScalarType, Value}; use async_graphql_derive::Scalar; use serde::de::DeserializeOwned; @@ -30,9 +29,7 @@ impl ScalarType for Json { } fn parse(value: &Value) -> Option { - serde_json::from_value(gql_value_to_json_value(value.clone())) - .map(Json) - .ok() + serde_json::from_value(value.clone().into()).map(Json).ok() } fn to_json(&self) -> Result {