Skip to content

Commit

Permalink
fix(juniper_graphql_ws): correct null deserialization issue (#738)
Browse files Browse the repository at this point in the history
Closes #735
  • Loading branch information
lightdiscord authored Aug 14, 2020
1 parent 8d7ba82 commit fdad97a
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 2 deletions.
1 change: 1 addition & 0 deletions juniper_graphql_ws/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# master

- Fix null deserialization issue ([#735](https://github.com/graphql-rust/juniper/issues/735))
- Initial Release
21 changes: 19 additions & 2 deletions juniper_graphql_ws/src/client_message.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::utils::default_for_null;
use juniper::{ScalarValue, Variables};

/// The payload for a client's "start" message. This triggers execution of a query, mutation, or
Expand All @@ -10,7 +11,7 @@ pub struct StartPayload<S: ScalarValue> {
pub query: String,

/// The optional variables.
#[serde(default)]
#[serde(default, deserialize_with = "default_for_null")]
pub variables: Variables<S>,

/// The optional operation name (required if the document contains multiple operations).
Expand All @@ -27,7 +28,7 @@ pub enum ClientMessage<S: ScalarValue> {
ConnectionInit {
/// Optional parameters of any type sent from the client. These are often used for
/// authentication.
#[serde(default)]
#[serde(default, deserialize_with = "default_for_null")]
payload: Variables<S>,
},
/// Start messages are used to execute a GraphQL operation.
Expand Down Expand Up @@ -128,4 +129,20 @@ mod test {
serde_json::from_str(r##"{"type": "connection_terminate"}"##).unwrap(),
);
}

#[test]
fn test_deserialization_of_null() -> serde_json::Result<()> {
let payload = r#"{"query":"query","variables":null}"#;
let payload: StartPayload<DefaultScalarValue> = serde_json::from_str(payload)?;

let expected = StartPayload {
query: "query".into(),
variables: Variables::default(),
operation_name: None,
};

assert_eq!(expected, payload);

Ok(())
}
}
2 changes: 2 additions & 0 deletions juniper_graphql_ws/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub use server_message::*;
mod schema;
pub use schema::*;

mod utils;

use juniper::{
futures::{
channel::oneshot,
Expand Down
9 changes: 9 additions & 0 deletions juniper_graphql_ws/src/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use serde::{Deserialize, Deserializer};

pub(crate) fn default_for_null<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de> + Default,
{
Ok(Option::<T>::deserialize(deserializer)?.unwrap_or_default())
}

0 comments on commit fdad97a

Please sign in to comment.