Hi,
I have the following decoder defined:
predicateDecoder : Decoder Predicate
predicateDecoder =
let
caseDecoder : String -> Decoder Predicate
caseDecoder tpe =
case tpe of
"False" ->
Decode.succeed FalseP
"True" ->
Decode.succeed TrueP
"Not" ->
decode Not
|> required "p" predicateDecoder
"And" ->
decode And
|> required "left" predicateDecoder
|> required "right" predicateDecoder
"Or" ->
decode Or
|> required "left" predicateDecoder
|> required "right" predicateDecoder
"DescendantSelector" ->
decode DescendantSelector
|> required "key" nodeKeyDecoder
|> required "predicate" predicateDecoder
"AnswerEquals" ->
decode AnswerEquals
|> required "answer" (Decode.lazy (\_ -> primitiveAnswerDecoder))
"AnswerExists" ->
Decode.succeed AnswerExists
"Exists" ->
decode Exists
|> required "predicate" predicateDecoder
"ForAll" ->
decode ForAll
|> required "predicate" predicateDecoder
_ ->
Decode.fail ("Unexpected Predicate type " ++ tpe)
in
field "type" string
|> andThen caseDecoder
At runtime, when using the decoder in a test, I get the following error:
This test failed because it threw an exception: "TypeError: Cannot read property 'tag' of undefined"
From previous scenarios I know this may happen with recursive decoders, and that the fix is to use lazy
.
The confusing part (to me) is that what is failing is the case:
"AnswerEquals" ->
decode AnswerEquals
|> required "answer" (Decode.lazy (\_ -> primitiveAnswerDecoder))
which is not recursive, and the decoder it calls is final (doesn’t have any recursion within).
I know is this case as if I remove it, code works perfectly. Adding it back, it fails.
I tried to use lazy
to fix it, as you can see, but to no avail.
Any ideas on why is this happening with a non-recursive branch, and any suggestion on how to fix it?