54 lines
1.3 KiB
Elm
54 lines
1.3 KiB
Elm
module Api exposing (addServerError, decodeErrors, url)
|
|
|
|
import Http
|
|
import Json.Decode as Decode exposing (Decoder, decodeString, field, string)
|
|
import Json.Decode.Pipeline as Pipeline exposing (optional)
|
|
import Url.Builder
|
|
|
|
|
|
|
|
-- URL
|
|
|
|
|
|
{-| Get a URL to the Conduit API.
|
|
-}
|
|
url : List String -> String
|
|
url paths =
|
|
-- NOTE: Url.Builder takes care of percent-encoding special URL characters.
|
|
-- See https://package.elm-lang.org/packages/elm/url/latest/Url#percentEncode
|
|
Url.Builder.relative ("api" :: paths) []
|
|
|
|
|
|
|
|
-- ERRORS
|
|
|
|
|
|
addServerError : List String -> List String
|
|
addServerError list =
|
|
"Server error" :: list
|
|
|
|
|
|
{-| Many API endpoints include an "errors" field in their BadStatus responses.
|
|
-}
|
|
decodeErrors : Http.Error -> List String
|
|
decodeErrors error =
|
|
case error of
|
|
Http.BadStatus response ->
|
|
response.body
|
|
|> decodeString (field "errors" errorsDecoder)
|
|
|> Result.withDefault [ "Server error" ]
|
|
|
|
err ->
|
|
[ "Server error" ]
|
|
|
|
|
|
errorsDecoder : Decoder (List String)
|
|
errorsDecoder =
|
|
Decode.keyValuePairs (Decode.list Decode.string)
|
|
|> Decode.map (List.concatMap fromPair)
|
|
|
|
|
|
fromPair : ( String, List String ) -> List String
|
|
fromPair ( field, errors ) =
|
|
List.map (\error -> field ++ " " ++ error) errors
|