Slide 54
Slide 54 text
第 3 章 Elm + Haskell で作る Web アプリ (2019 年度編) 3.3 サーバサイドを作る
便利!
問題の答えを受け取る
さて、あとは⽣成したコードを Elm 側で呼んであげれば良いだけです。適切な Msg 型の値を追加
し、init 関数や update 関数で呼んであげるだけです (view 関数の部分は割愛)。
init : Config -> ( Model, Cmd Msg )
init config =
( Model config Nothing "" [] Puzzle.empty Nothing
-- ページを開いたときに可能な⽂字列⻑を取得
, API.getApiSizes FetchWordSizes
)
type Msg
... -- 割愛
| FetchWordSizes (Result Http.Error (List Int))
| FetchAnswer (Result Http.Error String)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
-- model.puzzle.start はパズルゲームがスタートしてるかどうか
case (model.puzzle.start, msg) of
-- カメラを起動したらパズルゲームスタート
(False, EnableCamera) ->
( { model | puzzle = Puzzle.start model.puzzle }
, Cmd.batch
[ QRCode.startCamera ()
-- パズルゲームをスタートするときにランダムな答えを取得
, API.getApiProblem (Puzzle.size model.puzzle) FetchAnswer
]
)
(False, FetchWordSizes (Ok sizes)) ->
({ model | sizes = sizes }, Cmd.none)
(False, FetchWordSizes (Err err)) ->
({ model | error = "can’t fetch sizes: " ++ httpErrorToString err }, Cmd.none)
(True, FetchAnswer (Ok "") ) ->
({ model | error = "problem not found." }, Cmd.none)
(True, FetchAnswer (Ok answer)) ->
(model, Puzzle.shuffle ShufflePuzzle (Puzzle.init answer model.puzzle))
(True, FetchAnswer (Err err)) ->
({ model | error = "can’t fetch problem: " ++ httpErrorToString err }, Cmd.none)
... -- 割愛
46