rtfeldman / elm-spa-example

A Single Page Application written in Elm
https://dev.to/rtfeldman/tour-of-an-open-source-elm-spa
MIT License
3.28k stars 530 forks source link

Don't use catch-all in main update - not a recommended way to code in Elm #81

Open amilner42 opened 5 years ago

amilner42 commented 5 years ago

Very easy fix to make the code more elm-like (aka the compiler more helpful).

You currently do

( _, _ ) ->
            -- Disregard messages that arrived for the wrong page.
            ( model, Cmd.none )

When someone adds a new page though, it will fall into this case, which is clearly not what we want. We want the compiler to force us to add it. To achieve this, it's better to instead do:

( GotEditorMsg subMsg, Editor slug editor ) ->
    Editor.update subMsg editor
        |> updateWith (Editor slug) GotEditorMsg model

( GotEditorMsg _, _ ) ->
    (model, Cmd.none)

( GotArticleMsg subMsg, Article article ) ->
     Article.update subMsg article
        |> updateWith Article GotArticleMsg model

( GotArticleMsg _, _) ->
    (model, Cmd.none)

etc.

It is more verbose but definitely more elm-like. Now if someone adds GotXMsg the compiler will tell them that they are missing a case, go elm 😃 I think it's also valuable to set an example given this repo is used as a reference for how to code in Elm by many people new to Elm.