/
Types.purs
105 lines (88 loc) · 3.73 KB
/
Types.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
module GraphQL.Client.Types where
import Prelude
import Data.Argonaut.Core (Json)
import Data.Argonaut.Decode (JsonDecodeError)
import Data.Either (Either)
import Data.Maybe (Maybe)
import Effect (Effect)
import Effect.Aff (Aff)
import Foreign.Object (Object)
import GraphQL.Client.QueryReturns (class QueryReturns)
import GraphQL.Client.ToGqlString (class GqlQueryString)
import Halogen.Subscription (Emitter, makeEmitter)
class
( QueryReturns schema query returns
, GqlQueryString query
) <= GqlQuery schema query returns | schema query -> returns
instance queriable ::
( QueryReturns schema query returns
, GqlQueryString query
) =>
GqlQuery schema query returns
newtype Client :: forall k1 k2 k3. Type -> k1 -> k2 -> k3 -> Type
newtype Client baseClient querySchema mutationSchema subscriptionSchema
= Client baseClient
-- | A type class for making a graphql request client.
-- | Apollo, urql and xhr2/Affjax baseClients are provided.
-- | If you wish to use a different base client,
-- | you can create your own client,
-- | make it an instance of `QueryClient`
-- | and pass it to query
class QueryClient baseClient queryOpts mutationOpts | baseClient -> queryOpts mutationOpts where
clientQuery :: queryOpts -> baseClient -> String -> String -> Aff Json
clientMutation :: mutationOpts -> baseClient -> String -> String -> Aff Json
defQueryOpts :: baseClient -> queryOpts
defMutationOpts :: baseClient -> mutationOpts
-- | A type class for making graphql subscriptions.
-- | If you wish to use a different underlying client,
-- | you can create your own client,
-- | make it an instance of `SubscriptionClient`
-- | and pass it to `subscription`
class SubscriptionClient baseClient opts | baseClient -> opts where
clientSubscription ::
opts ->
baseClient ->
String ->
(Json -> Effect Unit) ->
Effect (Effect Unit)
defSubOpts :: baseClient -> opts
-- TODO: Remove `Event` part of name
subscriptionEventOpts :: forall opts c. SubscriptionClient c opts => (opts -> opts) -> c -> String -> Emitter Json
subscriptionEventOpts optsF client query = makeEmitter (clientSubscription (optsF (defSubOpts client)) client query)
subscriptionEvent :: forall opts c. SubscriptionClient c opts => c -> String -> Emitter Json
subscriptionEvent = subscriptionEventOpts identity
-- | A type class for making graphql watch queries (observable queries).
-- | If you wish to use a different underlying client,
-- | you can create your own client,
-- | make it an instance of `WatchQueryClient`
-- | and pass it to `watchQuery`
class WatchQueryClient baseClient opts | baseClient -> opts where
clientWatchQuery ::
opts ->
baseClient ->
String ->
(Json -> Effect Unit) ->
Effect (Effect Unit)
defWatchOpts :: baseClient -> opts
watchQueryEventOpts :: forall opts c. WatchQueryClient c opts => (opts -> opts) -> c -> String -> Emitter Json
watchQueryEventOpts optsF client query = makeEmitter (clientWatchQuery (optsF (defWatchOpts client)) client query)
watchQueryEvent :: forall opts c. WatchQueryClient c opts => c -> String -> Emitter Json
watchQueryEvent = watchQueryEventOpts identity
-- Full response types
-- Full responses
-- | The full graphql query response,
-- | According to https://spec.graphql.org/June2018/#sec-Response-Format
type GqlRes res
= { data_ :: Either JsonDecodeError res
, errors :: Maybe (Array GqlError)
, errors_json :: Maybe (Array Json) -- For deprecated error responses where custom props are not in extensions
, extensions :: Maybe (Object Json)
}
type GqlError
= { message :: String
, locations :: ErrorLocations
, path :: Maybe (Array (Either Int String))
, extensions :: Maybe (Object Json)
}
type ErrorLocations
= Maybe (Array { line :: Int, column :: Int })