Files
elm-0.19-workshop/part8/src/Data/User.elm
Richard Feldman fecc3fe291 Update part8
2018-05-05 07:17:21 -04:00

78 lines
1.8 KiB
Elm

module Data.User exposing (User, Username, decoder, encode, usernameDecoder, usernameParser, usernameToHtml, usernameToString)
import Data.AuthToken as AuthToken exposing (AuthToken)
import Data.UserPhoto as UserPhoto exposing (UserPhoto)
import Html exposing (Html)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline exposing (decode, optional, required)
import Json.Encode as Encode exposing (Value)
import Json.Encode.Extra as EncodeExtra
import UrlParser
type alias User =
{ email : String
, token : AuthToken
, username : Username
, bio : Maybe String
, image : UserPhoto
}
-- SERIALIZATION --
decoder : Decoder User
decoder =
decode User
|> required "email" Decode.string
|> required "token" AuthToken.decoder
|> required "username" usernameDecoder
|> required "bio" (Decode.nullable Decode.string)
|> required "image" UserPhoto.decoder
encode : User -> Value
encode user =
Encode.object
[ ( "email", Encode.string user.email )
, ( "token", AuthToken.encode user.token )
, ( "username", encodeUsername user.username )
, ( "bio", EncodeExtra.maybe Encode.string user.bio )
, ( "image", UserPhoto.encode user.image )
]
-- IDENTIFIERS --
type Username
= Username String
usernameToString : Username -> String
usernameToString (Username username) =
username
usernameParser : UrlParser.Parser (Username -> a) a
usernameParser =
UrlParser.custom "USERNAME" (Ok << Username)
usernameDecoder : Decoder Username
usernameDecoder =
Decode.map Username Decode.string
encodeUsername : Username -> Value
encodeUsername (Username username) =
Encode.string username
usernameToHtml : Username -> Html msg
usernameToHtml (Username username) =
Html.text username