{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeFamilies #-} module Data.Morpheus.Server.Types.ID ( ID (..), ) where import qualified Data.Aeson as A import Data.Morpheus.Kind (SCALAR) import Data.Morpheus.Server.Types.GQLScalar (GQLScalar (..)) import Data.Morpheus.Server.Types.GQLType (GQLType (..)) import Data.Morpheus.Types.Internal.AST ( ScalarValue (..), internalFingerprint, ) import Data.Text ( Text, pack, ) import GHC.Generics (Generic) -- | default GraphQL type, -- parses only 'String' and 'Int' values, -- serialized always as 'String' newtype ID = ID { unpackID :: Text } deriving (Show, Generic) instance GQLType ID where type KIND ID = SCALAR __typeFingerprint _ = internalFingerprint "ID" [] instance A.ToJSON ID where toJSON = A.toJSON . unpackID instance A.FromJSON ID where parseJSON = fmap ID . A.parseJSON instance GQLScalar ID where parseValue (Int x) = return (ID $ pack $ show x) parseValue (String x) = return (ID x) parseValue _ = Left "" serialize (ID x) = String x