1module Playlists.Encoding exposing (decoder, encode, encodePlaylistTrack, playlistTrackDecoder)
2
3import Json.Decode as Decode
4import Json.Decode.Ext as Decode
5import Json.Encode as Encode
6import Json.Encode.Ext exposing (..)
7import Playlists exposing (..)
8import Time.Ext as Time
9
10
11
12-- ENCODE
13
14
15encode : Playlist -> Encode.Value
16encode playlist =
17 Encode.object
18 [ ( "autoGenerated"
19 , case playlist.autoGenerated of
20 Just { level } ->
21 Encode.object
22 [ ( "level", Encode.int level ) ]
23
24 Nothing ->
25 Encode.null
26 )
27 , ( "collection", Encode.bool playlist.collection )
28 , ( "name", Encode.string playlist.name )
29 , ( "public", Encode.bool playlist.public )
30 , ( "tracks", Encode.list encodePlaylistTrack playlist.tracks )
31 ]
32
33
34encodePlaylistTrack : PlaylistTrack -> Encode.Value
35encodePlaylistTrack playlistTrack =
36 Encode.object
37 [ ( "album", encodeMaybe playlistTrack.album Encode.string )
38 , ( "artist", encodeMaybe playlistTrack.artist Encode.string )
39 , ( "title", Encode.string playlistTrack.title )
40
41 --
42 , ( "insertAt", Time.encode playlistTrack.insertedAt )
43 ]
44
45
46
47-- DECODE
48
49
50decoder : Decode.Decoder Playlist
51decoder =
52 Decode.map5 Playlist
53 (Decode.field "autoGenerated" <| Decode.maybe <| Decode.map (\l -> { level = l }) <| Decode.field "level" Decode.int)
54 (Decode.optionalField "collection" Decode.bool False)
55 (Decode.field "name" Decode.string)
56 (Decode.optionalField "public" Decode.bool False)
57 (Decode.field "tracks" <| Decode.list playlistTrackDecoder)
58
59
60playlistTrackDecoder : Decode.Decoder PlaylistTrack
61playlistTrackDecoder =
62 Decode.map4 PlaylistTrack
63 (Decode.maybe <| Decode.field "album" Decode.string)
64 (Decode.maybe <| Decode.field "artist" Decode.string)
65 (Decode.field "title" Decode.string)
66 (Decode.optionalField "insertedAt" Time.decoder Time.default)