Skip to content

Instantly share code, notes, and snippets.

@ethagnawl
Created February 12, 2019 18:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ethagnawl/9844446f662e43f7a77345d89426d962 to your computer and use it in GitHub Desktop.
Save ethagnawl/9844446f662e43f7a77345d89426d962 to your computer and use it in GitHub Desktop.
non-trivial elm decode example
-- adding example here for posterity's sake
-- original example can be found at: https://ellie-app.com/jHzNw9Qjqca1
-- source material can be found at: https://developing.enectiva.cz/2017/05/31/custom-flags-decoder-in-elm/
module Main exposing (main)
import Html exposing (Html, text, programWithFlags)
import Json.Decode
type alias Model =
{ meters : List Meter
, locale : String
}
type alias Flags =
{ meters : Json.Decode.Value
, locale : String
}
type alias Meter =
{ id : Int
, name : String
, energy : Energy
}
type Energy
= El
| Wa
main : Program Flags Model msg
main =
programWithFlags
{ init = init
, update = (\_ model -> model ! [])
, subscriptions = (\_ -> Sub.none)
, view = (\model -> text <| toString model)
}
init : Flags -> ( Model, Cmd msg )
init flags =
case Json.Decode.decodeValue metersDecoder flags.meters of
Ok meters ->
{ meters = meters, locale = flags.locale } ! []
Err err ->
Debug.crash err
metersDecoder : Json.Decode.Decoder (List Meter)
metersDecoder =
Json.Decode.list meterDecoder
meterDecoder : Json.Decode.Decoder Meter
meterDecoder =
Json.Decode.map3 Meter
(Json.Decode.field "id" Json.Decode.int)
(Json.Decode.field "name" Json.Decode.string)
(Json.Decode.field "energy" decodeEnergy)
decodeEnergy : Json.Decode.Decoder Energy
decodeEnergy =
Json.Decode.string
|> Json.Decode.andThen
(\s ->
case s of
"el" ->
Json.Decode.succeed El
"wa" ->
Json.Decode.succeed Wa
_ ->
Json.Decode.fail ("Unrecognized energy " ++ s)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment