Merge branch 'master' into rework-core-traits [skip ci]

This commit is contained in:
tyranron 2022-08-12 17:42:32 +03:00
commit e6861bc516
No known key found for this signature in database
GPG key ID: 762E144FB230A4F0
20 changed files with 63 additions and 98 deletions

View file

@ -46,7 +46,7 @@ impl User {
async fn friends(&self) -> Vec<User> { async fn friends(&self) -> Vec<User> {
if self.id == 1 { if self.id == 1 {
return vec![ vec![
User { User {
id: 11, id: 11,
kind: UserKind::User, kind: UserKind::User,
@ -62,15 +62,15 @@ impl User {
kind: UserKind::Guest, kind: UserKind::Guest,
name: "user13".into(), name: "user13".into(),
}, },
]; ]
} else if self.id == 2 { } else if self.id == 2 {
return vec![User { vec![User {
id: 21, id: 21,
kind: UserKind::User, kind: UserKind::User,
name: "user21".into(), name: "user21".into(),
}]; }]
} else if self.id == 3 { } else if self.id == 3 {
return vec![ vec![
User { User {
id: 31, id: 31,
kind: UserKind::User, kind: UserKind::User,
@ -81,9 +81,9 @@ impl User {
kind: UserKind::Guest, kind: UserKind::Guest,
name: "user32".into(), name: "user32".into(),
}, },
]; ]
} else { } else {
return vec![]; vec![]
} }
} }
} }

View file

@ -39,7 +39,7 @@ schema-language = ["graphql-parser"]
anyhow = { version = "1.0.32", default-features = false, optional = true } anyhow = { version = "1.0.32", default-features = false, optional = true }
async-trait = "0.1.39" async-trait = "0.1.39"
bigdecimal = { version = "0.3", optional = true } bigdecimal = { version = "0.3", optional = true }
bson = { version = "2.3", features = ["chrono-0_4"], optional = true } bson = { version = "2.4", features = ["chrono-0_4"], optional = true }
chrono = { version = "0.4", features = ["alloc"], default-features = false, optional = true } chrono = { version = "0.4", features = ["alloc"], default-features = false, optional = true }
chrono-tz = { version = "0.6", default-features = false, optional = true } chrono-tz = { version = "0.6", default-features = false, optional = true }
fnv = "1.0.3" fnv = "1.0.3"
@ -59,8 +59,6 @@ uuid = { version = "1.0", default-features = false, optional = true }
[target.'cfg(target_arch = "wasm32")'.dependencies] [target.'cfg(target_arch = "wasm32")'.dependencies]
getrandom = { version = "0.2", features = ["js"] } getrandom = { version = "0.2", features = ["js"] }
# not used, to fix `bson` compilation only
uuid_08 = { version = "0.8", package = "uuid", default-features = false, features = ["wasm-bindgen"] }
[dev-dependencies] [dev-dependencies]
bencher = "0.1.2" bencher = "0.1.2"

View file

@ -114,7 +114,7 @@ pub struct Directive<'a, S> {
} }
#[allow(missing_docs)] #[allow(missing_docs)]
#[derive(Clone, PartialEq, Debug)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum OperationType { pub enum OperationType {
Query, Query,
Mutation, Mutation,

View file

@ -10,7 +10,7 @@ use super::Variables;
/// An enum that describes if a field is available in all types of the interface /// An enum that describes if a field is available in all types of the interface
/// or only in a certain subtype /// or only in a certain subtype
#[derive(Debug, Clone, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Applies<'a> { pub enum Applies<'a> {
/// The field is available independent from the type /// The field is available independent from the type
All, All,

View file

@ -1302,21 +1302,20 @@ impl<'r, S: 'r> Registry<'r, S> {
/// ///
/// [`graphql::Type`]: resolve::Type /// [`graphql::Type`]: resolve::Type
/// [`TypeName`]: resolve::TypeName /// [`TypeName`]: resolve::TypeName
pub fn register_scalar_with<'ti, T, TI, F>( pub fn register_scalar_with<'ti, T, TI>(
&mut self, &mut self,
type_info: &'ti TI, type_info: &'ti TI,
customize: F, customize: impl FnOnce(ScalarMeta<'r, S>) -> ScalarMeta<'r, S>,
) -> MetaType<'r, S> ) -> MetaType<'r, S>
where where
T: resolve::TypeName<TI> + resolve::InputValueOwned<S> + resolve::ScalarToken<S>, T: resolve::TypeName<TI> + resolve::InputValueOwned<S> + resolve::ScalarToken<S>,
TI: ?Sized, TI: ?Sized,
'ti: 'r, 'ti: 'r,
F: FnOnce(ScalarMeta<'r, S>) -> ScalarMeta<'r, S>,
S: Clone, S: Clone,
{ {
self.entry_type::<T, _>(type_info) self.entry_type::<T, _>(type_info)
.or_insert_with(move || { .or_insert_with(move || {
customize(ScalarMeta::new_reworked::<T, _>(T::type_name(type_info))).into_meta() customize(ScalarMeta::new_reworked::<T>(T::type_name(type_info))).into_meta()
}) })
.clone() .clone()
} }
@ -1338,7 +1337,7 @@ impl<'r, S: 'r> Registry<'r, S> {
'ti: 'r, 'ti: 'r,
S: Clone, S: Clone,
{ {
self.register_scalar_unsized_with::<T, TI, _>(type_info, convert::identity) self.register_scalar_unsized_with::<T, TI>(type_info, convert::identity)
} }
/// Builds a [`ScalarMeta`] information for the specified non-[`Sized`] /// Builds a [`ScalarMeta`] information for the specified non-[`Sized`]
@ -1352,21 +1351,20 @@ impl<'r, S: 'r> Registry<'r, S> {
/// ///
/// [`graphql::Type`]: resolve::Type /// [`graphql::Type`]: resolve::Type
/// [`TypeName`]: resolve::TypeName /// [`TypeName`]: resolve::TypeName
pub fn register_scalar_unsized_with<'ti, T, TI, F>( pub fn register_scalar_unsized_with<'ti, T, TI>(
&mut self, &mut self,
type_info: &'ti TI, type_info: &'ti TI,
customize: F, customize: impl FnOnce(ScalarMeta<'r, S>) -> ScalarMeta<'r, S>,
) -> MetaType<'r, S> ) -> MetaType<'r, S>
where where
T: resolve::TypeName<TI> + resolve::InputValueAsRef<S> + resolve::ScalarToken<S> + ?Sized, T: resolve::TypeName<TI> + resolve::InputValueAsRef<S> + resolve::ScalarToken<S> + ?Sized,
TI: ?Sized, TI: ?Sized,
'ti: 'r, 'ti: 'r,
F: FnOnce(ScalarMeta<'r, S>) -> ScalarMeta<'r, S>,
S: Clone, S: Clone,
{ {
self.entry_type::<T, _>(type_info) self.entry_type::<T, _>(type_info)
.or_insert_with(move || { .or_insert_with(move || {
customize(ScalarMeta::new_unsized::<T, _>(T::type_name(type_info))).into_meta() customize(ScalarMeta::new_unsized::<T>(T::type_name(type_info))).into_meta()
}) })
.clone() .clone()
} }
@ -1474,26 +1472,21 @@ impl<'r, S: 'r> Registry<'r, S> {
/// ///
/// [`graphql::Type`]: resolve::Type /// [`graphql::Type`]: resolve::Type
/// [`TypeName`]: resolve::TypeName /// [`TypeName`]: resolve::TypeName
pub fn register_enum_with<'ti, T, TI, F>( pub fn register_enum_with<'ti, T, TI>(
&mut self, &mut self,
values: &[EnumValue], values: &[EnumValue],
type_info: &'ti TI, type_info: &'ti TI,
customize: F, customize: impl FnOnce(EnumMeta<'r, S>) -> EnumMeta<'r, S>,
) -> MetaType<'r, S> ) -> MetaType<'r, S>
where where
T: resolve::TypeName<TI> + resolve::InputValueOwned<S>, T: resolve::TypeName<TI> + resolve::InputValueOwned<S>,
TI: ?Sized, TI: ?Sized,
'ti: 'r, 'ti: 'r,
F: FnOnce(EnumMeta<'r, S>) -> EnumMeta<'r, S>,
S: Clone, S: Clone,
{ {
self.entry_type::<T, _>(type_info) self.entry_type::<T, _>(type_info)
.or_insert_with(move || { .or_insert_with(move || {
customize(EnumMeta::new_reworked::<T, _>( customize(EnumMeta::new_reworked::<T>(T::type_name(type_info), values)).into_meta()
T::type_name(type_info),
values,
))
.into_meta()
}) })
.clone() .clone()
} }
@ -1553,22 +1546,21 @@ impl<'r, S: 'r> Registry<'r, S> {
/// ///
/// [`graphql::Type`]: resolve::Type /// [`graphql::Type`]: resolve::Type
/// [`TypeName`]: resolve::TypeName /// [`TypeName`]: resolve::TypeName
pub fn register_input_object_with<'ti, T, TI, F>( pub fn register_input_object_with<'ti, T, TI>(
&mut self, &mut self,
fields: &[Argument<'r, S>], fields: &[Argument<'r, S>],
type_info: &'ti TI, type_info: &'ti TI,
customize: F, customize: impl FnOnce(InputObjectMeta<'r, S>) -> InputObjectMeta<'r, S>,
) -> MetaType<'r, S> ) -> MetaType<'r, S>
where where
T: resolve::TypeName<TI> + resolve::InputValueOwned<S>, T: resolve::TypeName<TI> + resolve::InputValueOwned<S>,
TI: ?Sized, TI: ?Sized,
'ti: 'r, 'ti: 'r,
F: FnOnce(InputObjectMeta<'r, S>) -> InputObjectMeta<'r, S>,
S: Clone, S: Clone,
{ {
self.entry_type::<T, _>(type_info) self.entry_type::<T, _>(type_info)
.or_insert_with(move || { .or_insert_with(move || {
customize(InputObjectMeta::new_reworked::<T, _>( customize(InputObjectMeta::new_reworked::<T>(
T::type_name(type_info), T::type_name(type_info),
fields, fields,
)) ))

View file

@ -97,8 +97,8 @@ pub use crate::{
}; };
/// An error that prevented query execution /// An error that prevented query execution
#[derive(Debug, PartialEq)]
#[allow(missing_docs)] #[allow(missing_docs)]
#[derive(Debug, Eq, PartialEq)]
pub enum GraphQLError { pub enum GraphQLError {
ParseError(Spanning<ParseError>), ParseError(Spanning<ParseError>),
ValidationError(Vec<RuleError>), ValidationError(Vec<RuleError>),

View file

@ -20,8 +20,8 @@ pub struct Lexer<'a> {
/// A single scalar value literal /// A single scalar value literal
/// ///
/// This is only used for tagging how the lexer has interpreted a value literal /// This is only used for tagging how the lexer has interpreted a value literal
#[derive(Debug, PartialEq, Clone, Copy)]
#[allow(missing_docs)] #[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ScalarToken<'a> { pub enum ScalarToken<'a> {
String(&'a str), String(&'a str),
Float(&'a str), Float(&'a str),
@ -29,8 +29,8 @@ pub enum ScalarToken<'a> {
} }
/// A single token in the input source /// A single token in the input source
#[derive(Debug, PartialEq, Clone, Copy)]
#[allow(missing_docs)] #[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Token<'a> { pub enum Token<'a> {
Name(&'a str), Name(&'a str),
Scalar(ScalarToken<'a>), Scalar(ScalarToken<'a>),

View file

@ -5,7 +5,7 @@ use smartstring::alias::String;
use crate::parser::{Lexer, LexerError, Spanning, Token}; use crate::parser::{Lexer, LexerError, Spanning, Token};
/// Error while parsing a GraphQL query /// Error while parsing a GraphQL query
#[derive(Debug, PartialEq)] #[derive(Debug, Eq, PartialEq)]
pub enum ParseError { pub enum ParseError {
/// An unexpected token occurred in the source /// An unexpected token occurred in the source
// TODO: Previously was `Token<'a>`. // TODO: Previously was `Token<'a>`.

View file

@ -754,11 +754,11 @@ mod macros {
} }
const CON: [u8; LEN] = concat([$($s),*]); const CON: [u8; LEN] = concat([$($s),*]);
// TODO: Use `str::from_utf8()` once it becomes `const`. // TODO: Use `.unwrap()` once it becomes `const`.
// SAFETY: This is safe, as we concatenate multiple UTF-8 strings match ::std::str::from_utf8(&CON) {
// one after another byte-by-byte. ::std::result::Result::Ok(s) => s,
#[allow(unsafe_code)] _ => unreachable!(),
unsafe { ::std::str::from_utf8_unchecked(&CON) } }
}}; }};
} }
@ -852,12 +852,11 @@ mod macros {
const TYPE_ARR: [u8; RES_LEN] = format_type_arr(); const TYPE_ARR: [u8; RES_LEN] = format_type_arr();
// TODO: Use `str::from_utf8()` once it becomes `const`. // TODO: Use `.unwrap()` once it becomes `const`.
// SAFETY: This is safe, as we concatenate multiple UTF-8 strings one const TYPE_FORMATTED: &str = match ::std::str::from_utf8(TYPE_ARR.as_slice()) {
// after another byte-by-byte. ::std::result::Result::Ok(s) => s,
#[allow(unsafe_code)] _ => unreachable!(),
const TYPE_FORMATTED: &str = };
unsafe { ::std::str::from_utf8_unchecked(TYPE_ARR.as_slice()) };
TYPE_FORMATTED TYPE_FORMATTED
}}; }};
} }

View file

@ -16,7 +16,7 @@ use crate::{
}; };
/// Whether an item is deprecated, with context. /// Whether an item is deprecated, with context.
#[derive(Debug, PartialEq, Hash, Clone)] #[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum DeprecationStatus { pub enum DeprecationStatus {
/// The field/variant is not deprecated. /// The field/variant is not deprecated.
Current, Current,
@ -502,13 +502,9 @@ impl<'a, S> ScalarMeta<'a, S> {
} }
/// Builds a new [`ScalarMeta`] information with the specified `name`. /// Builds a new [`ScalarMeta`] information with the specified `name`.
// TODO: Use `impl Into<Cow<'a, str>>` argument once feature pub fn new_reworked<T>(name: impl Into<Cow<'a, str>>) -> Self
// `explicit_generic_args_with_impl_trait` hits stable:
// https://github.com/rust-lang/rust/issues/83701
pub fn new_reworked<T, N>(name: N) -> Self
where where
T: resolve::InputValueOwned<S> + resolve::ScalarToken<S>, T: resolve::InputValueOwned<S> + resolve::ScalarToken<S>,
Cow<'a, str>: From<N>,
{ {
Self { Self {
name: name.into(), name: name.into(),
@ -521,13 +517,9 @@ impl<'a, S> ScalarMeta<'a, S> {
/// Builds a new [`ScalarMeta`] information with the specified `name` for /// Builds a new [`ScalarMeta`] information with the specified `name` for
/// the non-[`Sized`] `T`ype that may only be parsed as a reference. /// the non-[`Sized`] `T`ype that may only be parsed as a reference.
// TODO: Use `impl Into<Cow<'a, str>>` argument once feature pub fn new_unsized<T>(name: impl Into<Cow<'a, str>>) -> Self
// `explicit_generic_args_with_impl_trait` hits stable:
// https://github.com/rust-lang/rust/issues/83701
pub fn new_unsized<T, N>(name: N) -> Self
where where
T: resolve::InputValueAsRef<S> + resolve::ScalarToken<S> + ?Sized, T: resolve::InputValueAsRef<S> + resolve::ScalarToken<S> + ?Sized,
Cow<'a, str>: From<N>,
{ {
Self { Self {
name: name.into(), name: name.into(),
@ -653,13 +645,9 @@ impl<'a, S> EnumMeta<'a, S> {
/// Builds a new [`EnumMeta`] information with the specified `name` and /// Builds a new [`EnumMeta`] information with the specified `name` and
/// possible `values`. /// possible `values`.
// TODO: Use `impl Into<Cow<'a, str>>` argument once feature pub fn new_reworked<T>(name: impl Into<Cow<'a, str>>, values: &[EnumValue]) -> Self
// `explicit_generic_args_with_impl_trait` hits stable:
// https://github.com/rust-lang/rust/issues/83701
pub fn new_reworked<T, N>(name: N, values: &[EnumValue]) -> Self
where where
T: resolve::InputValueOwned<S>, T: resolve::InputValueOwned<S>,
Cow<'a, str>: From<N>,
{ {
Self { Self {
name: name.into(), name: name.into(),
@ -771,13 +759,9 @@ impl<'a, S> InputObjectMeta<'a, S> {
/// Builds a new [`InputObjectMeta`] information with the specified `name` /// Builds a new [`InputObjectMeta`] information with the specified `name`
/// and its `fields`. /// and its `fields`.
// TODO: Use `impl Into<Cow<'a, str>>` argument once feature pub fn new_reworked<T>(name: impl Into<Cow<'a, str>>, fields: &[Argument<'a, S>]) -> Self
// `explicit_generic_args_with_impl_trait` hits stable:
// https://github.com/rust-lang/rust/issues/83701
pub fn new_reworked<T, N>(name: N, fields: &[Argument<'a, S>]) -> Self
where where
T: resolve::InputValueOwned<S>, T: resolve::InputValueOwned<S>,
Cow<'a, str>: From<N>,
S: Clone, S: Clone,
{ {
Self { Self {

View file

@ -234,7 +234,7 @@ impl<'a, S: ScalarValue + 'a> TypeType<'a, S> {
fn of_type(&self) -> Option<&TypeType<S>> { fn of_type(&self) -> Option<&TypeType<S>> {
match self { match self {
TypeType::Concrete(_) => None, TypeType::Concrete(_) => None,
TypeType::List(l, _) | TypeType::NonNull(l) => Some(&*l), TypeType::List(l, _) | TypeType::NonNull(l) => Some(&**l),
} }
} }

View file

@ -286,7 +286,7 @@ impl OnMethod {
#[must_use] #[must_use]
pub(crate) fn as_regular(&self) -> Option<&OnField> { pub(crate) fn as_regular(&self) -> Option<&OnField> {
if let Self::Regular(arg) = self { if let Self::Regular(arg) = self {
Some(&*arg) Some(&**arg)
} else { } else {
None None
} }
@ -297,7 +297,7 @@ impl OnMethod {
#[must_use] #[must_use]
pub(crate) fn context_ty(&self) -> Option<&syn::Type> { pub(crate) fn context_ty(&self) -> Option<&syn::Type> {
if let Self::Context(ty) = self { if let Self::Context(ty) = self {
Some(&*ty) Some(&**ty)
} else { } else {
None None
} }

View file

@ -17,7 +17,7 @@ use crate::common::parse::TypeExt as _;
/// corresponding error at. /// corresponding error at.
pub(crate) fn output_type(ret_ty: &syn::ReturnType) -> Result<syn::Type, Span> { pub(crate) fn output_type(ret_ty: &syn::ReturnType) -> Result<syn::Type, Span> {
let ret_ty = match &ret_ty { let ret_ty = match &ret_ty {
syn::ReturnType::Type(_, ty) => &*ty, syn::ReturnType::Type(_, ty) => &**ty,
_ => return Err(ret_ty.span()), _ => return Err(ret_ty.span()),
}; };

View file

@ -647,7 +647,7 @@ impl Definition {
let values = [#( #values_meta ),*]; let values = [#( #values_meta ),*];
registry.register_enum_with::< registry.register_enum_with::<
::juniper::behavior::Coerce<Self>, _, _, ::juniper::behavior::Coerce<Self>, _,
>(&values, type_info, |meta| { >(&values, type_info, |meta| {
meta #description meta #description
}) })

View file

@ -734,7 +734,7 @@ impl Definition {
let fields = [#( #fields_meta ),*]; let fields = [#( #fields_meta ),*];
registry.register_input_object_with::< registry.register_input_object_with::<
::juniper::behavior::Coerce<Self>, _, _, ::juniper::behavior::Coerce<Self>, _,
>(&fields, type_info, |meta| { >(&fields, type_info, |meta| {
meta #description meta #description
}) })

View file

@ -655,7 +655,7 @@ impl ToTokens for Definition<Query> {
self.impl_async_field_tokens().to_tokens(into); self.impl_async_field_tokens().to_tokens(into);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
self.impl_reflect().to_tokens(into); self.impl_reflect().to_tokens(into);
self.impl_reflect_field().to_tokens(into); //self.impl_reflect_field().to_tokens(into);
//self.impl_resolve_field_static().to_tokens(into); //self.impl_resolve_field_static().to_tokens(into);
} }
} }

View file

@ -584,7 +584,7 @@ impl Definition {
#sv: '__r, #sv: '__r,
{ {
registry.register_scalar_with::< registry.register_scalar_with::<
::juniper::behavior::Coerce<Self>, _, _, ::juniper::behavior::Coerce<Self>, _,
>(type_info, |meta| { >(type_info, |meta| {
meta #description #specified_by_url meta #description #specified_by_url
}) })

View file

@ -316,7 +316,7 @@ impl ToTokens for Definition {
self.impl_graphql_value_async_tokens().to_tokens(into); self.impl_graphql_value_async_tokens().to_tokens(into);
self.impl_reflection_traits_tokens().to_tokens(into); self.impl_reflection_traits_tokens().to_tokens(into);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
self.impl_reflect().to_tokens(into); //self.impl_reflect().to_tokens(into);
} }
} }
@ -647,7 +647,7 @@ impl Definition {
} }
} }
} }
/*
/// Returns generated code implementing [`reflect::BaseType`], /// Returns generated code implementing [`reflect::BaseType`],
/// [`reflect::BaseSubTypes`] and [`reflect::WrappedType`] traits for this /// [`reflect::BaseSubTypes`] and [`reflect::WrappedType`] traits for this
/// [GraphQL union][0]. /// [GraphQL union][0].
@ -687,7 +687,7 @@ impl Definition {
::juniper::reflect::wrap::SINGULAR; ::juniper::reflect::wrap::SINGULAR;
} }
} }
} }*/
} }
/// Definition of [GraphQL union][1] variant for code generation. /// Definition of [GraphQL union][1] variant for code generation.

View file

@ -1,6 +1,5 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
#![deny(missing_docs)] #![deny(missing_docs, warnings)]
#![deny(warnings)]
mod client_message; mod client_message;
pub use client_message::*; pub use client_message::*;
@ -315,8 +314,7 @@ impl<S: Schema, I: Init<S::ScalarValue, S::Context>> ConnectionState<S, I> {
Err(e) => { Err(e) => {
return Reaction::ServerMessage(ServerMessage::Error { return Reaction::ServerMessage(ServerMessage::Error {
id: id.clone(), id: id.clone(),
// e only references data owned by params. The new ErrorPayload will continue to keep that data alive. payload: ErrorPayload::new(Box::new(params.clone()), e),
payload: unsafe { ErrorPayload::new_unchecked(Box::new(params.clone()), e) },
}) })
.into_stream(); .into_stream();
} }
@ -434,10 +432,7 @@ impl<S: Schema> Stream for SubscriptionStart<S> {
return Poll::Ready(Some(Reaction::ServerMessage( return Poll::Ready(Some(Reaction::ServerMessage(
ServerMessage::Error { ServerMessage::Error {
id: id.clone(), id: id.clone(),
// e only references data owned by params. The new ErrorPayload will continue to keep that data alive. payload: ErrorPayload::new(Box::new(params.clone()), e),
payload: unsafe {
ErrorPayload::new_unchecked(Box::new(params.clone()), e)
},
}, },
))); )));
} }

View file

@ -1,10 +1,10 @@
use std::{any::Any, fmt, marker::PhantomPinned, mem}; use std::{any::Any, fmt, marker::PhantomPinned};
use juniper::{ExecutionError, GraphQLError, Value}; use juniper::{ExecutionError, GraphQLError, Value};
use serde::{Serialize, Serializer}; use serde::{Serialize, Serializer};
/// The payload for errors that are not associated with a GraphQL operation. /// The payload for errors that are not associated with a GraphQL operation.
#[derive(Debug, Serialize, PartialEq)] #[derive(Debug, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct ConnectionErrorPayload { pub struct ConnectionErrorPayload {
/// The error message. /// The error message.
@ -37,15 +37,12 @@ pub struct ErrorPayload {
} }
impl ErrorPayload { impl ErrorPayload {
/// For this to be okay, the caller must guarantee that the error can only reference data from /// Creates a new [`ErrorPayload`] out of the provide `execution_params` and
/// execution_params and that execution_params has not been modified or moved. /// [`GraphQLError`].
pub(crate) unsafe fn new_unchecked( pub(crate) fn new(execution_params: Box<dyn Any + Send>, error: GraphQLError) -> Self {
execution_params: Box<dyn Any + Send>,
error: GraphQLError,
) -> Self {
Self { Self {
_execution_params: Some(execution_params), _execution_params: Some(execution_params),
error: mem::transmute(error), error,
_marker: PhantomPinned, _marker: PhantomPinned,
} }
} }