95 lines
2.1 KiB
Elm
95 lines
2.1 KiB
Elm
module FieldSet.Rest exposing (..)
|
|
|
|
import Json.Decode as D
|
|
import Json.Encode as E
|
|
import FieldSet.Types exposing (..)
|
|
|
|
|
|
fieldPasswordDecoder : Bool -> FieldValue
|
|
fieldPasswordDecoder present =
|
|
if present then
|
|
FieldPassword PasswordHidden
|
|
else
|
|
FieldPassword PasswordEmpty
|
|
|
|
|
|
badInt : D.Decoder Int
|
|
badInt =
|
|
D.oneOf [ D.int ]
|
|
|
|
|
|
fieldValueDecoder : String -> D.Decoder FieldValue
|
|
fieldValueDecoder fieldType =
|
|
case fieldType of
|
|
"string" ->
|
|
D.map FieldString D.string
|
|
|
|
"password" ->
|
|
D.map fieldPasswordDecoder D.bool
|
|
|
|
"integer" ->
|
|
D.map FieldInteger badInt
|
|
|
|
_ ->
|
|
D.fail ("Unsupported field type: " ++ fieldType)
|
|
|
|
|
|
fieldDecoder : D.Decoder Field
|
|
fieldDecoder =
|
|
(D.field "fieldType" D.string)
|
|
|> D.andThen
|
|
(\fieldType ->
|
|
D.map6 Field
|
|
(D.field "code" D.string)
|
|
(D.field "display" D.string)
|
|
(D.oneOf [ D.field "placeholder" D.string, D.succeed "" ])
|
|
(D.field "required" D.bool)
|
|
(D.field "value" (fieldValueDecoder fieldType))
|
|
(D.field "value" (fieldValueDecoder fieldType))
|
|
)
|
|
|
|
|
|
encodeFieldValue : FieldValue -> E.Value
|
|
encodeFieldValue fieldValue =
|
|
case fieldValue of
|
|
FieldString value ->
|
|
E.string value
|
|
|
|
FieldPassword value ->
|
|
case value of
|
|
Password s ->
|
|
E.string s
|
|
|
|
_ ->
|
|
E.null
|
|
|
|
FieldInteger value ->
|
|
E.int value
|
|
|
|
|
|
maybeString : Maybe String -> E.Value
|
|
maybeString maybeString =
|
|
case maybeString of
|
|
Nothing ->
|
|
E.null
|
|
|
|
Just s ->
|
|
E.string s
|
|
|
|
|
|
encodeField : Field -> Maybe E.Value
|
|
encodeField field =
|
|
if isDirty field then
|
|
Just
|
|
(E.object
|
|
[ ( "code", E.string field.code )
|
|
, ( "value", encodeFieldValue field.value )
|
|
]
|
|
)
|
|
else
|
|
Nothing
|
|
|
|
|
|
isDirty : Field -> Bool
|
|
isDirty field =
|
|
field.value /= field.loadedValue
|