/
Settings.elm
89 lines (63 loc) · 1.8 KB
/
Settings.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
module Settings exposing
( Settings, decoder, encode, init
, insertSync, removeSync, updateRevision
, id, idDecoder
)
{-|
@docs Settings, decoder, encode, init
@docs insertSync, removeSync, updateRevision
@docs id, idDecoder
-}
import PouchDB.Sync as Sync exposing (Sync)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline as Pipeline exposing (required)
import Json.Encode as Encode
type alias Settings =
{ revision : Maybe String
, syncs : List Sync
}
init : Settings
init =
{ revision = Nothing
, syncs = []
}
decoder : Decoder Settings
decoder =
Decode.succeed Settings
|> required "_rev" (Decode.map Just Decode.string)
|> required "syncs" (Decode.list Sync.decoder)
idDecoder : Decoder ()
idDecoder =
Decode.andThen
(\idString ->
if idString == id then
Decode.succeed ()
else
Decode.fail ("Bad ID for settings: " ++ idString)
)
Decode.string
encode : Settings -> Encode.Value
encode settings =
Encode.object
[ ( "_id", Encode.string id )
, ( "_rev"
, case settings.revision of
Just revision ->
Encode.string revision
Nothing ->
Encode.null
)
, ( "syncs", Encode.list Sync.encode settings.syncs )
]
insertSync : Sync -> Settings -> Settings
insertSync sync settings =
{ settings | syncs = sync :: settings.syncs }
removeSync : Sync -> Settings -> Settings
removeSync sync settings =
{ settings | syncs = List.filter ((/=) sync) settings.syncs }
updateRevision : String -> Settings -> Settings
updateRevision revision settings =
{ settings | revision = Just revision }
id : String
id =
"_local/settings"