blob: b394af49a2029229ec55f4a175ee0f8206c4b1cb (
plain)
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
|
module Utils.Http
( post
, delete
, decodeHttpValue
, errorKey
) where
import Http exposing (..)
import Task exposing (..)
import Json.Decode as Json exposing (Decoder)
post : String -> Task Error Value
post = request "POST"
delete : String -> Task Error Value
delete = request "DELETE"
request : String -> String -> Task Error Value
request method url =
{ verb = method
, headers = []
, url = url
, body = empty
}
|> Http.send defaultSettings
|> mapError promoteError
|> flip Task.andThen handleResponse
promoteError : RawError -> Error
promoteError rawError =
case rawError of
RawTimeout -> Timeout
RawNetworkError -> NetworkError
handleResponse : Response -> Task Error Value
handleResponse response =
if 200 <= response.status && response.status < 300
then Task.succeed response.value
else fail (BadResponse response.status (responseString response.value))
responseString : Value -> String
responseString value =
case value of
Text str -> str
_ -> ""
decodeHttpValue : Decoder a -> Value -> Task Error a
decodeHttpValue decoder value =
case value of
Text str ->
case Json.decodeString decoder str of
Ok v -> succeed v
Err msg -> fail (UnexpectedPayload msg)
_ ->
fail (UnexpectedPayload "Response body is a blob, expecting a string.")
errorKey : Error -> String
errorKey error =
case error of
Timeout -> "Timeout"
NetworkError -> "NetworkError"
UnexpectedPayload _ -> "UnexpectedPayload"
BadResponse _ key -> key
|