Recursive Json decoder fails on non-recursive branch?

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?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.