Files
elm-0.19-workshop/advanced/part1/src/Viewer/Cred.elm
2018-08-16 03:41:03 -05:00

62 lines
1.5 KiB
Elm

module Viewer.Cred exposing (Cred, addHeader, addHeaderIfAvailable, decoder, encodeToken)
import HttpBuilder exposing (RequestBuilder, withHeader)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline exposing (required)
import Json.Encode as Encode exposing (Value)
import Username exposing (Username)
-- TYPES
type alias Cred =
{- 👉 TODO: Make Cred an opaque type, then fix the resulting compiler errors.
Afterwards, it should no longer be possible for any other module to access
this `token` value directly!
💡 HINT: Other modules still depend on being able to access the
`username` value. Expand this module's API to expose a new way for them
to access the `username` without also giving them access to `token`.
-}
{ username : Username
, token : String
}
-- SERIALIZATION
decoder : Decoder Cred
decoder =
Decode.succeed Cred
|> required "username" Username.decoder
|> required "token" Decode.string
-- TRANSFORM
encodeToken : Cred -> Value
encodeToken cred =
Encode.string cred.token
addHeader : Cred -> RequestBuilder a -> RequestBuilder a
addHeader cred builder =
builder
|> withHeader "authorization" ("Token " ++ cred.token)
addHeaderIfAvailable : Maybe Cred -> RequestBuilder a -> RequestBuilder a
addHeaderIfAvailable maybeCred builder =
case maybeCred of
Just cred ->
addHeader cred builder
Nothing ->
builder