From c7ec962b319711528f03162ac4f7eabefed6d9d1 Mon Sep 17 00:00:00 2001 From: Matthew Glazar Date: Sat, 22 Sep 2018 19:36:38 -0700 Subject: [PATCH 1/2] Upgrade to Serde 0.9.0 Prepare to upgrade rustdt-json_rpc to Serde 1.0.0 by upgrading to version 0.9.0. Serde introduced many breaking changes between versions 0.8.0 and 0.9.0: * https://github.com/serde-rs/serde/releases/tag/v0.9.0 * https://github.com/serde-rs/json/releases/tag/v0.9.0 --- Cargo.toml | 4 +- src/json_util.rs | 41 ++++++++++---------- src/jsonrpc.rs | 8 ++-- src/jsonrpc_common.rs | 34 ++++++++++------- src/jsonrpc_message.rs | 10 ++--- src/jsonrpc_request.rs | 55 ++++++++++++++------------- src/jsonrpc_response.rs | 74 ++++++++++++++++++------------------- src/method_types.rs | 12 +++--- src/tests_sample_types.rs | 35 ++++++++++++------ tests/tests_sample_types.rs | 35 ++++++++++++------ 10 files changed, 168 insertions(+), 140 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 972fa72..3e59b14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,8 +12,8 @@ keywords = ["rustdt", "jsonrpc", "json-rpc", "rpc"] [dependencies] rustdt_util = "0.2.3" log = "0.3.6" -serde = "0.8" -serde_json = "0.8" +serde = "0.9" +serde_json = "0.9" futures = "0.1.3" [dev-dependencies] diff --git a/src/json_util.rs b/src/json_util.rs index 00bc150..6531b68 100644 --- a/src/json_util.rs +++ b/src/json_util.rs @@ -5,27 +5,18 @@ // This file may not be copied, modified, or distributed // except according to those terms. -use std::collections::BTreeMap; use std::fmt; +use std::marker::PhantomData; use serde; use serde_json::Map; use serde_json::Value; -use serde_json::builder::ObjectBuilder; pub type JsonObject = Map; /* ----------------- deserialize helpers ----------------- */ -pub fn new_object() -> JsonObject { - BTreeMap::new() -} - -pub fn unwrap_object_builder(ob: ObjectBuilder) -> JsonObject { - unwrap_object(ob.build()) -} - pub fn unwrap_object(value: Value) -> JsonObject { match value { Value::Object(o) => o , @@ -79,16 +70,20 @@ pub trait JsonDeserializerHelper { fn as_u32(&mut self, value: Value) -> Result { match value { - Value::I64(num) => Ok(num as u32), // FIXME: check for truncation - Value::U64(num) => Ok(num as u32), // FIXME: check for truncation + Value::Number(num) => match num.as_u64() { + Some(num) => Ok(num as u32), // FIXME: check for truncation + None => Err(self.new_error(&format!("Value `{}` is not an Integer.", num))), + }, _ => Err(self.new_error(&format!("Value `{}` is not an Integer.", value))), } } fn as_i64(&mut self, value: Value) -> Result { match value { - Value::I64(num) => Ok(num), - Value::U64(num) => Ok(num as i64), // FIXME: check for truncation + Value::Number(num) => match num.as_i64() { + Some(num) => Ok(num), + None => Err(self.new_error(&format!("Value `{}` is not an Integer.", num))), + }, _ => Err(self.new_error(&format!("Value `{}` is not an Integer.", value))), } } @@ -131,10 +126,16 @@ pub trait JsonDeserializerHelper { } -pub struct SerdeJsonDeserializerHelper(pub DE); +pub struct SerdeJsonDeserializerHelper(PhantomData); -impl<'a, DE : serde::Deserializer> - JsonDeserializerHelper for SerdeJsonDeserializerHelper<&'a mut DE> +impl SerdeJsonDeserializerHelper { + pub fn new(_deserializer: &DE) -> SerdeJsonDeserializerHelper { + SerdeJsonDeserializerHelper(PhantomData) + } +} + +impl + JsonDeserializerHelper for SerdeJsonDeserializerHelper { fn new_error(&self, error_message: &str) -> DE::Error { new_de_error(error_message.into()) @@ -145,14 +146,14 @@ pub fn to_de_error(display: DISPLAY) -> DE_ERROR where DISPLAY: fmt::Display, - DE_ERROR: serde::Error, + DE_ERROR: serde::de::Error, { DE_ERROR::custom(format!("{}", display)) } pub fn new_de_error(message: String) -> DE_ERROR - where DE_ERROR: serde::Error + where DE_ERROR: serde::de::Error { DE_ERROR::custom(message) } @@ -205,4 +206,4 @@ pub mod test_util { as_value } -} \ No newline at end of file +} diff --git a/src/jsonrpc.rs b/src/jsonrpc.rs index bcb6548..868a3dd 100644 --- a/src/jsonrpc.rs +++ b/src/jsonrpc.rs @@ -24,7 +24,7 @@ https://github.com/RustDT/rustdt-json_rpc/blob/master/tests/example.rs #![allow(non_camel_case_types)] #[macro_use] extern crate log; -extern crate serde_json; +#[macro_use] extern crate serde_json; extern crate serde; extern crate rustdt_util as util; @@ -459,7 +459,7 @@ impl Endpoint { >(&self, id: Option, method_name: &str, params: PARAMS) -> GResult<()> { - let params_value = serde_json::to_value(¶ms); + let params_value = serde_json::to_value(¶ms)?; let params = jsonrpc_request::to_jsonrpc_params(params_value)?; let rpc_request = Request { id: id.clone(), method : method_name.into(), params : params }; @@ -593,12 +593,12 @@ mod tests_ { let request = Request::new(1, "sample_fn".to_string(), JsonObject::new()); invoke_method(&mut request_handler, &request.method, request.params, |result| - check_request(result.unwrap(), ResponseResult::Error(error_JSON_RPC_InvalidParams(r#"missing field "x""#))) + check_request(result.unwrap(), ResponseResult::Error(error_JSON_RPC_InvalidParams(r#"missing field `x`"#))) ); // test with valid params let params_value = match serde_json::to_value(&new_sample_params(10, 20)) { - Value::Object(object) => object, + Ok(Value::Object(object)) => object, _ => panic!("Not serialized into Object") }; let request = Request::new(1, "sample_fn".to_string(), params_value); diff --git a/src/jsonrpc_common.rs b/src/jsonrpc_common.rs index 4641882..f6d7a98 100644 --- a/src/jsonrpc_common.rs +++ b/src/jsonrpc_common.rs @@ -9,11 +9,12 @@ use std::fmt; use serde; use serde::de::Visitor; -use serde::Error; +use serde::ser::SerializeStruct; use serde_json::Value; use serde_json; use json_util::*; +use json_util::JsonDeserializerHelper; @@ -33,7 +34,7 @@ pub fn parse_jsonrpc_id(id: Value) -> JsonRpcParseResult> { pub enum Id { Number(u64), String(String), Null, } impl serde::Serialize for Id { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { match *self { @@ -45,7 +46,7 @@ impl serde::Serialize for Id { } impl serde::Deserialize for Id { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { deserializer.deserialize(IdDeserializeVisitor) @@ -57,20 +58,25 @@ struct IdDeserializeVisitor; impl Visitor for IdDeserializeVisitor { type Value = Id; - fn visit_unit(&mut self) -> Result where E: Error, + fn visit_unit(self) -> Result { Ok(Id::Null) } - fn visit_u64(&mut self, value: u64) -> Result where E: Error, + fn visit_u64(self, value: u64) -> Result { Ok(Id::Number(value)) } - fn visit_str(&mut self, value: &str) -> Result where E: Error, + fn visit_str(self, value: &str) -> Result { Ok(Id::String(value.to_string())) } + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("an ID") + } } impl fmt::Display for Id { @@ -130,28 +136,28 @@ pub fn error_JSON_RPC_InvalidResponse(error: T) -> RequestError } impl serde::Serialize for RequestError { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { let elem_count = 3; let mut state = try!(serializer.serialize_struct("RequestError", elem_count)); { - try!(serializer.serialize_struct_elt(&mut state, "code", self.code)); - try!(serializer.serialize_struct_elt(&mut state, "message", &self.message)); + try!(state.serialize_field("code", &self.code)); + try!(state.serialize_field("message", &self.message)); if let Some(ref data) = self.data { - try!(serializer.serialize_struct_elt(&mut state, "data", data)); + try!(state.serialize_field("data", data)); } } - serializer.serialize_struct_end(state) + state.end() } } impl serde::Deserialize for RequestError { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { - let mut helper = SerdeJsonDeserializerHelper(deserializer); - let value : Value = try!(Value::deserialize(helper.0)); + let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); + let value : Value = try!(Value::deserialize(deserializer)); let mut json_obj = try!(helper.as_Object(value)); let code = try!(helper.obtain_i64(&mut json_obj, "code")); diff --git a/src/jsonrpc_message.rs b/src/jsonrpc_message.rs index 8c68084..3073323 100644 --- a/src/jsonrpc_message.rs +++ b/src/jsonrpc_message.rs @@ -36,7 +36,7 @@ impl From for Message { } impl serde::Serialize for Message { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { match *self { @@ -47,11 +47,11 @@ impl serde::Serialize for Message { } impl serde::Deserialize for Message { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { - let mut helper = SerdeJsonDeserializerHelper(deserializer); - let value = try!(Value::deserialize(helper.0)); + let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); + let value = try!(Value::deserialize(deserializer)); let json_obj = try!(helper.as_Object(value)); if json_obj.contains_key("method") { @@ -93,4 +93,4 @@ pub mod message_tests { test_serde::(&Request::new(1, "myMethod".to_string(), sample_params).into()); } -} \ No newline at end of file +} diff --git a/src/jsonrpc_request.rs b/src/jsonrpc_request.rs index 2ece5a5..9552c35 100644 --- a/src/jsonrpc_request.rs +++ b/src/jsonrpc_request.rs @@ -5,11 +5,12 @@ // This file may not be copied, modified, or distributed // except according to those terms. +use std::fmt; use serde; use serde::de::Visitor; use serde::de; -use serde::Error; +use serde::ser::SerializeStruct; use serde_json; use serde_json::Value; @@ -55,7 +56,7 @@ impl Request { } impl serde::Serialize for Request { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { // TODO: need to investigate if elem_count = 4 is actually valid when id is missing @@ -63,23 +64,23 @@ impl serde::Serialize for Request { let elem_count = 4; let mut state = try!(serializer.serialize_struct("Request", elem_count)); { - try!(serializer.serialize_struct_elt(&mut state, "jsonrpc", "2.0")); + try!(state.serialize_field("jsonrpc", "2.0")); if let Some(ref id) = self.id { - try!(serializer.serialize_struct_elt(&mut state, "id", id)); + try!(state.serialize_field("id", id)); } - try!(serializer.serialize_struct_elt(&mut state, "method", &self.method)); - try!(serializer.serialize_struct_elt(&mut state, "params", &self.params)); + try!(state.serialize_field("method", &self.method)); + try!(state.serialize_field("params", &self.params)); } - serializer.serialize_struct_end(state) + state.end() } } impl serde::Deserialize for Request { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { - let mut helper = SerdeJsonDeserializerHelper(deserializer); - let value = try!(Value::deserialize(helper.0)); + let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); + let value = try!(Value::deserialize(deserializer)); let mut json_obj = try!(helper.as_Object(value)); try!(check_jsonrpc_field(&mut helper, &mut json_obj)); @@ -119,7 +120,7 @@ impl RequestParams { } impl serde::Serialize for RequestParams { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { match *self { @@ -140,7 +141,7 @@ pub fn to_jsonrpc_params(params: Value) -> GResult { } impl serde::Deserialize for RequestParams { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { deserializer.deserialize(RequestParams_DeserializeVisitor) @@ -152,26 +153,29 @@ struct RequestParams_DeserializeVisitor; impl Visitor for RequestParams_DeserializeVisitor { type Value = RequestParams; - fn visit_unit(&mut self) -> Result - where E: Error, + fn visit_unit(self) -> Result { Ok(RequestParams::None) } - fn visit_seq(&mut self, visitor: V) -> Result + fn visit_seq(self, visitor: V) -> Result where V: de::SeqVisitor, { let values = try!(de::impls::VecVisitor::new().visit_seq(visitor)); Ok(RequestParams::Array(values)) } - fn visit_map(&mut self, visitor: V) -> Result + fn visit_map(self, visitor: V) -> Result where V: de::MapVisitor, { let values = try!(de::impls::BTreeMapVisitor::new().visit_map(visitor)); - Ok(RequestParams::Object(values)) + Ok(RequestParams::Object(values.into_iter().collect())) } + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("params") + } } @@ -187,16 +191,15 @@ pub mod request_tests { use jsonrpc_common::*; use serde_json::Value; - use serde_json::builder::ObjectBuilder; #[test] fn test__RequestParams() { - let sample_obj = unwrap_object_builder(ObjectBuilder::new().insert("xxx", 123)); + let sample_obj = json!({"xxx": 123}).as_object().unwrap().clone(); let sample_string = Value::String("blah".into()); - test_serde__RequestParams(RequestParams::Object(sample_obj.clone())); + test_serde__RequestParams(RequestParams::Object(sample_obj)); test_serde__RequestParams(RequestParams::Array(vec![sample_string.clone(), sample_string])); test_serde__RequestParams(RequestParams::None); } @@ -214,10 +217,10 @@ pub mod request_tests { #[test] fn test_Request() { - let sample_params = unwrap_object_builder(ObjectBuilder::new() - .insert("param", "2.0") - .insert("foo", 123) - ); + let sample_params = json!({ + "param": "2.0", + "foo": 123, + }).as_object().unwrap().clone(); // Test invalid JSON test_error_de::( @@ -258,7 +261,7 @@ pub mod request_tests { // --- Test serialization --- // basic Request - let request = Request::new(1, "myMethod".to_string(), sample_params.clone()); + let request = Request::new(1, "myMethod".to_string(), sample_params); test_serde(&request); // Test basic Request, no params @@ -271,4 +274,4 @@ pub mod request_tests { test_serde(&request); } -} \ No newline at end of file +} diff --git a/src/jsonrpc_response.rs b/src/jsonrpc_response.rs index 6f46992..6f8c4c0 100644 --- a/src/jsonrpc_response.rs +++ b/src/jsonrpc_response.rs @@ -7,6 +7,7 @@ use serde; +use serde::ser::SerializeStruct; use serde_json; use serde_json::Value; @@ -60,34 +61,34 @@ impl ResponseResult { impl serde::Serialize for Response { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { let elem_count = 3; let mut state = try!(serializer.serialize_struct("Response", elem_count)); { - try!(serializer.serialize_struct_elt(&mut state, "jsonrpc", "2.0")); - try!(serializer.serialize_struct_elt(&mut state, "id", &self.id)); + try!(state.serialize_field("jsonrpc", "2.0")); + try!(state.serialize_field("id", &self.id)); match self.result_or_error { ResponseResult::Result(ref value) => { - try!(serializer.serialize_struct_elt(&mut state, "result", &value)); + try!(state.serialize_field("result", &value)); } ResponseResult::Error(ref json_rpc_error) => { - try!(serializer.serialize_struct_elt(&mut state, "error", &json_rpc_error)); + try!(state.serialize_field("error", &json_rpc_error)); } } } - serializer.serialize_struct_end(state) + state.end() } } impl serde::Deserialize for Response { - fn deserialize(deserializer: &mut DE) -> Result + fn deserialize(deserializer: DE) -> Result where DE: serde::Deserializer { - let mut helper = SerdeJsonDeserializerHelper(deserializer); - let value = try!(Value::deserialize(helper.0)); + let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); + let value = try!(Value::deserialize(deserializer)); let mut json_obj = try!(helper.as_Object(value)); try!(check_jsonrpc_field(&mut helper, &mut json_obj)); @@ -121,10 +122,9 @@ pub mod response_tests { use json_util::test_util::*; use serde_json::Value; - use serde_json::builder::ObjectBuilder; pub fn sample_json_obj(foo: u32) -> Value { - ObjectBuilder::new().insert("foo", foo).build() + json!({"foo": foo}) } #[test] @@ -150,42 +150,38 @@ pub mod response_tests { let response = Response::new_result(Id::Null, sample_json_obj(100)); - test_serde_expecting(&response, &ObjectBuilder::new() - .insert("jsonrpc", "2.0") - .insert("id", Id::Null) - .insert("result", sample_json_obj(100)) - .build() - ); + test_serde_expecting(&response, &json!({ + "jsonrpc": "2.0", + "id": Id::Null, + "result": sample_json_obj(100), + })); let response = Response::new_result(Id::Number(123), sample_json_obj(200)); - test_serde_expecting(&response, &ObjectBuilder::new() - .insert("jsonrpc", "2.0") - .insert("id", 123) - .insert("result", sample_json_obj(200)) - .build() - ); + test_serde_expecting(&response, &json!({ + "jsonrpc": "2.0", + "id": 123, + "result": sample_json_obj(200), + })); let response = Response::new_result(Id::Null, sample_json_obj(200)); - test_serde_expecting(&response, &ObjectBuilder::new() - .insert("jsonrpc", "2.0") - .insert("id", Value::Null) - .insert("result", sample_json_obj(200)) - .build() - ); + test_serde_expecting(&response, &json!({ + "jsonrpc": "2.0", + "id": Value::Null, + "result": sample_json_obj(200), + })); let response = Response::new_error(Id::String("321".to_string()), RequestError{ code: 5, message: "msg".to_string(), data: Some(sample_json_obj(300)) }); - test_serde_expecting(&response, &ObjectBuilder::new() - .insert("jsonrpc", "2.0") - .insert("id", "321") - .insert("error", unwrap_object_builder(ObjectBuilder::new() - .insert("code", 5) - .insert("message", "msg") - .insert("data", sample_json_obj(300)) - )) - .build() - ); + test_serde_expecting(&response, &json!({ + "jsonrpc": "2.0", + "id": "321", + "error": { + "code": 5, + "message": "msg", + "data": sample_json_obj(300), + }, + })); } } diff --git a/src/method_types.rs b/src/method_types.rs index ab3c1dc..c789e0a 100644 --- a/src/method_types.rs +++ b/src/method_types.rs @@ -41,14 +41,14 @@ where { match method_result { Ok(ret) => { - ResponseResult::Result(serde_json::to_value(&ret)) + ResponseResult::Result(serde_json::to_value(&ret).unwrap()) } Err(error) => { let code : u32 = error.code; let request_error = RequestError { code : code as i64, // Safe convertion. TODO: use TryFrom when it's stable message : error.message, - data : Some(serde_json::to_value(&error.data)), + data : Some(serde_json::to_value(&error.data).unwrap()), }; ResponseResult::Error(request_error) } @@ -118,18 +118,18 @@ impl< // Test Ok let params = new_sample_params(10, 20); - let response_result = ResponseResult::Result(serde_json::to_value(¶ms)); + let response_result = ResponseResult::Result(serde_json::to_value(¶ms).unwrap()); assert_eq!( RequestResult::::from(response_result), RequestResult::MethodResult(Ok(params.clone())) ); // Test invalid MethodResult response - let response_result = ResponseResult::Result(serde_json::to_value(&new_sample_params(10, 20))); + let response_result = ResponseResult::Result(serde_json::to_value(&new_sample_params(10, 20)).unwrap()); assert_eq!( RequestResult::::from(response_result), RequestResult::RequestError(error_JSON_RPC_InvalidResponse( - r#"invalid type: map at line 0 column 0"#)) + r#"invalid type: map, expected a string"#)) ); } - \ No newline at end of file + diff --git a/src/tests_sample_types.rs b/src/tests_sample_types.rs index a61b821..689d409 100644 --- a/src/tests_sample_types.rs +++ b/src/tests_sample_types.rs @@ -3,7 +3,10 @@ #![cfg(test)] +use std::fmt; + use serde; +use serde::ser::SerializeStruct; #[derive(Debug, Clone, PartialEq)] pub struct Point { @@ -29,7 +32,7 @@ pub enum PointField { impl serde::Deserialize for PointField { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer { struct PointFieldVisitor; @@ -37,7 +40,7 @@ impl serde::Deserialize for PointField { impl serde::de::Visitor for PointFieldVisitor { type Value = PointField; - fn visit_str(&mut self, value: &str) -> Result + fn visit_str(self, value: &str) -> Result where E: serde::de::Error { match value { @@ -46,6 +49,11 @@ impl serde::Deserialize for PointField { _ => Err(serde::de::Error::custom("expected x or y")), } } + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("x or y") + } } deserializer.deserialize(PointFieldVisitor) @@ -53,7 +61,7 @@ impl serde::Deserialize for PointField { } impl serde::Deserialize for Point { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer { static FIELDS: &'static [&'static str] = &["x", "y"]; @@ -66,7 +74,7 @@ struct PointVisitor; impl serde::de::Visitor for PointVisitor { type Value = Point; - fn visit_map(&mut self, mut visitor: V) -> Result + fn visit_map(self, mut visitor: V) -> Result where V: serde::de::MapVisitor { let mut x = None; @@ -82,31 +90,34 @@ impl serde::de::Visitor for PointVisitor { let x = match x { Some(x) => x, - None => try!(visitor.missing_field("x")), + None => return Err(::missing_field("x")), }; let y = match y { Some(y) => y, - None => try!(visitor.missing_field("y")), + None => return Err(::missing_field("y")), }; - try!(visitor.end()); - Ok(Point{ x: x, y: y }) } + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("a point") + } } impl serde::Serialize for Point { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let elem_count = 2; let mut state = try!(serializer.serialize_struct("Point", elem_count)); { - try!(serializer.serialize_struct_elt(&mut state, "x", &self.x)); - try!(serializer.serialize_struct_elt(&mut state, "y", &self.y)); + try!(state.serialize_field("x", &self.x)); + try!(state.serialize_field("y", &self.y)); } - serializer.serialize_struct_end(state) + state.end() } } diff --git a/tests/tests_sample_types.rs b/tests/tests_sample_types.rs index e23520a..c8784af 100644 --- a/tests/tests_sample_types.rs +++ b/tests/tests_sample_types.rs @@ -3,7 +3,10 @@ #![cfg(test)] +use std::fmt; + extern crate serde; +use serde::ser::SerializeStruct; #[derive(Debug, Clone, PartialEq)] pub struct Point { @@ -22,7 +25,7 @@ pub enum PointField { impl serde::Deserialize for PointField { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer { struct PointFieldVisitor; @@ -30,7 +33,7 @@ impl serde::Deserialize for PointField { impl serde::de::Visitor for PointFieldVisitor { type Value = PointField; - fn visit_str(&mut self, value: &str) -> Result + fn visit_str(self, value: &str) -> Result where E: serde::de::Error { match value { @@ -39,6 +42,11 @@ impl serde::Deserialize for PointField { _ => Err(serde::de::Error::custom("expected x or y")), } } + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("x or y") + } } deserializer.deserialize(PointFieldVisitor) @@ -46,7 +54,7 @@ impl serde::Deserialize for PointField { } impl serde::Deserialize for Point { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer { static FIELDS: &'static [&'static str] = &["x", "y"]; @@ -59,7 +67,7 @@ struct PointVisitor; impl serde::de::Visitor for PointVisitor { type Value = Point; - fn visit_map(&mut self, mut visitor: V) -> Result + fn visit_map(self, mut visitor: V) -> Result where V: serde::de::MapVisitor { let mut x = None; @@ -75,31 +83,34 @@ impl serde::de::Visitor for PointVisitor { let x = match x { Some(x) => x, - None => try!(visitor.missing_field("x")), + None => return Err(::missing_field("x")), }; let y = match y { Some(y) => y, - None => try!(visitor.missing_field("y")), + None => return Err(::missing_field("y")), }; - try!(visitor.end()); - Ok(Point{ x: x, y: y }) } + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result + { + formatter.write_str("a point") + } } impl serde::Serialize for Point { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let elem_count = 2; let mut state = try!(serializer.serialize_struct("Point", elem_count)); { - try!(serializer.serialize_struct_elt(&mut state, "x", &self.x)); - try!(serializer.serialize_struct_elt(&mut state, "y", &self.y)); + try!(state.serialize_field("x", &self.x)); + try!(state.serialize_field("y", &self.y)); } - serializer.serialize_struct_end(state) + state.end() } } From 5e0768bd7878aeae37569ac8e4cba50392393e13 Mon Sep 17 00:00:00 2001 From: Matthew Glazar Date: Sat, 22 Sep 2018 23:06:47 -0700 Subject: [PATCH 2/2] Upgrade to Serde 1.0.0 Upgrade rustdt-json_rpc to the Serde 1.0.0. Using a stable version of Serde will let people more easily use rustdt-json_rpc. Serde introduced many breaking changes between versions 0.9.0 and 1.0.0: * https://github.com/serde-rs/serde/releases/tag/v1.0.0 * https://github.com/serde-rs/json/releases/tag/v1.0.0 --- Cargo.toml | 4 ++-- src/json_util.rs | 12 ++++++------ src/jsonrpc.rs | 17 ++++++++++------- src/jsonrpc_common.rs | 12 ++++++------ src/jsonrpc_message.rs | 4 ++-- src/jsonrpc_request.rs | 32 +++++++++++++++++++------------- src/jsonrpc_response.rs | 4 ++-- src/map_request_handler.rs | 16 ++++++++++------ src/method_types.rs | 8 ++++---- src/tests_sample_types.rs | 22 +++++++++++----------- tests/tests_sample_types.rs | 22 +++++++++++----------- 11 files changed, 83 insertions(+), 70 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3e59b14..fa667f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,8 +12,8 @@ keywords = ["rustdt", "jsonrpc", "json-rpc", "rpc"] [dependencies] rustdt_util = "0.2.3" log = "0.3.6" -serde = "0.9" -serde_json = "0.9" +serde = "1.0" +serde_json = "1.0" futures = "0.1.3" [dev-dependencies] diff --git a/src/json_util.rs b/src/json_util.rs index 6531b68..bd7ec1f 100644 --- a/src/json_util.rs +++ b/src/json_util.rs @@ -134,7 +134,7 @@ impl SerdeJsonDeserializerHelper { } } -impl +impl<'de, DE : serde::Deserializer<'de>> JsonDeserializerHelper for SerdeJsonDeserializerHelper { fn new_error(&self, error_message: &str) -> DE::Error { @@ -174,13 +174,13 @@ pub mod test_util { serde_json::to_string(value).unwrap() } - pub fn from_json(json: &str) -> T { + pub fn from_json<'de, T: Deserialize<'de>>(json: &'de str) -> T { serde_json::from_str(json).unwrap() } pub fn test_serde(obj: &T) -> (T, String) - where T : Serialize + Deserialize + PartialEq + Debug + where for<'de> T : Serialize + Deserialize<'de> + PartialEq + Debug { let json = to_json(obj); let reserialized : T = from_json(&json); @@ -188,8 +188,8 @@ pub mod test_util { (reserialized, json) } - pub fn test_error_de(json: &str, expected_err_contains: &str) - where T : Deserialize + PartialEq + Debug + pub fn test_error_de<'de, T>(json: &'de str, expected_err_contains: &str) + where T : Deserialize<'de> + PartialEq + Debug { let res = serde_json::from_str::(json).unwrap_err(); check_err_contains(res, expected_err_contains); @@ -197,7 +197,7 @@ pub mod test_util { pub fn test_serde_expecting(obj: &T, expected_value: &Value) -> Value - where T : Serialize + Deserialize + PartialEq + Debug + where for<'de> T : Serialize + Deserialize<'de> + PartialEq + Debug { let json = test_serde(obj).1; diff --git a/src/jsonrpc.rs b/src/jsonrpc.rs index 868a3dd..fc920c4 100644 --- a/src/jsonrpc.rs +++ b/src/jsonrpc.rs @@ -275,7 +275,7 @@ impl ResponseCompletable { self, params: RequestParams, method_handler: METHOD ) where - PARAMS : serde::Deserialize, + for<'de> PARAMS : serde::Deserialize<'de>, RET : serde::Serialize, RET_ERROR : serde::Serialize, METHOD : FnOnce(PARAMS, MethodCompletable), @@ -288,7 +288,7 @@ impl ResponseCompletable { self, params: RequestParams, sync_method_handler: METHOD ) where - PARAMS : serde::Deserialize, + for<'de> PARAMS : serde::Deserialize<'de>, RET : serde::Serialize, RET_ERROR : serde::Serialize , METHOD : FnOnce(PARAMS) -> MethodResult, @@ -303,7 +303,7 @@ impl ResponseCompletable { self, params: RequestParams, method_handler: METHOD ) where - PARAMS : serde::Deserialize, + for<'de> PARAMS : serde::Deserialize<'de>, METHOD : FnOnce(PARAMS), { let mc = MethodCompletable::<(), ()>::new(self); @@ -318,7 +318,7 @@ impl ResponseCompletable { self, params: RequestParams, sync_method_handler: METHOD ) where - PARAMS : serde::Deserialize, + for<'de> PARAMS : serde::Deserialize<'de>, METHOD : FnOnce(PARAMS), { self.handle_notification_with(params, |params| { @@ -359,7 +359,7 @@ impl< method_fn: METHOD ) where - PARAMS : serde::Deserialize, + for<'de> PARAMS : serde::Deserialize<'de>, RET : serde::Serialize, RET_ERROR : serde::Serialize, METHOD : FnOnce(PARAMS, Self), @@ -421,11 +421,14 @@ impl Endpoint { /// Send a (non-notification) request pub fn send_request< + RET, + RET_ERROR, PARAMS : serde::Serialize, - RET: serde::Deserialize, - RET_ERROR : serde::Deserialize, >(&mut self, method_name: &str, params: PARAMS) -> GResult> + where + for<'de> RET: serde::Deserialize<'de>, + for<'de> RET_ERROR : serde::Deserialize<'de>, { let (completable, future) = futures::oneshot::(); let future : futures::Oneshot = future; diff --git a/src/jsonrpc_common.rs b/src/jsonrpc_common.rs index f6d7a98..acb3d31 100644 --- a/src/jsonrpc_common.rs +++ b/src/jsonrpc_common.rs @@ -45,17 +45,17 @@ impl serde::Serialize for Id { } } -impl serde::Deserialize for Id { +impl<'de> serde::Deserialize<'de> for Id { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { - deserializer.deserialize(IdDeserializeVisitor) + deserializer.deserialize_any(IdDeserializeVisitor) } } struct IdDeserializeVisitor; -impl Visitor for IdDeserializeVisitor { +impl<'de> Visitor<'de> for IdDeserializeVisitor { type Value = Id; fn visit_unit(self) -> Result @@ -152,9 +152,9 @@ impl serde::Serialize for RequestError { } } -impl serde::Deserialize for RequestError { +impl<'de> serde::Deserialize<'de> for RequestError { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); let value : Value = try!(Value::deserialize(deserializer)); diff --git a/src/jsonrpc_message.rs b/src/jsonrpc_message.rs index 3073323..ffc2e33 100644 --- a/src/jsonrpc_message.rs +++ b/src/jsonrpc_message.rs @@ -46,9 +46,9 @@ impl serde::Serialize for Message { } } -impl serde::Deserialize for Message { +impl<'de> serde::Deserialize<'de> for Message { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); let value = try!(Value::deserialize(deserializer)); diff --git a/src/jsonrpc_request.rs b/src/jsonrpc_request.rs index 9552c35..5391bd5 100644 --- a/src/jsonrpc_request.rs +++ b/src/jsonrpc_request.rs @@ -75,9 +75,9 @@ impl serde::Serialize for Request { } } -impl serde::Deserialize for Request { +impl<'de> serde::Deserialize<'de> for Request { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); let value = try!(Value::deserialize(deserializer)); @@ -140,17 +140,17 @@ pub fn to_jsonrpc_params(params: Value) -> GResult { } } -impl serde::Deserialize for RequestParams { +impl<'de> serde::Deserialize<'de> for RequestParams { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { - deserializer.deserialize(RequestParams_DeserializeVisitor) + deserializer.deserialize_any(RequestParams_DeserializeVisitor) } } struct RequestParams_DeserializeVisitor; -impl Visitor for RequestParams_DeserializeVisitor { +impl<'de> Visitor<'de> for RequestParams_DeserializeVisitor { type Value = RequestParams; fn visit_unit(self) -> Result @@ -158,18 +158,24 @@ impl Visitor for RequestParams_DeserializeVisitor { Ok(RequestParams::None) } - fn visit_seq(self, visitor: V) -> Result - where V: de::SeqVisitor, + fn visit_seq(self, mut access: V) -> Result + where V: de::SeqAccess<'de>, { - let values = try!(de::impls::VecVisitor::new().visit_seq(visitor)); + let mut values = Vec::new(); + while let Some(value) = access.next_element()? { + values.push(value); + } Ok(RequestParams::Array(values)) } - fn visit_map(self, visitor: V) -> Result - where V: de::MapVisitor, + fn visit_map(self, mut access: V) -> Result + where V: de::MapAccess<'de>, { - let values = try!(de::impls::BTreeMapVisitor::new().visit_map(visitor)); - Ok(RequestParams::Object(values.into_iter().collect())) + let mut values = serde_json::value::Map::new(); + while let Some((key, value)) = access.next_entry()? { + values.insert(key, value); + } + Ok(RequestParams::Object(values)) } fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result diff --git a/src/jsonrpc_response.rs b/src/jsonrpc_response.rs index 6f8c4c0..6798928 100644 --- a/src/jsonrpc_response.rs +++ b/src/jsonrpc_response.rs @@ -83,9 +83,9 @@ impl serde::Serialize for Response { } } -impl serde::Deserialize for Response { +impl<'de> serde::Deserialize<'de> for Response { fn deserialize(deserializer: DE) -> Result - where DE: serde::Deserializer + where DE: serde::Deserializer<'de> { let mut helper = SerdeJsonDeserializerHelper::new(&deserializer); let value = try!(Value::deserialize(deserializer)); diff --git a/src/map_request_handler.rs b/src/map_request_handler.rs index b37cf46..09c1064 100644 --- a/src/map_request_handler.rs +++ b/src/map_request_handler.rs @@ -32,13 +32,14 @@ impl MapRequestHandler { MapRequestHandler { method_handlers : HashMap::new() } } - pub fn add_notification< - PARAMS : serde::Deserialize + 'static, - >( + pub fn add_notification( &mut self, method_name: &'static str, method_fn: Box - ) { + ) + where + for<'de> PARAMS : serde::Deserialize<'de> + 'static, + { let req_handler : Box = new(move |params, completable| { completable.sync_handle_notification(params, &*method_fn); }); @@ -46,14 +47,17 @@ impl MapRequestHandler { } pub fn add_request< - PARAMS : serde::Deserialize + 'static, + PARAMS, RET : serde::Serialize + 'static, RET_ERROR : serde::Serialize + 'static >( &mut self, method_name: &'static str, method_fn: Box MethodResult> - ) { + ) + where + for<'de> PARAMS : serde::Deserialize<'de> + 'static, + { let req_handler : Box = new(move |params, completable| { completable.sync_handle_request(params, &*method_fn); }); diff --git a/src/method_types.rs b/src/method_types.rs index c789e0a..91ddba5 100644 --- a/src/method_types.rs +++ b/src/method_types.rs @@ -78,10 +78,10 @@ impl RequestResult { } } -impl< - RET : serde::Deserialize, - RET_ERROR : serde::Deserialize, -> From for RequestResult +impl From for RequestResult +where + for<'de> RET : serde::Deserialize<'de>, + for<'de> RET_ERROR : serde::Deserialize<'de>, { fn from(response_result : ResponseResult) -> Self { diff --git a/src/tests_sample_types.rs b/src/tests_sample_types.rs index 689d409..86837ee 100644 --- a/src/tests_sample_types.rs +++ b/src/tests_sample_types.rs @@ -31,13 +31,13 @@ pub enum PointField { } -impl serde::Deserialize for PointField { +impl<'de> serde::Deserialize<'de> for PointField { fn deserialize(deserializer: D) -> Result - where D: serde::de::Deserializer + where D: serde::de::Deserializer<'de> { struct PointFieldVisitor; - impl serde::de::Visitor for PointFieldVisitor { + impl<'de> serde::de::Visitor<'de> for PointFieldVisitor { type Value = PointField; fn visit_str(self, value: &str) -> Result @@ -56,13 +56,13 @@ impl serde::Deserialize for PointField { } } - deserializer.deserialize(PointFieldVisitor) + deserializer.deserialize_any(PointFieldVisitor) } } -impl serde::Deserialize for Point { +impl<'de> serde::Deserialize<'de> for Point { fn deserialize(deserializer: D) -> Result - where D: serde::de::Deserializer + where D: serde::de::Deserializer<'de> { static FIELDS: &'static [&'static str] = &["x", "y"]; deserializer.deserialize_struct("Point", FIELDS, PointVisitor) @@ -71,19 +71,19 @@ impl serde::Deserialize for Point { struct PointVisitor; -impl serde::de::Visitor for PointVisitor { +impl<'de> serde::de::Visitor<'de> for PointVisitor { type Value = Point; fn visit_map(self, mut visitor: V) -> Result - where V: serde::de::MapVisitor + where V: serde::de::MapAccess<'de> { let mut x = None; let mut y = None; loop { - match try!(visitor.visit_key()) { - Some(PointField::X) => { x = Some(try!(visitor.visit_value())); } - Some(PointField::Y) => { y = Some(try!(visitor.visit_value())); } + match try!(visitor.next_key()) { + Some(PointField::X) => { x = Some(try!(visitor.next_value())); } + Some(PointField::Y) => { y = Some(try!(visitor.next_value())); } None => { break; } } } diff --git a/tests/tests_sample_types.rs b/tests/tests_sample_types.rs index c8784af..8399d57 100644 --- a/tests/tests_sample_types.rs +++ b/tests/tests_sample_types.rs @@ -24,13 +24,13 @@ pub enum PointField { } -impl serde::Deserialize for PointField { +impl<'de> serde::Deserialize<'de> for PointField { fn deserialize(deserializer: D) -> Result - where D: serde::de::Deserializer + where D: serde::de::Deserializer<'de> { struct PointFieldVisitor; - impl serde::de::Visitor for PointFieldVisitor { + impl<'de> serde::de::Visitor<'de> for PointFieldVisitor { type Value = PointField; fn visit_str(self, value: &str) -> Result @@ -49,13 +49,13 @@ impl serde::Deserialize for PointField { } } - deserializer.deserialize(PointFieldVisitor) + deserializer.deserialize_any(PointFieldVisitor) } } -impl serde::Deserialize for Point { +impl<'de> serde::Deserialize<'de> for Point { fn deserialize(deserializer: D) -> Result - where D: serde::de::Deserializer + where D: serde::de::Deserializer<'de> { static FIELDS: &'static [&'static str] = &["x", "y"]; deserializer.deserialize_struct("Point", FIELDS, PointVisitor) @@ -64,19 +64,19 @@ impl serde::Deserialize for Point { struct PointVisitor; -impl serde::de::Visitor for PointVisitor { +impl<'de> serde::de::Visitor<'de> for PointVisitor { type Value = Point; fn visit_map(self, mut visitor: V) -> Result - where V: serde::de::MapVisitor + where V: serde::de::MapAccess<'de> { let mut x = None; let mut y = None; loop { - match try!(visitor.visit_key()) { - Some(PointField::X) => { x = Some(try!(visitor.visit_value())); } - Some(PointField::Y) => { y = Some(try!(visitor.visit_value())); } + match try!(visitor.next_key()) { + Some(PointField::X) => { x = Some(try!(visitor.next_value())); } + Some(PointField::Y) => { y = Some(try!(visitor.next_value())); } None => { break; } } }