@@ -255,29 +255,32 @@ trait GenericSchema[R] extends SchemaDerivation[R] with TemporalSchema {
255255 def field [V ](
256256 name : String ,
257257 description : Option [String ] = None ,
258- directives : List [Directive ] = List .empty
258+ directives : List [Directive ] = List .empty,
259+ enableSemanticNonNull : Boolean = false
259260 ): PartiallyAppliedField [V ] =
260- PartiallyAppliedField [V ](name, description, directives)
261+ PartiallyAppliedField [V ](name, description, directives, enableSemanticNonNull )
261262
262263 /**
263264 * Manually defines a lazy field from a name, a description, some directives and a resolver.
264265 */
265266 def fieldLazy [V ](
266267 name : String ,
267268 description : Option [String ] = None ,
268- directives : List [Directive ] = List .empty
269+ directives : List [Directive ] = List .empty,
270+ enableSemanticNonNull : Boolean = false
269271 ): PartiallyAppliedFieldLazy [V ] =
270- PartiallyAppliedFieldLazy [V ](name, description, directives)
272+ PartiallyAppliedFieldLazy [V ](name, description, directives, enableSemanticNonNull )
271273
272274 /**
273275 * Manually defines a field with arguments from a name, a description, some directives and a resolver.
274276 */
275277 def fieldWithArgs [V , A ](
276278 name : String ,
277279 description : Option [String ] = None ,
278- directives : List [Directive ] = Nil
280+ directives : List [Directive ] = Nil ,
281+ enableSemanticNonNull : Boolean = false
279282 ): PartiallyAppliedFieldWithArgs [V , A ] =
280- PartiallyAppliedFieldWithArgs [V , A ](name, description, directives)
283+ PartiallyAppliedFieldWithArgs [V , A ](name, description, directives, enableSemanticNonNull )
281284
282285 /**
283286 * Creates a new hand-rolled schema. For normal usage use the derived schemas, this is primarily for schemas
@@ -696,7 +699,12 @@ trait TemporalSchema {
696699
697700case class FieldAttributes (isInput : Boolean , isSubscription : Boolean )
698701
699- abstract class PartiallyAppliedFieldBase [V ](name : String , description : Option [String ], directives : List [Directive ]) {
702+ abstract class PartiallyAppliedFieldBase [V ](
703+ name : String ,
704+ description : Option [String ],
705+ directives : List [Directive ],
706+ enableSemanticNonNull : Boolean
707+ ) {
700708 def apply [R , V1 ](fn : V => V1 )(implicit ev : Schema [R , V1 ], ft : FieldAttributes ): (__Field, V => Step [R ]) =
701709 either[R , V1 ](v => Left (fn(v)))(ev, ft)
702710
@@ -716,30 +724,43 @@ abstract class PartiallyAppliedFieldBase[V](name: String, description: Option[St
716724 deprecationReason = Directives .deprecationReason(directives),
717725 directives = Some (
718726 directives.filter(_.name != " deprecated" ) ++ {
719- if (ev.optional && ev.semanticNonNull) Some (Directive (" semanticNonNull" ))
727+ if (enableSemanticNonNull && ev.optional && ev.semanticNonNull) Some (Directive (" semanticNonNull" ))
720728 else None
721729 }
722730 ).filter(_.nonEmpty)
723731 )
724732}
725733
726- case class PartiallyAppliedField [V ](name : String , description : Option [String ], directives : List [Directive ])
727- extends PartiallyAppliedFieldBase [V ](name, description, directives) {
734+ case class PartiallyAppliedField [V ](
735+ name : String ,
736+ description : Option [String ],
737+ directives : List [Directive ],
738+ enableSemanticNonNull : Boolean
739+ ) extends PartiallyAppliedFieldBase [V ](name, description, directives, enableSemanticNonNull) {
728740 def either [R , V1 ](
729741 fn : V => Either [V1 , Step [R ]]
730742 )(implicit ev : Schema [R , V1 ], ft : FieldAttributes ): (__Field, V => Step [R ]) =
731743 (makeField, (v : V ) => fn(v).fold(ev.resolve, identity))
732744}
733745
734- case class PartiallyAppliedFieldLazy [V ](name : String , description : Option [String ], directives : List [Directive ])
735- extends PartiallyAppliedFieldBase [V ](name, description, directives) {
746+ case class PartiallyAppliedFieldLazy [V ](
747+ name : String ,
748+ description : Option [String ],
749+ directives : List [Directive ],
750+ enableSemanticNonNull : Boolean
751+ ) extends PartiallyAppliedFieldBase [V ](name, description, directives, enableSemanticNonNull) {
736752 def either [R , V1 ](
737753 fn : V => Either [V1 , Step [R ]]
738754 )(implicit ev : Schema [R , V1 ], ft : FieldAttributes ): (__Field, V => Step [R ]) =
739755 (makeField, (v : V ) => FunctionStep (_ => fn(v).fold(ev.resolve, identity)))
740756}
741757
742- case class PartiallyAppliedFieldWithArgs [V , A ](name : String , description : Option [String ], directives : List [Directive ]) {
758+ case class PartiallyAppliedFieldWithArgs [V , A ](
759+ name : String ,
760+ description : Option [String ],
761+ directives : List [Directive ],
762+ enableSemanticNonNull : Boolean
763+ ) {
743764 def apply [R , V1 ](fn : V => (A => V1 ))(implicit ev1 : Schema [R , A => V1 ], fa : FieldAttributes ): (__Field, V => Step [R ]) =
744765 (
745766 Types .makeField(
@@ -753,7 +774,7 @@ case class PartiallyAppliedFieldWithArgs[V, A](name: String, description: Option
753774 deprecationReason = Directives .deprecationReason(directives),
754775 directives = Some (
755776 directives.filter(_.name != " deprecated" ) ++ {
756- if (ev1.optional && ev1.semanticNonNull) Some (Directive (" semanticNonNull" ))
777+ if (enableSemanticNonNull && ev1.optional && ev1.semanticNonNull) Some (Directive (" semanticNonNull" ))
757778 else None
758779 }
759780 ).filter(_.nonEmpty)
0 commit comments