Skip to content

Commit 55017b6

Browse files
committed
Base IntoValue and IntoInputValue conversions on ToScalarValue
1 parent 89efab0 commit 55017b6

File tree

6 files changed

+67
-79
lines changed

6 files changed

+67
-79
lines changed

juniper/src/ast.rs

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use indexmap::IndexMap;
88
use crate::{
99
executor::Variables,
1010
parser::Spanning,
11-
value::{DefaultScalarValue, Scalar, ScalarValue},
11+
value::{DefaultScalarValue, Scalar, ScalarValue, ToScalarValue},
1212
};
1313

1414
/// Type literal in a syntax tree.
@@ -243,7 +243,7 @@ impl<S> InputValue<S> {
243243
Self::Null
244244
}
245245

246-
/// Construct a scalar value
246+
/// Construct a scalar value.
247247
pub fn scalar<T: Into<S>>(v: T) -> Self {
248248
Self::Scalar(v.into())
249249
}
@@ -498,81 +498,79 @@ where
498498
}
499499
}
500500

501-
impl<S> IntoInputValue<S> for &str
501+
impl<T, S> IntoInputValue<S> for &T
502502
where
503-
String: Into<S>,
503+
T: ToScalarValue<S> + ?Sized,
504504
{
505505
fn into_input_value(self) -> InputValue<S> {
506-
InputValue::scalar(self.to_owned())
506+
InputValue::Scalar(self.to_scalar_value())
507507
}
508508
}
509509

510-
impl<S> IntoInputValue<S> for Cow<'_, str>
510+
impl<S> IntoInputValue<S> for String
511511
where
512512
String: Into<S>,
513513
{
514514
fn into_input_value(self) -> InputValue<S> {
515-
InputValue::scalar(self.into_owned())
515+
InputValue::Scalar(self.into())
516516
}
517517
}
518518

519-
impl<S> IntoInputValue<S> for String
519+
impl<S> IntoInputValue<S> for Cow<'_, str>
520520
where
521-
String: Into<S>,
521+
for<'a> &'a str: IntoInputValue<S>,
522+
String: IntoInputValue<S>,
522523
{
523524
fn into_input_value(self) -> InputValue<S> {
524-
InputValue::scalar(self)
525-
}
526-
}
527-
528-
impl<S: ScalarValue> IntoInputValue<S> for &ArcStr {
529-
fn into_input_value(self) -> InputValue<S> {
530-
InputValue::scalar(S::from_displayable(self))
531-
}
532-
}
533-
534-
impl<S: ScalarValue> IntoInputValue<S> for ArcStr {
535-
fn into_input_value(self) -> InputValue<S> {
536-
(&self).into_input_value()
525+
match self {
526+
Cow::Borrowed(s) => s.into_input_value(),
527+
Cow::Owned(s) => s.into_input_value(),
528+
}
537529
}
538530
}
539531

540-
impl<S: ScalarValue> IntoInputValue<S> for &CompactString {
532+
impl<S: ScalarValue> IntoInputValue<S> for ArcStr
533+
where
534+
ArcStr: ToScalarValue<S>,
535+
{
541536
fn into_input_value(self) -> InputValue<S> {
542-
InputValue::scalar(S::from_displayable(self))
537+
InputValue::Scalar(self.to_scalar_value())
543538
}
544539
}
545540

546-
impl<S: ScalarValue> IntoInputValue<S> for CompactString {
541+
impl<S: ScalarValue> IntoInputValue<S> for CompactString
542+
where
543+
CompactString: ToScalarValue<S>,
544+
{
547545
fn into_input_value(self) -> InputValue<S> {
548-
(&self).into_input_value()
546+
InputValue::Scalar(self.to_scalar_value())
549547
}
550548
}
551549

552550
impl<S> IntoInputValue<S> for i32
553551
where
554-
i32: Into<S>,
552+
i32: ToScalarValue<S>,
555553
{
556554
fn into_input_value(self) -> InputValue<S> {
557-
InputValue::scalar(self)
555+
InputValue::Scalar(self.to_scalar_value())
558556
}
559557
}
560558

561559
impl<S> IntoInputValue<S> for f64
562560
where
563-
f64: Into<S>,
561+
f64: ToScalarValue<S>,
564562
{
565563
fn into_input_value(self) -> InputValue<S> {
566-
InputValue::scalar(self)
564+
InputValue::Scalar(self.to_scalar_value())
567565
}
568566
}
569567

570568
impl<S> IntoInputValue<S> for bool
571569
where
572-
bool: Into<S>,
570+
bool: ToScalarValue<S>,
573571
{
574572
fn into_input_value(self) -> InputValue<S> {
575-
InputValue::scalar(self)
573+
InputValue::Scalar(self.to_scalar_value())
576574
}
577575
}
578576

juniper/src/integrations/serde.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -352,12 +352,7 @@ impl<'de> Deserialize<'de> for DefaultScalarValue {
352352
mod tests {
353353
use serde_json::{from_str, to_string};
354354

355-
use crate::{
356-
FieldError, Value,
357-
ast::InputValue,
358-
graphql_input_value,
359-
value::{DefaultScalarValue, Object},
360-
};
355+
use crate::{DefaultScalarValue, FieldError, InputValue, graphql_input_value, graphql_value};
361356

362357
use super::{ExecutionError, GraphQLError};
363358

@@ -392,13 +387,10 @@ mod tests {
392387

393388
#[test]
394389
fn error_extensions() {
395-
let mut obj: Object<DefaultScalarValue> = Object::with_capacity(1);
396-
obj.add_field("foo", Value::scalar("bar"));
397390
assert_eq!(
398-
to_string(&ExecutionError::at_origin(FieldError::new(
399-
"foo error",
400-
Value::Object(obj),
401-
)))
391+
to_string(&ExecutionError::at_origin(
392+
FieldError::<DefaultScalarValue>::new("foo error", graphql_value!({"foo": "bar"})),
393+
))
402394
.unwrap(),
403395
r#"{"message":"foo error","locations":[{"line":1,"column":1}],"path":[],"extensions":{"foo":"bar"}}"#,
404396
);

juniper/src/types/async_await.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ where
222222
if f.name.item == "__typename" {
223223
object.add_field(
224224
response_name,
225-
Value::scalar(instance.concrete_type_name(executor.context(), info)),
225+
Value::Scalar(instance.concrete_type_name(executor.context(), info).into()),
226226
);
227227
continue;
228228
}

juniper/src/types/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ where
444444
if f.name.item == "__typename" {
445445
result.add_field(
446446
response_name,
447-
Value::scalar(instance.concrete_type_name(executor.context(), info)),
447+
Value::Scalar(instance.concrete_type_name(executor.context(), info).into()),
448448
);
449449
continue;
450450
}

juniper/src/types/scalars.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ where
274274
_: Option<&[Selection<S>]>,
275275
_: &Executor<Self::Context, S>,
276276
) -> ExecutionResult<S> {
277-
Ok(Value::scalar(String::from(self)))
277+
Ok(Value::Scalar(self.to_scalar_value()))
278278
}
279279
}
280280

@@ -287,7 +287,7 @@ where
287287
info: &'a Self::TypeInfo,
288288
selection_set: Option<&'a [Selection<S>]>,
289289
executor: &'a Executor<Self::Context, S>,
290-
) -> crate::BoxFuture<'a, crate::ExecutionResult<S>> {
290+
) -> crate::BoxFuture<'a, ExecutionResult<S>> {
291291
use futures::future;
292292
Box::pin(future::ready(self.resolve(info, selection_set, executor)))
293293
}

juniper/src/value/mod.rs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl<S> Value<S> {
5454
Self::Object(o)
5555
}
5656

57-
/// Construct a scalar value
57+
/// Construct a scalar value.
5858
pub fn scalar<T: Into<S>>(s: T) -> Self {
5959
Self::Scalar(s.into())
6060
}
@@ -230,81 +230,79 @@ where
230230
}
231231
}
232232

233-
impl<S> IntoValue<S> for &str
233+
impl<T, S> IntoValue<S> for &T
234234
where
235-
String: Into<S>,
235+
T: ToScalarValue<S> + ?Sized,
236236
{
237237
fn into_value(self) -> Value<S> {
238-
Value::scalar(self.to_owned())
238+
Value::Scalar(self.to_scalar_value())
239239
}
240240
}
241241

242-
impl<S> IntoValue<S> for Cow<'_, str>
242+
impl<S> IntoValue<S> for String
243243
where
244244
String: Into<S>,
245245
{
246246
fn into_value(self) -> Value<S> {
247-
Value::scalar(self.into_owned())
247+
Value::Scalar(self.into())
248248
}
249249
}
250250

251-
impl<S> IntoValue<S> for String
251+
impl<S> IntoValue<S> for Cow<'_, str>
252252
where
253-
String: Into<S>,
253+
for<'a> &'a str: IntoValue<S>,
254+
String: IntoValue<S>,
254255
{
255256
fn into_value(self) -> Value<S> {
256-
Value::scalar(self)
257-
}
258-
}
259-
260-
impl<S: ScalarValue> IntoValue<S> for &ArcStr {
261-
fn into_value(self) -> Value<S> {
262-
Value::scalar(S::from_displayable(self))
263-
}
264-
}
265-
266-
impl<S: ScalarValue> IntoValue<S> for ArcStr {
267-
fn into_value(self) -> Value<S> {
268-
(&self).into_value()
257+
match self {
258+
Cow::Borrowed(s) => s.into_value(),
259+
Cow::Owned(s) => s.into_value(),
260+
}
269261
}
270262
}
271263

272-
impl<S: ScalarValue> IntoValue<S> for &CompactString {
264+
impl<S: ScalarValue> IntoValue<S> for ArcStr
265+
where
266+
ArcStr: ToScalarValue<S>,
267+
{
273268
fn into_value(self) -> Value<S> {
274-
Value::scalar(S::from_displayable(self))
269+
Value::Scalar(self.to_scalar_value())
275270
}
276271
}
277272

278-
impl<S: ScalarValue> IntoValue<S> for CompactString {
273+
impl<S: ScalarValue> IntoValue<S> for CompactString
274+
where
275+
CompactString: ToScalarValue<S>,
276+
{
279277
fn into_value(self) -> Value<S> {
280-
(&self).into_value()
278+
Value::Scalar(self.to_scalar_value())
281279
}
282280
}
283281

284282
impl<S> IntoValue<S> for i32
285283
where
286-
i32: Into<S>,
284+
i32: ToScalarValue<S>,
287285
{
288286
fn into_value(self) -> Value<S> {
289-
Value::scalar(self)
287+
Value::Scalar(self.to_scalar_value())
290288
}
291289
}
292290

293291
impl<S> IntoValue<S> for f64
294292
where
295-
f64: Into<S>,
293+
f64: ToScalarValue<S>,
296294
{
297295
fn into_value(self) -> Value<S> {
298-
Value::scalar(self)
296+
Value::Scalar(self.to_scalar_value())
299297
}
300298
}
301299

302300
impl<S> IntoValue<S> for bool
303301
where
304-
bool: Into<S>,
302+
bool: ToScalarValue<S>,
305303
{
306304
fn into_value(self) -> Value<S> {
307-
Value::scalar(self)
305+
Value::Scalar(self.to_scalar_value())
308306
}
309307
}
310308

0 commit comments

Comments
 (0)