module Model.InitResult exposing
  ( InitResult(..)
  , initResultDecoder
  )

import Json.Decode as Decode exposing (Decoder)

import Model.Init exposing (Init, initDecoder)

type InitResult =
  InitEmpty
  | InitSuccess Init
  | InitError String

initResultDecoder : Decoder InitResult
initResultDecoder = (Decode.field "tag" Decode.string) |> Decode.andThen initResultDecoderWithTag

initResultDecoderWithTag : String -> Decoder InitResult
initResultDecoderWithTag tag =
  case tag of
    "InitEmpty" ->
      Decode.succeed InitEmpty
    "InitSuccess" ->
      Decode.map InitSuccess (Decode.field "contents" initDecoder)
    "InitError" ->
      Decode.map InitError (Decode.field "contents" Decode.string)
    _ ->
      Decode.fail <| "got " ++ tag ++ " for InitResult"