Fix non nullable type representation
…in executor error messages.
This commit is contained in:
		@@ -22,7 +22,7 @@ extra-source-files:
 | 
				
			|||||||
  README.md
 | 
					  README.md
 | 
				
			||||||
tested-with:
 | 
					tested-with:
 | 
				
			||||||
  GHC == 9.2.8,
 | 
					  GHC == 9.2.8,
 | 
				
			||||||
  GHC == 9.6.2
 | 
					  GHC == 9.6.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source-repository head
 | 
					source-repository head
 | 
				
			||||||
  type: git
 | 
					  type: git
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -371,8 +371,8 @@ data NonNullType
 | 
				
			|||||||
    deriving Eq
 | 
					    deriving Eq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
instance Show NonNullType where
 | 
					instance Show NonNullType where
 | 
				
			||||||
    show (NonNullTypeNamed typeName) = '!' : Text.unpack typeName
 | 
					    show (NonNullTypeNamed typeName) = Text.unpack $ typeName <> "!"
 | 
				
			||||||
    show (NonNullTypeList listType) =  concat ["![", show listType, "]"]
 | 
					    show (NonNullTypeList listType) = concat ["[", show listType, "]!"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- ** Directives
 | 
					-- ** Directives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,8 @@ module Language.GraphQL.Type.Definition
 | 
				
			|||||||
    , float
 | 
					    , float
 | 
				
			||||||
    , id
 | 
					    , id
 | 
				
			||||||
    , int
 | 
					    , int
 | 
				
			||||||
 | 
					    , showNonNullType
 | 
				
			||||||
 | 
					    , showNonNullListType
 | 
				
			||||||
    , selection
 | 
					    , selection
 | 
				
			||||||
    , string
 | 
					    , string
 | 
				
			||||||
    ) where
 | 
					    ) where
 | 
				
			||||||
@@ -207,3 +209,11 @@ include = handle include'
 | 
				
			|||||||
            (Just (Boolean True)) -> Include directive'
 | 
					            (Just (Boolean True)) -> Include directive'
 | 
				
			||||||
            _ -> Skip
 | 
					            _ -> Skip
 | 
				
			||||||
    include' directive' = Continue directive'
 | 
					    include' directive' = Continue directive'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showNonNullType :: Show a => a -> String
 | 
				
			||||||
 | 
					showNonNullType = (++ "!") . show
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showNonNullListType :: Show a => a -> String
 | 
				
			||||||
 | 
					showNonNullListType listType =
 | 
				
			||||||
 | 
					    let representation = show listType
 | 
				
			||||||
 | 
					     in concat ["[", representation, "]!"]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,10 +66,11 @@ instance Show Type where
 | 
				
			|||||||
    show (NamedEnumType enumType) = show enumType
 | 
					    show (NamedEnumType enumType) = show enumType
 | 
				
			||||||
    show (NamedInputObjectType inputObjectType) = show inputObjectType
 | 
					    show (NamedInputObjectType inputObjectType) = show inputObjectType
 | 
				
			||||||
    show (ListType baseType) = concat ["[", show baseType, "]"]
 | 
					    show (ListType baseType) = concat ["[", show baseType, "]"]
 | 
				
			||||||
    show (NonNullScalarType scalarType) = '!' : show scalarType
 | 
					    show (NonNullScalarType scalarType) = Definition.showNonNullType scalarType
 | 
				
			||||||
    show (NonNullEnumType enumType) = '!' : show enumType
 | 
					    show (NonNullEnumType enumType) = Definition.showNonNullType enumType
 | 
				
			||||||
    show (NonNullInputObjectType inputObjectType) = '!' : show inputObjectType
 | 
					    show (NonNullInputObjectType inputObjectType) =
 | 
				
			||||||
    show (NonNullListType baseType) = concat ["![", show baseType, "]"]
 | 
					        Definition.showNonNullType inputObjectType
 | 
				
			||||||
 | 
					    show (NonNullListType baseType) = Definition.showNonNullListType baseType
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Field argument definition.
 | 
					-- | Field argument definition.
 | 
				
			||||||
data Argument = Argument (Maybe Text) Type (Maybe Definition.Value)
 | 
					data Argument = Argument (Maybe Text) Type (Maybe Definition.Value)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -115,12 +115,12 @@ instance forall a. Show (Type a) where
 | 
				
			|||||||
    show (NamedInterfaceType interfaceType) = show interfaceType
 | 
					    show (NamedInterfaceType interfaceType) = show interfaceType
 | 
				
			||||||
    show (NamedUnionType unionType) = show unionType
 | 
					    show (NamedUnionType unionType) = show unionType
 | 
				
			||||||
    show (ListType baseType) = concat ["[", show baseType, "]"]
 | 
					    show (ListType baseType) = concat ["[", show baseType, "]"]
 | 
				
			||||||
    show (NonNullScalarType scalarType) = '!' : show scalarType
 | 
					    show (NonNullScalarType scalarType) = showNonNullType scalarType
 | 
				
			||||||
    show (NonNullEnumType enumType) = '!' : show enumType
 | 
					    show (NonNullEnumType enumType) = showNonNullType enumType
 | 
				
			||||||
    show (NonNullObjectType inputObjectType) = '!' : show inputObjectType
 | 
					    show (NonNullObjectType inputObjectType) = showNonNullType inputObjectType
 | 
				
			||||||
    show (NonNullInterfaceType interfaceType) = '!' : show interfaceType
 | 
					    show (NonNullInterfaceType interfaceType) = showNonNullType interfaceType
 | 
				
			||||||
    show (NonNullUnionType unionType) = '!' : show unionType
 | 
					    show (NonNullUnionType unionType) = showNonNullType unionType
 | 
				
			||||||
    show (NonNullListType baseType) = concat ["![", show baseType, "]"]
 | 
					    show (NonNullListType baseType) = showNonNullListType baseType
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Matches either 'NamedScalarType' or 'NonNullScalarType'.
 | 
					-- | Matches either 'NamedScalarType' or 'NonNullScalarType'.
 | 
				
			||||||
pattern ScalarBaseType :: forall m. ScalarType -> Type m
 | 
					pattern ScalarBaseType :: forall m. ScalarType -> Type m
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -295,7 +295,7 @@ spec =
 | 
				
			|||||||
                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
					                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
				
			||||||
                    executionErrors = pure $ Error
 | 
					                    executionErrors = pure $ Error
 | 
				
			||||||
                        { message =
 | 
					                        { message =
 | 
				
			||||||
                            "Value completion error. Expected type !School, found: EXISTENTIALISM."
 | 
					                            "Value completion error. Expected type School!, found: EXISTENTIALISM."
 | 
				
			||||||
                        , locations = [Location 1 17]
 | 
					                        , locations = [Location 1 17]
 | 
				
			||||||
                        , path = [Segment "philosopher", Segment "school"]
 | 
					                        , path = [Segment "philosopher", Segment "school"]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -307,7 +307,7 @@ spec =
 | 
				
			|||||||
                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
					                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
				
			||||||
                    executionErrors = pure $ Error
 | 
					                    executionErrors = pure $ Error
 | 
				
			||||||
                        { message =
 | 
					                        { message =
 | 
				
			||||||
                            "Value completion error. Expected type !Interest, found: { instrument: \"piano\" }."
 | 
					                            "Value completion error. Expected type Interest!, found: { instrument: \"piano\" }."
 | 
				
			||||||
                        , locations = [Location 1 17]
 | 
					                        , locations = [Location 1 17]
 | 
				
			||||||
                        , path = [Segment "philosopher", Segment "interest"]
 | 
					                        , path = [Segment "philosopher", Segment "interest"]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -319,7 +319,7 @@ spec =
 | 
				
			|||||||
                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
					                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
				
			||||||
                    executionErrors = pure $ Error
 | 
					                    executionErrors = pure $ Error
 | 
				
			||||||
                        { message
 | 
					                        { message
 | 
				
			||||||
                            = "Value completion error. Expected type !Work, found:\
 | 
					                            = "Value completion error. Expected type Work!, found:\
 | 
				
			||||||
                            \ { title: \"Also sprach Zarathustra: Ein Buch f\252r Alle und Keinen\" }."
 | 
					                            \ { title: \"Also sprach Zarathustra: Ein Buch f\252r Alle und Keinen\" }."
 | 
				
			||||||
                        , locations = [Location 1 17]
 | 
					                        , locations = [Location 1 17]
 | 
				
			||||||
                        , path = [Segment "philosopher", Segment "majorWork"]
 | 
					                        , path = [Segment "philosopher", Segment "majorWork"]
 | 
				
			||||||
@@ -343,7 +343,7 @@ spec =
 | 
				
			|||||||
            it "gives location information for failed result coercion" $
 | 
					            it "gives location information for failed result coercion" $
 | 
				
			||||||
                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
					                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
				
			||||||
                    executionErrors = pure $ Error
 | 
					                    executionErrors = pure $ Error
 | 
				
			||||||
                        { message = "Unable to coerce result to !Int."
 | 
					                        { message = "Unable to coerce result to Int!."
 | 
				
			||||||
                        , locations = [Location 1 26]
 | 
					                        , locations = [Location 1 26]
 | 
				
			||||||
                        , path = [Segment "philosopher", Segment "century"]
 | 
					                        , path = [Segment "philosopher", Segment "century"]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -364,7 +364,7 @@ spec =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            it "sets data to null if a root field isn't nullable" $
 | 
					            it "sets data to null if a root field isn't nullable" $
 | 
				
			||||||
                let executionErrors = pure $ Error
 | 
					                let executionErrors = pure $ Error
 | 
				
			||||||
                        { message = "Unable to coerce result to !Int."
 | 
					                        { message = "Unable to coerce result to Int!."
 | 
				
			||||||
                        , locations = [Location 1 3]
 | 
					                        , locations = [Location 1 3]
 | 
				
			||||||
                        , path = [Segment "count"]
 | 
					                        , path = [Segment "count"]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
@@ -375,7 +375,7 @@ spec =
 | 
				
			|||||||
            it "detects nullability errors" $
 | 
					            it "detects nullability errors" $
 | 
				
			||||||
                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
					                let data'' = Object $ HashMap.singleton "philosopher" Null
 | 
				
			||||||
                    executionErrors = pure $ Error
 | 
					                    executionErrors = pure $ Error
 | 
				
			||||||
                        { message = "Value completion error. Expected type !String, found: null."
 | 
					                        { message = "Value completion error. Expected type String!, found: null."
 | 
				
			||||||
                        , locations = [Location 1 26]
 | 
					                        , locations = [Location 1 26]
 | 
				
			||||||
                        , path = [Segment "philosopher", Segment "firstLanguage"]
 | 
					                        , path = [Segment "philosopher", Segment "firstLanguage"]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -878,7 +878,7 @@ spec =
 | 
				
			|||||||
                        { message =
 | 
					                        { message =
 | 
				
			||||||
                            "Variable \"$dogCommandArg\" of type \
 | 
					                            "Variable \"$dogCommandArg\" of type \
 | 
				
			||||||
                            \\"DogCommand\" used in position expecting type \
 | 
					                            \\"DogCommand\" used in position expecting type \
 | 
				
			||||||
                            \\"!DogCommand\"."
 | 
					                            \\"DogCommand!\"."
 | 
				
			||||||
                        , locations = [AST.Location 1 26]
 | 
					                        , locations = [AST.Location 1 26]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                 in validate queryString `shouldBe` [expected]
 | 
					                 in validate queryString `shouldBe` [expected]
 | 
				
			||||||
@@ -925,7 +925,7 @@ spec =
 | 
				
			|||||||
                |]
 | 
					                |]
 | 
				
			||||||
                    expected = Error
 | 
					                    expected = Error
 | 
				
			||||||
                        { message =
 | 
					                        { message =
 | 
				
			||||||
                            "Value 3 cannot be coerced to type \"!CatCommand\"."
 | 
					                            "Value 3 cannot be coerced to type \"CatCommand!\"."
 | 
				
			||||||
                        , locations = [AST.Location 3 36]
 | 
					                        , locations = [AST.Location 3 36]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                 in validate queryString `shouldBe` [expected]
 | 
					                 in validate queryString `shouldBe` [expected]
 | 
				
			||||||
@@ -940,7 +940,7 @@ spec =
 | 
				
			|||||||
                |]
 | 
					                |]
 | 
				
			||||||
                    expected = Error
 | 
					                    expected = Error
 | 
				
			||||||
                        { message =
 | 
					                        { message =
 | 
				
			||||||
                            "Value 3 cannot be coerced to type \"!String\"."
 | 
					                            "Value 3 cannot be coerced to type \"String!\"."
 | 
				
			||||||
                        , locations = [AST.Location 2 28]
 | 
					                        , locations = [AST.Location 2 28]
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                 in validate queryString `shouldBe` [expected]
 | 
					                 in validate queryString `shouldBe` [expected]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user