Add part7

This commit is contained in:
Richard Feldman
2018-05-05 04:54:47 -04:00
parent f6bef58e3d
commit 825dea437b
575 changed files with 79140 additions and 0 deletions

77
part7/src/Data/User.elm Normal file
View File

@@ -0,0 +1,77 @@
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