Изящная обработка недостающих ключей в Flags в Elm

Мое приложение получает значения модели инициализации из localstorage через флаги. Я добавил в модель новый ключ, и это вызывает ошибку при запуске приложения Elm из-за отсутствия ключа («полоски») в значении, переданном через флаги. Учитывая, что в будущем могут быть добавлены новые ключи, и я не хочу, чтобы мне приходилось очищать локальное хранилище каждый раз, когда это происходит, есть ли способ сказать Элму назначить значение по умолчанию, когда во флаге отсутствует ключ?

type alias Model =
    { foo : String, bar : Int }

update : msg -> Model -> ( Model, Cmd msg )
update _ model =
    model ! []

view : Model -> Html msg
view model =
    text <| toString model

main : Program Flags Model msg
main =
    Html.programWithFlags
        { init = init
        , update = update
        , view = view
        , subscriptions = always Sub.none
        }

HTML код

<body>
  <script>
    var app = Elm.Main.fullscreen({foo: "abc"})
  </script>
</body>

person Jason O.    schedule 07.10.2017    source источник


Ответы (1)


Вот отличное решение, любезно предоставленное @ilias на канале Elm Slack.

https://ellie-app.com/mWrNyQWYBa1/0

module Main exposing (main)

import Html exposing (Html, text)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Extra as Decode  --"elm-community/json-extra"


type alias Model =
    { foo : String, bar : Int }


flagsDecoder : Decoder Model
flagsDecoder =
    Decode.map2 Model
        (Decode.field "foo" Decode.string |> Decode.withDefault "hello")
        (Decode.field "bar" Decode.int |> Decode.withDefault 12)


init : Decode.Value -> ( Model, Cmd msg )
init flags =
    case Decode.decodeValue flagsDecoder flags of
        Err _ ->
            Debug.crash "gracefully handle complete failure"

        Ok model ->
            ( model, Cmd.none )


update : msg -> Model -> ( Model, Cmd msg )
update _ model =
    model ! []


view : Model -> Html msg
view model =
    text <| toString model


main : Program Decode.Value Model msg
main =
    Html.programWithFlags
        { init = init
        , update = update
        , view = view
        , subscriptions = always Sub.none
        }

HTML

<body>
  <script>
    var app = Elm.Main.fullscreen({foo: "abc"})
  </script>
</body>
person Jason O.    schedule 07.10.2017