1module Sources.Encoding exposing (decode, decoder, encode, encodeData, serviceDecoder)
2
3{-| Encoding.
4-}
5
6import Dict
7import Json.Decode as Decode
8import Json.Encode as Encode
9import Sources exposing (..)
10import Sources.Services as Services
11
12
13
14-- ENCODE
15
16
17encode : Source -> Encode.Value
18encode source =
19 Encode.object
20 [ ( "id", Encode.string source.id )
21 , ( "data", encodeData source.data )
22 , ( "directoryPlaylists", Encode.bool source.directoryPlaylists )
23 , ( "enabled", Encode.bool source.enabled )
24 , ( "service", Encode.string (Services.typeToKey source.service) )
25 ]
26
27
28encodeData : SourceData -> Encode.Value
29encodeData data =
30 data
31 |> Dict.toList
32 |> List.map (Tuple.mapSecond Encode.string)
33 |> Encode.object
34
35
36
37-- DECODE
38
39
40decode : Decode.Value -> Maybe Source
41decode value =
42 value
43 |> Decode.decodeValue decoder
44 |> Result.toMaybe
45
46
47decoder : Decode.Decoder Source
48decoder =
49 Decode.map5 Source
50 (Decode.field "id" Decode.string)
51 (Decode.field "data" (Decode.dict Decode.string))
52 (Decode.field "directoryPlaylists" Decode.bool
53 |> Decode.maybe
54 |> Decode.map (Maybe.withDefault True)
55 )
56 (Decode.field "enabled" Decode.bool
57 |> Decode.maybe
58 |> Decode.map (Maybe.withDefault True)
59 )
60 (Decode.field "service" serviceDecoder)
61
62
63serviceDecoder : Decode.Decoder Service
64serviceDecoder =
65 Decode.andThen
66 (\key ->
67 case Services.keyToType key of
68 Just service ->
69 Decode.succeed service
70
71 Nothing ->
72 Decode.fail "Unrecognizable source service"
73 )
74 Decode.string