diff --git a/src/error.rs b/src/error.rs index e13d389e..ba17ba7b 100644 --- a/src/error.rs +++ b/src/error.rs @@ -2,13 +2,13 @@ use std::collections::BTreeMap; use std::fmt::{self, Debug, Display, Formatter}; use std::marker::PhantomData; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use thiserror::Error; use crate::{parser, InputValueType, Pos, Value}; /// Extensions to the error. -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(transparent)] pub struct ErrorExtensionValues(BTreeMap); @@ -20,18 +20,18 @@ impl ErrorExtensionValues { } /// An error in a GraphQL server. -#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ServerError { /// An explanatory message of the error. pub message: String, /// Where the error occurred. - #[serde(skip_serializing_if = "Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty", default)] pub locations: Vec, /// If the error occurred in a resolver, the path to the error. - #[serde(skip_serializing_if = "Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty", default)] pub path: Vec, /// Extensions to the error. - #[serde(skip_serializing_if = "error_extensions_is_empty")] + #[serde(skip_serializing_if = "error_extensions_is_empty", default)] pub extensions: Option, } @@ -96,7 +96,7 @@ impl From for ServerError { /// /// This is like [`QueryPathSegment`](enum.QueryPathSegment.html), but owned and used as a part of /// errors instead of during execution. -#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(untagged)] pub enum PathSegment { /// A field in an object. diff --git a/src/request.rs b/src/request.rs index 7390b0f7..d510c189 100644 --- a/src/request.rs +++ b/src/request.rs @@ -2,7 +2,7 @@ use std::any::Any; use std::collections::HashMap; use std::fmt::{self, Debug, Formatter}; -use serde::{Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, Serialize}; use crate::{Data, ParseRequestError, UploadValue, Value, Variables}; @@ -10,7 +10,7 @@ use crate::{Data, ParseRequestError, UploadValue, Value, Variables}; /// /// This can be deserialized from a structure of the query string, the operation name and the /// variables. The names are all in `camelCase` (e.g. `operationName`). -#[derive(Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Request { /// The query source of the request. diff --git a/src/response.rs b/src/response.rs index e98f915e..1ad0f363 100644 --- a/src/response.rs +++ b/src/response.rs @@ -1,15 +1,16 @@ -use serde::Serialize; +use serde::{Deserialize, Serialize}; use crate::{CacheControl, Result, ServerError, Value}; /// Query response -#[derive(Debug, Default, Serialize)] +#[derive(Debug, Default, Serialize, Deserialize)] pub struct Response { /// Data of query result + #[serde(default)] pub data: Value, /// Extensions result - #[serde(skip_serializing_if = "Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none", default)] pub extensions: Option, /// Cache control value @@ -17,7 +18,7 @@ pub struct Response { pub cache_control: CacheControl, /// Errors - #[serde(skip_serializing_if = "Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty", default)] pub errors: Vec, }