This is my attempt to decode keys but get warning when some key is not handled. Full example https://ellie-app.com/mxkGY5DVFa1/0.
Running this code will give this in browser console: [Warning]: I ran into a
faildecoder: Unhandled field somefield: { url = "", amount = 0 }
Thanks @jessta for pointing to keyValuePairs
. The code is base on this http://folkertdev.nl/blog/elm-messy-json-value/.
How can I make this more generic (less MyRecord
) so I can reuse more code?
What can be improved, done differently?
module Main exposing (main)
import Html exposing (Html, text)
import Json.Decode exposing (..)
(|:) : Decoder (a -> b) -> Decoder a -> Decoder b
(|:) =
map2 (<|)
serverResponseMy : String
serverResponseMy =
"""
{
"url": "https://elm-lang.org",
"amount": 1.2,
"somefield": 1
}
"""
partialDecodeField : Decoder (List ( String, Value ))
partialDecodeField =
keyValuePairs value
fromResultWithWarning : (String -> b -> Decoder b) -> ( String, Value ) -> b -> b
fromResultWithWarning decoder ( name, value ) record =
case decodeValue (decoder name record) value of
Ok newRecord ->
newRecord
Err error ->
Debug.log ("[Warning]: " ++ error) record
feedNameL : (String -> MyRecord -> Decoder MyRecord) -> List ( String, Value ) -> MyRecord
feedNameL decoder elements =
List.foldl (fromResultWithWarning decoder) defaultMyRecord elements
decodeList : Decoder MyRecord
decodeList =
map (feedNameL decodeField) partialDecodeField
decodeField : String -> MyRecord -> Decoder MyRecord
decodeField name record =
case name of
"url" ->
succeed (\url -> { record | url = url }) |: string
"amount" ->
succeed (\amount -> { record | amount = amount }) |: float
_ ->
fail <| "Unhandled field " ++ name
type alias MyRecord =
{ url : String
, amount : Float
}
defaultMyRecord : MyRecord
defaultMyRecord =
MyRecord "" 0
main : Html msg
main =
text <| toString <| decodeString decodeList serverResponseMy