blob: bd6e2ac0c57642e8b63c949481e5093966a49c65 (
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
|
module Utils.Http
( post
, decodeHttpValue
, errorKey
) where
import Http exposing (..)
import Task exposing (..)
import Json.Decode as Json exposing (Decoder)
post : String -> Task Error Value
post url =
{ verb = "POST"
, 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
|