This is a classic case for Json.Decode.andthen
e.g. (untested)
import Json.Decode exposing (...)
decodeRecordType : Decoder RecordType
decodeRecordType =
(at ["type", "name"] string)
|> andThen decodeRecordTypeDetails
decodeRecordTypeDetails : String -> Decoder RecordType
decodeRecordTypeDetails name =
case name of
"bed" -> decodeBed
"chair" -> decodeChair
"stool" -> succeed Stool
_ -> fail ("unknown record type: " ++ name)