summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md4
-rw-r--r--src/Language/GraphQL/Class.hs118
2 files changed, 84 insertions, 38 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index af4c443..8c2ee0d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,8 @@ and this project adheres to
## [Unreleased]
### Added
-- `ToGraphQL` and `FromGraphQL` instances for `Word` types, `Float` and
- `Double`.
+- `ToGraphQL` and `FromGraphQL` instances for `Word` types, `Float`, `Double`,
+ and `Scientific`.
- `Resolver`: Export `ServerException`.
- `Resolver.defaultResolver`: Throw `FieldNotResolvedException` if the requested
field is not in the parent object.
diff --git a/src/Language/GraphQL/Class.hs b/src/Language/GraphQL/Class.hs
index 89b4337..cce1bae 100644
--- a/src/Language/GraphQL/Class.hs
+++ b/src/Language/GraphQL/Class.hs
@@ -19,6 +19,7 @@ import qualified Data.Text.Read as Text.Read
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import qualified Language.GraphQL.Type as Type
+import Data.Scientific (Scientific, toRealFloat)
fromGraphQLToIntegral :: Integral a => Type.Value -> Maybe a
fromGraphQLToIntegral (Type.Int value) = Just $ fromIntegral value
@@ -30,121 +31,166 @@ fromGraphQLToIntegral _ = Nothing
-- | Instances of this typeclass can be converted to GraphQL internal
-- representation.
-class ToGraphQL a where
+class ToGraphQL a
+ where
toGraphQL :: a -> Type.Value
-instance ToGraphQL Text where
+instance ToGraphQL Text
+ where
toGraphQL = Type.String
-instance ToGraphQL Int where
+instance ToGraphQL Int
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int8 where
+instance ToGraphQL Int8
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int16 where
+instance ToGraphQL Int16
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int32 where
+instance ToGraphQL Int32
+ where
toGraphQL = Type.Int
-instance ToGraphQL Int64 where
+instance ToGraphQL Int64
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word where
+instance ToGraphQL Word
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word8 where
+instance ToGraphQL Word8
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word16 where
+instance ToGraphQL Word16
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word32 where
+instance ToGraphQL Word32
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word64 where
+instance ToGraphQL Word64
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL a => ToGraphQL [a] where
+instance ToGraphQL a => ToGraphQL [a]
+ where
toGraphQL = Type.List . fmap toGraphQL
-instance ToGraphQL a => ToGraphQL (Vector a) where
+instance ToGraphQL a => ToGraphQL (Vector a)
+ where
toGraphQL = Type.List . toList . fmap toGraphQL
-instance ToGraphQL a => ToGraphQL (Maybe a) where
+instance ToGraphQL a => ToGraphQL (Maybe a)
+ where
toGraphQL (Just justValue) = toGraphQL justValue
toGraphQL Nothing = Type.Null
-instance ToGraphQL Bool where
+instance ToGraphQL Bool
+ where
toGraphQL = Type.Boolean
-instance ToGraphQL Float where
+instance ToGraphQL Float
+ where
toGraphQL = Type.Float . realToFrac
-instance ToGraphQL Double where
+instance ToGraphQL Double
+ where
toGraphQL = Type.Float
+instance ToGraphQL Scientific
+ where
+ toGraphQL = Type.Float . toRealFloat
+
-- | Instances of this typeclass can be used to convert GraphQL internal
-- representation to user-defined type.
-class FromGraphQL a where
+class FromGraphQL a
+ where
fromGraphQL :: Type.Value -> Maybe a
-instance FromGraphQL Text where
+instance FromGraphQL Text
+ where
fromGraphQL (Type.String value) = Just value
fromGraphQL _ = Nothing
-instance FromGraphQL Int where
+instance FromGraphQL Int
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int8 where
+instance FromGraphQL Int8
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int16 where
+instance FromGraphQL Int16
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int32 where
+instance FromGraphQL Int32
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int64 where
+instance FromGraphQL Int64
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word where
+instance FromGraphQL Word
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word8 where
+instance FromGraphQL Word8
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word16 where
+instance FromGraphQL Word16
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word32 where
+instance FromGraphQL Word32
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word64 where
+instance FromGraphQL Word64
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL a => FromGraphQL [a] where
+instance FromGraphQL a => FromGraphQL [a]
+ where
fromGraphQL (Type.List value) = traverse fromGraphQL value
fromGraphQL _ = Nothing
-instance FromGraphQL a => FromGraphQL (Vector a) where
+instance FromGraphQL a => FromGraphQL (Vector a)
+ where
fromGraphQL (Type.List value) = Vector.fromList
<$> traverse fromGraphQL value
fromGraphQL _ = Nothing
-instance FromGraphQL a => FromGraphQL (Maybe a) where
+instance FromGraphQL a => FromGraphQL (Maybe a)
+ where
fromGraphQL Type.Null = Just Nothing
fromGraphQL value = Just <$> fromGraphQL value
-instance FromGraphQL Bool where
+instance FromGraphQL Bool
+ where
fromGraphQL (Type.Boolean value) = Just value
fromGraphQL _ = Nothing
-instance FromGraphQL Float where
+instance FromGraphQL Float
+ where
fromGraphQL (Type.Float value) = Just $ realToFrac value
fromGraphQL _ = Nothing
-instance FromGraphQL Double where
+instance FromGraphQL Double
+ where
fromGraphQL (Type.Float value) = Just value
fromGraphQL _ = Nothing
+
+instance FromGraphQL Scientific
+ where
+ fromGraphQL (Type.Float value) = Just $ realToFrac value
+ fromGraphQL _ = Nothing