module Playlists.Encoding exposing (decoder, encode, encodePlaylistTrack, playlistTrackDecoder) import Json.Decode as Decode import Json.Decode.Ext as Decode import Json.Encode as Encode import Json.Encode.Ext exposing (..) import Playlists exposing (..) import Time.Ext as Time -- ENCODE encode : Playlist -> Encode.Value encode playlist = Encode.object [ ( "autoGenerated" , case playlist.autoGenerated of Just { level } -> Encode.object [ ( "level", Encode.int level ) ] Nothing -> Encode.null ) , ( "collection", Encode.bool playlist.collection ) , ( "name", Encode.string playlist.name ) , ( "public", Encode.bool playlist.public ) , ( "tracks", Encode.list encodePlaylistTrack playlist.tracks ) ] encodePlaylistTrack : PlaylistTrack -> Encode.Value encodePlaylistTrack playlistTrack = Encode.object [ ( "album", encodeMaybe playlistTrack.album Encode.string ) , ( "artist", encodeMaybe playlistTrack.artist Encode.string ) , ( "title", Encode.string playlistTrack.title ) -- , ( "insertAt", Time.encode playlistTrack.insertedAt ) ] -- DECODE decoder : Decode.Decoder Playlist decoder = Decode.map5 Playlist (Decode.field "autoGenerated" <| Decode.maybe <| Decode.map (\l -> { level = l }) <| Decode.field "level" Decode.int) (Decode.optionalField "collection" Decode.bool False) (Decode.field "name" Decode.string) (Decode.optionalField "public" Decode.bool False) (Decode.field "tracks" <| Decode.list playlistTrackDecoder) playlistTrackDecoder : Decode.Decoder PlaylistTrack playlistTrackDecoder = Decode.map4 PlaylistTrack (Decode.maybe <| Decode.field "album" Decode.string) (Decode.maybe <| Decode.field "artist" Decode.string) (Decode.field "title" Decode.string) (Decode.optionalField "insertedAt" Time.decoder Time.default)