Get Scientific instances

This commit is contained in:
Eugen Wissner 2023-06-23 17:31:19 +02:00
parent 64d7545bc6
commit f90feb488d
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
2 changed files with 84 additions and 38 deletions

View File

@ -8,8 +8,8 @@ and this project adheres to
## [Unreleased] ## [Unreleased]
### Added ### Added
- `ToGraphQL` and `FromGraphQL` instances for `Word` types, `Float` and - `ToGraphQL` and `FromGraphQL` instances for `Word` types, `Float`, `Double`,
`Double`. and `Scientific`.
- `Resolver`: Export `ServerException`. - `Resolver`: Export `ServerException`.
- `Resolver.defaultResolver`: Throw `FieldNotResolvedException` if the requested - `Resolver.defaultResolver`: Throw `FieldNotResolvedException` if the requested
field is not in the parent object. field is not in the parent object.

View File

@ -19,6 +19,7 @@ import qualified Data.Text.Read as Text.Read
import Data.Vector (Vector) import Data.Vector (Vector)
import qualified Data.Vector as Vector import qualified Data.Vector as Vector
import qualified Language.GraphQL.Type as Type import qualified Language.GraphQL.Type as Type
import Data.Scientific (Scientific, toRealFloat)
fromGraphQLToIntegral :: Integral a => Type.Value -> Maybe a fromGraphQLToIntegral :: Integral a => Type.Value -> Maybe a
fromGraphQLToIntegral (Type.Int value) = Just $ fromIntegral value fromGraphQLToIntegral (Type.Int value) = Just $ fromIntegral value
@ -30,121 +31,166 @@ fromGraphQLToIntegral _ = Nothing
-- | Instances of this typeclass can be converted to GraphQL internal -- | Instances of this typeclass can be converted to GraphQL internal
-- representation. -- representation.
class ToGraphQL a where class ToGraphQL a
where
toGraphQL :: a -> Type.Value toGraphQL :: a -> Type.Value
instance ToGraphQL Text where instance ToGraphQL Text
where
toGraphQL = Type.String toGraphQL = Type.String
instance ToGraphQL Int where instance ToGraphQL Int
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Int8 where instance ToGraphQL Int8
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Int16 where instance ToGraphQL Int16
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Int32 where instance ToGraphQL Int32
where
toGraphQL = Type.Int toGraphQL = Type.Int
instance ToGraphQL Int64 where instance ToGraphQL Int64
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Word where instance ToGraphQL Word
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Word8 where instance ToGraphQL Word8
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Word16 where instance ToGraphQL Word16
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Word32 where instance ToGraphQL Word32
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL Word64 where instance ToGraphQL Word64
where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
instance ToGraphQL a => ToGraphQL [a] where instance ToGraphQL a => ToGraphQL [a]
where
toGraphQL = Type.List . fmap toGraphQL 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 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 (Just justValue) = toGraphQL justValue
toGraphQL Nothing = Type.Null toGraphQL Nothing = Type.Null
instance ToGraphQL Bool where instance ToGraphQL Bool
where
toGraphQL = Type.Boolean toGraphQL = Type.Boolean
instance ToGraphQL Float where instance ToGraphQL Float
where
toGraphQL = Type.Float . realToFrac toGraphQL = Type.Float . realToFrac
instance ToGraphQL Double where instance ToGraphQL Double
where
toGraphQL = Type.Float toGraphQL = Type.Float
instance ToGraphQL Scientific
where
toGraphQL = Type.Float . toRealFloat
-- | Instances of this typeclass can be used to convert GraphQL internal -- | Instances of this typeclass can be used to convert GraphQL internal
-- representation to user-defined type. -- representation to user-defined type.
class FromGraphQL a where class FromGraphQL a
where
fromGraphQL :: Type.Value -> Maybe a fromGraphQL :: Type.Value -> Maybe a
instance FromGraphQL Text where instance FromGraphQL Text
where
fromGraphQL (Type.String value) = Just value fromGraphQL (Type.String value) = Just value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL Int where instance FromGraphQL Int
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Int8 where instance FromGraphQL Int8
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Int16 where instance FromGraphQL Int16
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Int32 where instance FromGraphQL Int32
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Int64 where instance FromGraphQL Int64
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Word where instance FromGraphQL Word
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Word8 where instance FromGraphQL Word8
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Word16 where instance FromGraphQL Word16
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Word32 where instance FromGraphQL Word32
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL Word64 where instance FromGraphQL Word64
where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
instance FromGraphQL a => FromGraphQL [a] where instance FromGraphQL a => FromGraphQL [a]
where
fromGraphQL (Type.List value) = traverse fromGraphQL value fromGraphQL (Type.List value) = traverse fromGraphQL value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL a => FromGraphQL (Vector a) where instance FromGraphQL a => FromGraphQL (Vector a)
where
fromGraphQL (Type.List value) = Vector.fromList fromGraphQL (Type.List value) = Vector.fromList
<$> traverse fromGraphQL value <$> traverse fromGraphQL value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL a => FromGraphQL (Maybe a) where instance FromGraphQL a => FromGraphQL (Maybe a)
where
fromGraphQL Type.Null = Just Nothing fromGraphQL Type.Null = Just Nothing
fromGraphQL value = Just <$> fromGraphQL value fromGraphQL value = Just <$> fromGraphQL value
instance FromGraphQL Bool where instance FromGraphQL Bool
where
fromGraphQL (Type.Boolean value) = Just value fromGraphQL (Type.Boolean value) = Just value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL Float where instance FromGraphQL Float
where
fromGraphQL (Type.Float value) = Just $ realToFrac value fromGraphQL (Type.Float value) = Just $ realToFrac value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL Double where instance FromGraphQL Double
where
fromGraphQL (Type.Float value) = Just value fromGraphQL (Type.Float value) = Just value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL Scientific
where
fromGraphQL (Type.Float value) = Just $ realToFrac value
fromGraphQL _ = Nothing