Add separate Settings module
parent
5ac3e7eb6a
commit
3e54ea9cbe
3
elm.json
3
elm.json
|
@ -6,7 +6,6 @@
|
|||
"version": "2.0.0",
|
||||
"exposed-modules": [
|
||||
"Matrix",
|
||||
"Matrix.Event",
|
||||
"Matrix.Settings",
|
||||
"Internal.Config.Default",
|
||||
"Internal.Config.Leaks",
|
||||
|
@ -19,7 +18,7 @@
|
|||
"Internal.Tools.VersionControl",
|
||||
"Internal.Values.Context",
|
||||
"Internal.Values.Envelope",
|
||||
"Internal.Values.Event",
|
||||
"Internal.Values.Settings",
|
||||
"Internal.Values.Vault",
|
||||
"Types"
|
||||
],
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
module Internal.Values.Settings exposing
|
||||
( Settings, init
|
||||
, encode, decoder
|
||||
)
|
||||
|
||||
{-|
|
||||
|
||||
|
||||
# Settings
|
||||
|
||||
The Settings module exposes a data type to configure settings in the enveloped
|
||||
data types.
|
||||
|
||||
@docs Settings, init
|
||||
|
||||
|
||||
## JSON coders
|
||||
|
||||
@docs encode, decoder
|
||||
|
||||
-}
|
||||
|
||||
import Internal.Config.Default as Default
|
||||
import Internal.Tools.Decode as D
|
||||
import Internal.Tools.Encode as E
|
||||
import Json.Decode as D
|
||||
import Json.Encode as E
|
||||
|
||||
|
||||
{-| Custom settings that can be manipulated by the user. These serve as a
|
||||
configuration for how the Elm SDK should behave.
|
||||
|
||||
Custom settings are always part of the Envelope, allowing all functions to
|
||||
behave under the user's preferred settings.
|
||||
|
||||
-}
|
||||
type alias Settings =
|
||||
{ currentVersion : String
|
||||
, deviceName : String
|
||||
, syncTime : Int
|
||||
}
|
||||
|
||||
|
||||
{-| Decode settings from a JSON value.
|
||||
-}
|
||||
decoder : D.Decoder Settings
|
||||
decoder =
|
||||
D.map3 Settings
|
||||
(D.opFieldWithDefault "currentVersion" Default.currentVersion D.string)
|
||||
(D.opFieldWithDefault "deviceName" Default.deviceName D.string)
|
||||
(D.opFieldWithDefault "syncTime" Default.syncTime D.int)
|
||||
|
||||
|
||||
{-| Encode the settings into a JSON value.
|
||||
-}
|
||||
encode : Settings -> E.Value
|
||||
encode settings =
|
||||
let
|
||||
differentFrom : b -> b -> Maybe b
|
||||
differentFrom defaultValue currentValue =
|
||||
if currentValue == defaultValue then
|
||||
Nothing
|
||||
|
||||
else
|
||||
Just currentValue
|
||||
in
|
||||
E.maybeObject
|
||||
[ ( "currentVersion"
|
||||
, settings.currentVersion
|
||||
|> differentFrom Default.currentVersion
|
||||
|> Maybe.map E.string
|
||||
)
|
||||
, ( "deviceName"
|
||||
, settings.deviceName
|
||||
|> differentFrom Default.deviceName
|
||||
|> Maybe.map E.string
|
||||
)
|
||||
, ( "syncTime"
|
||||
, settings.syncTime
|
||||
|> differentFrom Default.syncTime
|
||||
|> Maybe.map E.int
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
{-| Create a new Settings module based on default values
|
||||
-}
|
||||
init : Settings
|
||||
init =
|
||||
{ currentVersion = Default.currentVersion
|
||||
, deviceName = Default.deviceName
|
||||
, syncTime = Default.syncTime
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
module Test.Values.Settings exposing (..)
|
||||
|
||||
import Expect
|
||||
import Fuzz exposing (Fuzzer)
|
||||
import Internal.Config.Default as Default
|
||||
import Internal.Values.Settings as Settings exposing (Settings)
|
||||
import Json.Decode as D
|
||||
import Json.Encode as E
|
||||
import Test exposing (..)
|
||||
|
||||
|
||||
fuzzer : Fuzzer Settings
|
||||
fuzzer =
|
||||
Fuzz.map3 Settings
|
||||
(Fuzz.oneOf
|
||||
[ Fuzz.constant Default.currentVersion
|
||||
, Fuzz.string
|
||||
]
|
||||
)
|
||||
(Fuzz.oneOf
|
||||
[ Fuzz.constant Default.deviceName
|
||||
, Fuzz.string
|
||||
]
|
||||
)
|
||||
(Fuzz.oneOf
|
||||
[ Fuzz.constant Default.syncTime
|
||||
, Fuzz.int
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
suite : Test
|
||||
suite =
|
||||
describe "Settings"
|
||||
[ describe "init"
|
||||
[ test "Current version"
|
||||
(Settings.init
|
||||
|> .currentVersion
|
||||
|> Expect.equal Default.currentVersion
|
||||
|> always
|
||||
)
|
||||
, test "Device name"
|
||||
(Settings.init
|
||||
|> .deviceName
|
||||
|> Expect.equal Default.deviceName
|
||||
|> always
|
||||
)
|
||||
, test "Sync time"
|
||||
(Settings.init
|
||||
|> .syncTime
|
||||
|> Expect.equal Default.syncTime
|
||||
|> always
|
||||
)
|
||||
, test "JSON encode init is {}"
|
||||
(Settings.init
|
||||
|> Settings.encode
|
||||
|> E.encode 0
|
||||
|> Expect.equal "{}"
|
||||
|> always
|
||||
)
|
||||
, test "JSON decode {} is init"
|
||||
("{}"
|
||||
|> D.decodeString Settings.decoder
|
||||
|> Expect.equal (Ok Settings.init)
|
||||
|> always
|
||||
)
|
||||
]
|
||||
, describe "JSON"
|
||||
[ fuzz2 fuzzer
|
||||
Fuzz.int
|
||||
"JSON encode -> JSON decode -> identical"
|
||||
(\settings indent ->
|
||||
settings
|
||||
|> Settings.encode
|
||||
|> E.encode indent
|
||||
|> D.decodeString Settings.decoder
|
||||
|> Expect.equal (Ok settings)
|
||||
)
|
||||
]
|
||||
]
|
Loading…
Reference in New Issue