@@ -78,9 +78,9 @@ trait Schema[-R, T] { self =>
7878 def optional : Boolean = false
7979
8080 /**
81- * Defines if the type is considered semantically nullable or not .
81+ * Defines if the type can fail during resolution .
8282 */
83- def semanticNonNull : Boolean = false
83+ def canFail : Boolean = false
8484
8585 /**
8686 * Defined the arguments of the given type. Should be empty except for `Function`.
@@ -96,6 +96,7 @@ trait Schema[-R, T] { self =>
9696 */
9797 def contramap [A ](f : A => T ): Schema [R , A ] = new Schema [R , A ] {
9898 override def optional : Boolean = self.optional
99+ override def canFail : Boolean = self.canFail
99100 override def arguments : List [__InputValue] = self.arguments
100101 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = self.toType_(isInput, isSubscription)
101102 override def resolve (value : A ): Step [R ] = self.resolve(f(value))
@@ -108,6 +109,7 @@ trait Schema[-R, T] { self =>
108109 */
109110 def rename (name : String , inputName : Option [String ] = None ): Schema [R , T ] = new Schema [R , T ] {
110111 override def optional : Boolean = self.optional
112+ override def canFail : Boolean = self.canFail
111113 override def arguments : List [__InputValue] = self.arguments
112114 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = {
113115 val tpe = self.toType_(isInput, isSubscription)
@@ -360,7 +362,7 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
360362 implicit def listSchema [R0 , A ](implicit ev : Schema [R0 , A ]): Schema [R0 , List [A ]] = new Schema [R0 , List [A ]] {
361363 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = {
362364 val t = ev.toType_(isInput, isSubscription)
363- (if (ev.optional) t else t.nonNull).list
365+ (if (ev.optional || ev.canFail ) t else t.nonNull).list
364366 }
365367
366368 override def resolve (value : List [A ]): Step [R0 ] = ListStep (value.map(ev.resolve))
@@ -374,13 +376,15 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
374376 implicit def functionUnitSchema [R0 , A ](implicit ev : Schema [R0 , A ]): Schema [R0 , () => A ] =
375377 new Schema [R0 , () => A ] {
376378 override def optional : Boolean = ev.optional
379+ override def canFail : Boolean = ev.canFail
377380 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
378381 override def resolve (value : () => A ): Step [R0 ] = FunctionStep (_ => ev.resolve(value()))
379382 }
380383 implicit def metadataFunctionSchema [R0 , A ](implicit ev : Schema [R0 , A ]): Schema [R0 , Field => A ] =
381384 new Schema [R0 , Field => A ] {
382385 override def arguments : List [__InputValue] = ev.arguments
383386 override def optional : Boolean = ev.optional
387+ override def canFail : Boolean = ev.canFail
384388 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
385389 override def resolve (value : Field => A ): Step [R0 ] = MetadataFunctionStep (field => ev.resolve(value(field)))
386390 }
@@ -396,11 +400,13 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
396400
397401 implicit val leftSchema : Schema [RA , A ] = new Schema [RA , A ] {
398402 override def optional : Boolean = true
403+ override def canFail : Boolean = evA.canFail
399404 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = evA.toType_(isInput, isSubscription)
400405 override def resolve (value : A ): Step [RA ] = evA.resolve(value)
401406 }
402407 implicit val rightSchema : Schema [RB , B ] = new Schema [RB , B ] {
403408 override def optional : Boolean = true
409+ override def canFail : Boolean = evB.canFail
404410 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = evB.toType_(isInput, isSubscription)
405411 override def resolve (value : B ): Step [RB ] = evB.resolve(value)
406412 }
@@ -468,14 +474,15 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
468474 __InputValue(
469475 unwrappedArgumentName,
470476 None ,
471- () => if (ev1.optional) inputType else inputType.nonNull,
477+ () => if (ev1.optional || ev1.canFail ) inputType else inputType.nonNull,
472478 None
473479 )
474480 )
475481 )
476482 }
477483
478484 override def optional : Boolean = ev2.optional
485+ override def canFail : Boolean = ev2.canFail
479486 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev2.toType_(isInput, isSubscription)
480487
481488 override def resolve (f : A => B ): Step [RB ] =
@@ -504,24 +511,25 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
504511 implicit def infallibleEffectSchema [R0 , R1 >: R0 , R2 >: R0 , A ](implicit ev : Schema [R2 , A ]): Schema [R0 , URIO [R1 , A ]] =
505512 new Schema [R0 , URIO [R1 , A ]] {
506513 override def optional : Boolean = ev.optional
514+ override def canFail : Boolean = ev.canFail
507515 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
508516 override def resolve (value : URIO [R1 , A ]): Step [R0 ] = QueryStep (ZQuery .fromZIONow(value.map(ev.resolve)))
509517 }
510518 implicit def effectSchema [R0 , R1 >: R0 , R2 >: R0 , E <: Throwable , A ](implicit
511519 ev : Schema [R2 , A ]
512520 ): Schema [R0 , ZIO [R1 , E , A ]] =
513521 new Schema [R0 , ZIO [R1 , E , A ]] {
514- override def optional : Boolean = true
515- override def semanticNonNull : Boolean = ! ev.optional
522+ override def optional : Boolean = ev.optional
523+ override def canFail : Boolean = true
516524 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
517525 override def resolve (value : ZIO [R1 , E , A ]): Step [R0 ] = QueryStep (ZQuery .fromZIONow(value.map(ev.resolve)))
518526 }
519527 def customErrorEffectSchema [R0 , R1 >: R0 , R2 >: R0 , E , A ](convertError : E => ExecutionError )(implicit
520528 ev : Schema [R2 , A ]
521529 ): Schema [R0 , ZIO [R1 , E , A ]] =
522530 new Schema [R0 , ZIO [R1 , E , A ]] {
523- override def optional : Boolean = true
524- override def semanticNonNull : Boolean = ! ev.optional
531+ override def optional : Boolean = ev.optional
532+ override def canFail : Boolean = true
525533 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
526534 override def resolve (value : ZIO [R1 , E , A ]): Step [R0 ] = QueryStep (
527535 ZQuery .fromZIONow(value.mapBoth(convertError, ev.resolve))
@@ -532,24 +540,25 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
532540 ): Schema [R0 , ZQuery [R1 , Nothing , A ]] =
533541 new Schema [R0 , ZQuery [R1 , Nothing , A ]] {
534542 override def optional : Boolean = ev.optional
543+ override def canFail : Boolean = ev.canFail
535544 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
536545 override def resolve (value : ZQuery [R1 , Nothing , A ]): Step [R0 ] = QueryStep (value.map(ev.resolve))
537546 }
538547 implicit def querySchema [R0 , R1 >: R0 , R2 >: R0 , E <: Throwable , A ](implicit
539548 ev : Schema [R2 , A ]
540549 ): Schema [R0 , ZQuery [R1 , E , A ]] =
541550 new Schema [R0 , ZQuery [R1 , E , A ]] {
542- override def optional : Boolean = true
543- override def semanticNonNull : Boolean = ! ev.optional
551+ override def optional : Boolean = ev.optional
552+ override def canFail : Boolean = true
544553 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
545554 override def resolve (value : ZQuery [R1 , E , A ]): Step [R0 ] = QueryStep (value.map(ev.resolve))
546555 }
547556 def customErrorQuerySchema [R0 , R1 >: R0 , R2 >: R0 , E , A ](convertError : E => ExecutionError )(implicit
548557 ev : Schema [R2 , A ]
549558 ): Schema [R0 , ZQuery [R1 , E , A ]] =
550559 new Schema [R0 , ZQuery [R1 , E , A ]] {
551- override def optional : Boolean = true
552- override def semanticNonNull : Boolean = ! ev.optional
560+ override def optional : Boolean = ev.optional
561+ override def canFail : Boolean = true
553562 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = ev.toType_(isInput, isSubscription)
554563 override def resolve (value : ZQuery [R1 , E , A ]): Step [R0 ] = QueryStep (value.mapBoth(convertError, ev.resolve))
555564 }
@@ -558,33 +567,34 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
558567 ): Schema [R1 , ZStream [R1 , Nothing , A ]] =
559568 new Schema [R1 , ZStream [R1 , Nothing , A ]] {
560569 override def optional : Boolean = false
570+ override def canFail : Boolean = ev.canFail
561571 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = {
562572 val t = ev.toType_(isInput, isSubscription)
563- if (isSubscription) t else (if (ev.optional) t else t.nonNull).list
573+ if (isSubscription) t else (if (ev.optional || ev.canFail ) t else t.nonNull).list
564574 }
565575 override def resolve (value : ZStream [R1 , Nothing , A ]): Step [R1 ] = StreamStep (value.map(ev.resolve))
566576 }
567577 implicit def streamSchema [R0 , R1 >: R0 , R2 >: R0 , E <: Throwable , A ](implicit
568578 ev : Schema [R2 , A ]
569579 ): Schema [R0 , ZStream [R1 , E , A ]] =
570580 new Schema [R0 , ZStream [R1 , E , A ]] {
571- override def optional : Boolean = true
572- override def semanticNonNull : Boolean = ! ev.optional
581+ override def optional : Boolean = ev.optional
582+ override def canFail : Boolean = true
573583 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = {
574584 val t = ev.toType_(isInput, isSubscription)
575- if (isSubscription) t else (if (ev.optional) t else t.nonNull).list
585+ if (isSubscription) t else (if (ev.optional || ev.canFail ) t else t.nonNull).list
576586 }
577587 override def resolve (value : ZStream [R1 , E , A ]): Step [R0 ] = StreamStep (value.map(ev.resolve))
578588 }
579589 def customErrorStreamSchema [R0 , R1 >: R0 , R2 >: R0 , E , A ](convertError : E => ExecutionError )(implicit
580590 ev : Schema [R2 , A ]
581591 ): Schema [R0 , ZStream [R1 , E , A ]] =
582592 new Schema [R0 , ZStream [R1 , E , A ]] {
583- override def optional : Boolean = true
584- override def semanticNonNull : Boolean = ! ev.optional
593+ override def optional : Boolean = ev.optional
594+ override def canFail : Boolean = true
585595 override def toType (isInput : Boolean , isSubscription : Boolean ): __Type = {
586596 val t = ev.toType_(isInput, isSubscription)
587- if (isSubscription) t else (if (ev.optional) t else t.nonNull).list
597+ if (isSubscription) t else (if (ev.optional || ev.canFail ) t else t.nonNull).list
588598 }
589599 override def resolve (value : ZStream [R1 , E , A ]): Step [R0 ] = StreamStep (value.mapBoth(convertError, ev.resolve))
590600 }
@@ -718,13 +728,13 @@ abstract class PartiallyAppliedFieldBase[V](
718728 description,
719729 _ => Nil ,
720730 () =>
721- if (ev.optional) ev.toType_(ft.isInput, ft.isSubscription)
731+ if (ev.optional || ev.canFail ) ev.toType_(ft.isInput, ft.isSubscription)
722732 else ev.toType_(ft.isInput, ft.isSubscription).nonNull,
723733 isDeprecated = Directives .isDeprecated(directives),
724734 deprecationReason = Directives .deprecationReason(directives),
725735 directives = Some (
726736 directives.filter(_.name != " deprecated" ) ++ {
727- if (enableSemanticNonNull && ev.optional && ev.semanticNonNull ) Some (Directive (" semanticNonNull" ))
737+ if (enableSemanticNonNull && ! ev.optional && ev.canFail ) Some (Directive (" semanticNonNull" ))
728738 else None
729739 }
730740 ).filter(_.nonEmpty)
@@ -768,13 +778,13 @@ case class PartiallyAppliedFieldWithArgs[V, A](
768778 description,
769779 ev1.arguments,
770780 () =>
771- if (ev1.optional) ev1.toType_(fa.isInput, fa.isSubscription)
781+ if (ev1.optional || ev1.canFail ) ev1.toType_(fa.isInput, fa.isSubscription)
772782 else ev1.toType_(fa.isInput, fa.isSubscription).nonNull,
773783 isDeprecated = Directives .isDeprecated(directives),
774784 deprecationReason = Directives .deprecationReason(directives),
775785 directives = Some (
776786 directives.filter(_.name != " deprecated" ) ++ {
777- if (enableSemanticNonNull && ev1.optional && ev1.semanticNonNull ) Some (Directive (" semanticNonNull" ))
787+ if (enableSemanticNonNull && ! ev1.optional && ev1.canFail ) Some (Directive (" semanticNonNull" ))
778788 else None
779789 }
780790 ).filter(_.nonEmpty)
0 commit comments