From 067b1e532a551b8395eabd67557bbecba3222420 Mon Sep 17 00:00:00 2001 From: tyranron <tyranron@gmail.com> Date: Mon, 13 Jun 2022 18:12:44 +0200 Subject: [PATCH] Re-implement `str`, vol.2 [skip ci] --- juniper/src/types/str.rs | 139 ++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 32 deletions(-) diff --git a/juniper/src/types/str.rs b/juniper/src/types/str.rs index 6e0a39e4..0e3f862b 100644 --- a/juniper/src/types/str.rs +++ b/juniper/src/types/str.rs @@ -34,54 +34,51 @@ impl<TI: ?Sized> resolve::TypeName<TI> for str { } } -/* -impl<Info, Ctx, S> resolve::Value<Info, Ctx, S> for str +impl<TI, CX, SV> resolve::Value<TI, CX, SV> for str where - Info: ?Sized, - Ctx: ?Sized, - S: From<String>, + TI: ?Sized, + CX: ?Sized, + SV: From<String>, { fn resolve_value( &self, - _: Option<&[Selection<'_, S>]>, - _: &Info, - _: &Executor<Ctx, S>, - ) -> ExecutionResult<S> { + _: Option<&[Selection<'_, SV>]>, + _: &TI, + _: &Executor<CX, SV>, + ) -> ExecutionResult<SV> { // TODO: Remove redundant `.to_owned()` allocation by allowing // `ScalarValue` creation from reference? Ok(graphql::Value::scalar(self.to_owned())) } } -impl<Info, Ctx, S> resolve::ValueAsync<Info, Ctx, S> for str +impl<TI, CX, SV> resolve::ValueAsync<TI, CX, SV> for str where - Info: ?Sized, - Ctx: ?Sized, - S: From<String> + Send, + TI: ?Sized, + CX: ?Sized, + SV: From<String> + Send, { fn resolve_value_async<'r>( &'r self, - _: Option<&'r [Selection<'_, S>]>, - _: &'r Info, - _: &'r Executor<Ctx, S>, - ) -> BoxFuture<'r, ExecutionResult<S>> { + _: Option<&'r [Selection<'_, SV>]>, + _: &'r TI, + _: &'r Executor<CX, SV>, + ) -> BoxFuture<'r, ExecutionResult<SV>> { // TODO: Remove redundant `.to_owned()` allocation by allowing // `ScalarValue` creation from reference? Box::pin(future::ok(graphql::Value::scalar(self.to_owned()))) } } -impl<S> resolve::ToInputValue<S> for str +impl<SV> resolve::ToInputValue<SV> for str where - S: From<String>, + SV: From<String>, { - fn to_input_value(&self) -> graphql::InputValue<S> { + fn to_input_value(&self) -> graphql::InputValue<SV> { graphql::InputValue::scalar(self.to_owned()) } } - */ - impl<SV: ScalarValue> resolve::InputValueAsRef<SV> for str { type Error = String; @@ -91,7 +88,7 @@ impl<SV: ScalarValue> resolve::InputValueAsRef<SV> for str { } } -impl<'i, SV> resolve::InputValueAs<'i, Box<str>, SV> for str +impl<'i, SV> resolve::InputValueAs<'i, Box<Self>, SV> for str where SV: 'i, Self: resolve::InputValueAsRef<SV>, @@ -103,7 +100,7 @@ where } } -impl<'i, SV> resolve::InputValueAs<'i, Rc<str>, SV> for str +impl<'i, SV> resolve::InputValueAs<'i, Rc<Self>, SV> for str where SV: 'i, Self: resolve::InputValueAsRef<SV>, @@ -115,7 +112,7 @@ where } } -impl<'i, SV> resolve::InputValueAs<'i, Arc<str>, SV> for str +impl<'i, SV> resolve::InputValueAs<'i, Arc<Self>, SV> for str where SV: 'i, Self: resolve::InputValueAsRef<SV>, @@ -137,24 +134,102 @@ where <String as crate::ParseScalarValue<SV>>::from_str(token) } } -/* -impl<'i, Info, S: 'i> graphql::InputType<'i, Info, S> for str +impl<'me, 'i, TI, SV> graphql::InputTypeAs<'i, &'me Self, TI, SV> for str where - Self: resolve::Type<Info, S> + resolve::ToInputValue<S> + resolve::InputValue<'i, S>, - Info: ?Sized, + Self: graphql::Type<TI, SV> + + resolve::ToInputValue<SV> + + resolve::InputValueAs<'i, &'me Self, SV>, + TI: ?Sized, + SV: 'i, { fn assert_input_type() {} } +impl<'i, TI, SV> graphql::InputTypeAs<'i, Box<Self>, TI, SV> for str +where + Self: graphql::Type<TI, SV> + + resolve::ToInputValue<SV> + + resolve::InputValueAs<'i, Box<Self>, SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_input_type() {} +} -impl<S> graphql::OutputType<S> for str { +impl<'i, TI, SV> graphql::InputTypeAs<'i, Rc<Self>, TI, SV> for str +where + Self: + graphql::Type<TI, SV> + resolve::ToInputValue<SV> + resolve::InputValueAs<'i, Rc<Self>, SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_input_type() {} +} + +impl<'i, TI, SV> graphql::InputTypeAs<'i, Arc<Self>, TI, SV> for str +where + Self: graphql::Type<TI, SV> + + resolve::ToInputValue<SV> + + resolve::InputValueAs<'i, Arc<Self>, SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_input_type() {} +} + +impl<TI, CX, SV> graphql::OutputType<TI, CX, SV> for str +where + Self: graphql::Type<TI, SV> + resolve::Value<TI, CX, SV> + resolve::ValueAsync<TI, CX, SV>, + TI: ?Sized, + CX: ?Sized, +{ fn assert_output_type() {} } -impl<S> graphql::Scalar<S> for str { +impl<'me, 'i, TI, CX, SV> graphql::ScalarAs<'i, &'me Self, TI, CX, SV> for str +where + Self: graphql::InputTypeAs<'i, &'me Self, TI, SV> + + graphql::OutputType<TI, CX, SV> + + resolve::ScalarToken<SV>, + TI: ?Sized, + SV: 'i, +{ fn assert_scalar() {} -}*/ +} + +impl<'i, TI, CX, SV> graphql::ScalarAs<'i, Box<Self>, TI, CX, SV> for str +where + Self: graphql::InputTypeAs<'i, Box<Self>, TI, SV> + + graphql::OutputType<TI, CX, SV> + + resolve::ScalarToken<SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_scalar() {} +} + +impl<'i, TI, CX, SV> graphql::ScalarAs<'i, Rc<Self>, TI, CX, SV> for str +where + Self: graphql::InputTypeAs<'i, Rc<Self>, TI, SV> + + graphql::OutputType<TI, CX, SV> + + resolve::ScalarToken<SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_scalar() {} +} + +impl<'i, TI, CX, SV> graphql::ScalarAs<'i, Arc<Self>, TI, CX, SV> for str +where + Self: graphql::InputTypeAs<'i, Arc<Self>, TI, SV> + + graphql::OutputType<TI, CX, SV> + + resolve::ScalarToken<SV>, + TI: ?Sized, + SV: 'i, +{ + fn assert_scalar() {} +} impl reflect::BaseType for str { const NAME: reflect::Type = "String"; // TODO: <String as reflect::BaseType<BH>>::NAME;