Skip to content

Commit ae37f49

Browse files
committed
Experiment with an expectGraphQL
1 parent 459395b commit ae37f49

File tree

2 files changed

+52
-42
lines changed

2 files changed

+52
-42
lines changed

src/GraphQL/Client/Http.elm

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ module GraphQL.Client.Http exposing (Error(..), RequestError, DocumentLocation,
88

99
import GraphQL.Client.Http.Util as Util
1010
import GraphQL.Request.Builder as Builder
11+
import GraphQL.Response as Response
1112
import Http
13+
import Json.Decode
1214
import Task exposing (Task)
1315

1416

@@ -75,9 +77,7 @@ send :
7577
send options request toMsg =
7678
let
7779
expect =
78-
Http.expectJson
79-
(Result.mapError (Util.convertHttpError HttpError GraphQLError) >> toMsg)
80-
(Util.dataDecoder (Builder.responseDataDecoder request))
80+
expectGraphQL toMsg request
8181

8282
documentString =
8383
Builder.requestBody request
@@ -89,5 +89,39 @@ send options request toMsg =
8989
|> Http.request
9090

9191

92+
expectGraphQL :
93+
(Result Error result -> msg)
94+
-> Builder.Request operationType result
95+
-> Http.Expect msg
96+
expectGraphQL toMsg request =
97+
let
98+
decoder =
99+
Json.Decode.map2 (\errors data -> ( errors, data ))
100+
(Json.Decode.maybe (Json.Decode.field "errors" Response.errorsDecoder))
101+
(Json.Decode.field "data" (Builder.responseDataDecoder request))
102+
in
103+
Http.expectStringResponse toMsg <|
104+
\response ->
105+
case response of
106+
Http.BadUrl_ url ->
107+
Err (HttpError (Http.BadUrl url))
108+
109+
Http.Timeout_ ->
110+
Err (HttpError Http.Timeout)
111+
112+
Http.NetworkError_ ->
113+
Err (HttpError Http.NetworkError)
114+
115+
Http.BadStatus_ metadata body ->
116+
Err (HttpError (Http.BadStatus metadata.statusCode))
117+
118+
Http.GoodStatus_ metadata body ->
119+
case Json.Decode.decodeString decoder body of
120+
Ok ( Just errors, _ ) ->
121+
Err (GraphQLError errors)
122+
123+
Ok ( Nothing, data ) ->
124+
Ok data
92125

93-
-- |> Task.mapError (
126+
Err err ->
127+
Err (HttpError (Http.BadBody (Json.Decode.errorToString err)))

src/GraphQL/Client/Http/Util.elm

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module GraphQL.Client.Http.Util exposing (..)
1+
module GraphQL.Client.Http.Util exposing (DocumentLocation, Error(..), RequestConfig, RequestError, RequestOptions, defaultRequestOptions, parameterizedUrl, postBody, postBodyJson, requestConfig)
22

33
import GraphQL.Response as Response
44
import Http
@@ -18,7 +18,7 @@ postBodyJson documentString variableValues =
1818
|> Maybe.map (\obj -> [ ( "variables", obj ) ])
1919
|> Maybe.withDefault []
2020
in
21-
Json.Encode.object ([ ( "query", documentValue ) ] ++ extraParams)
21+
Json.Encode.object ([ ( "query", documentValue ) ] ++ extraParams)
2222

2323

2424
postBody : String -> Maybe Json.Encode.Value -> Http.Body
@@ -32,6 +32,7 @@ parameterizedUrl url documentString variableValues =
3232
firstParamPrefix =
3333
if String.contains "?" url then
3434
"&"
35+
3536
else
3637
"?"
3738

@@ -46,7 +47,7 @@ parameterizedUrl url documentString variableValues =
4647
)
4748
|> Maybe.withDefault ""
4849
in
49-
url ++ queryParam ++ variablesParam
50+
url ++ queryParam ++ variablesParam
5051

5152

5253
type alias RequestOptions =
@@ -81,7 +82,7 @@ type alias RequestConfig a =
8182
, body : Http.Body
8283
, expect : Http.Expect a
8384
, timeout : Maybe Float
84-
, tracker: Maybe String
85+
, tracker : Maybe String
8586
}
8687

8788

@@ -105,40 +106,15 @@ requestConfig requestOptions documentString expect variableValues =
105106
( url, body ) =
106107
if requestOptions.method == "GET" then
107108
( parameterizedUrl requestOptions.url documentString variableValues, Http.emptyBody )
109+
108110
else
109111
( requestOptions.url, postBody documentString variableValues )
110112
in
111-
{ method = requestOptions.method
112-
, headers = requestOptions.headers
113-
, url = url
114-
, body = body
115-
, expect = expect
116-
, timeout = requestOptions.timeout
117-
, tracker = Nothing
118-
}
119-
120-
121-
dataDecoder =
122-
Json.Decode.field "data"
123-
124-
125-
errorsResponseDecoder : Json.Decode.Decoder (List RequestError)
126-
errorsResponseDecoder =
127-
Json.Decode.field "errors" Response.errorsDecoder
128-
129-
130-
convertHttpError : (Http.Error -> err) -> (List RequestError -> err) -> Http.Error -> err
131-
convertHttpError wrapHttpError wrapGraphQLError httpError =
132-
let
133-
handleErrorWithResponseBody responseBody =
134-
responseBody
135-
|> Json.Decode.decodeString errorsResponseDecoder
136-
|> Result.map wrapGraphQLError
137-
|> Result.withDefault (wrapHttpError httpError)
138-
in
139-
case httpError of
140-
Http.BadBody body ->
141-
handleErrorWithResponseBody body
142-
143-
_ ->
144-
wrapHttpError httpError
113+
{ method = requestOptions.method
114+
, headers = requestOptions.headers
115+
, url = url
116+
, body = body
117+
, expect = expect
118+
, timeout = requestOptions.timeout
119+
, tracker = Nothing
120+
}

0 commit comments

Comments
 (0)