forked from OSS/graphql-spice
Add JSON Serialize instance
This commit is contained in:
parent
396b480806
commit
79ed58fa67
@ -1,7 +1,43 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
module Language.GraphQL.Serialize
|
module Language.GraphQL.Serialize
|
||||||
( JSON(..)
|
( JSON(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Data.Aeson as Aeson
|
import qualified Data.Aeson as Aeson
|
||||||
|
import qualified Data.Aeson.Key as Aeson.Key
|
||||||
|
import Language.GraphQL.Execute.Coerce
|
||||||
|
import qualified Language.GraphQL.Execute.OrderedMap as OrderedMap
|
||||||
|
import qualified Language.GraphQL.Type.Out as Out
|
||||||
|
import qualified Language.GraphQL.Type as Type
|
||||||
|
|
||||||
newtype JSON = JSON Aeson.Value
|
newtype JSON = JSON Aeson.Value
|
||||||
|
|
||||||
|
instance Aeson.ToJSON JSON where
|
||||||
|
toJSON (JSON value) = value
|
||||||
|
|
||||||
|
instance Aeson.FromJSON JSON where
|
||||||
|
parseJSON = pure . JSON
|
||||||
|
|
||||||
|
instance Serialize JSON where
|
||||||
|
serialize (Out.ScalarBaseType scalarType) value
|
||||||
|
| Type.ScalarType "Int" _ <- scalarType
|
||||||
|
, Int int <- value = Just $ JSON $ Aeson.Number $ fromIntegral int
|
||||||
|
| Type.ScalarType "Float" _ <- scalarType
|
||||||
|
, Float float <- value = Just $ JSON $ Aeson.toJSON float
|
||||||
|
| Type.ScalarType "String" _ <- scalarType
|
||||||
|
, String string <- value = Just $ JSON $ Aeson.String string
|
||||||
|
| Type.ScalarType "ID" _ <- scalarType
|
||||||
|
, String string <- value = Just $ JSON $ Aeson.String string
|
||||||
|
| Type.ScalarType "Boolean" _ <- scalarType
|
||||||
|
, Boolean boolean <- value = Just $ JSON $ Aeson.Bool boolean
|
||||||
|
serialize _ (Enum enum) = Just $ JSON $ Aeson.String enum
|
||||||
|
serialize _ (List list) = Just $ JSON $ Aeson.toJSON list
|
||||||
|
serialize _ (Object object) = Just
|
||||||
|
$ JSON
|
||||||
|
$ Aeson.object
|
||||||
|
$ toJSONKeyValue <$> OrderedMap.toList object
|
||||||
|
where
|
||||||
|
toJSONKeyValue (key, value) = (Aeson.Key.fromText key, Aeson.toJSON value)
|
||||||
|
serialize _ _ = Nothing
|
||||||
|
null = JSON Aeson.Null
|
||||||
|
Loading…
Reference in New Issue
Block a user