A music player that connects to your cloud/distributed storage.
at main 2.1 kB view raw
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)