From f90feb488d718c57509375c9627f912b8826c914 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 23 Jun 2023 17:31:19 +0200 Subject: [PATCH] Get Scientific instances --- CHANGELOG.md | 4 +- src/Language/GraphQL/Class.hs | 118 +++++++++++++++++++++++----------- 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