Check in the fully inlined version of record decoder

This commit is contained in:
Ayaz Hafiz 2022-08-12 15:40:00 -07:00
parent c34427bbf9
commit fd52075a6f
No known key found for this signature in database
GPG Key ID: 0E2A37416A25EF58

View File

@ -3,34 +3,43 @@ app "helloWorld"
imports [Decode, Decode.{Decoder, Decoding, DecoderFormatting}, Json]
provides [main] to pf
theDecoder : Decoder {first: a, second: b} fmt | a has Decoding, b has Decoding, fmt has DecoderFormatting
theDecoder =
initialState : {f0: Result a [NoField], f1: Result b [NoField]}
initialState = {f0: Err NoField, f1: Err NoField}
stepField = \state, field ->
when field is
"first" ->
Keep (Decode.custom \bytes, fmt ->
when Decode.decodeWith bytes Decode.decoder fmt is
{result, rest} ->
{result: Result.map result \val -> {state & f0: Ok val}, rest})
"second" ->
Keep (Decode.custom \bytes, fmt ->
when Decode.decodeWith bytes Decode.decoder fmt is
{result, rest} ->
{result: Result.map result \val -> {state & f1: Ok val}, rest})
_ -> Skip
finalizer = \{f0, f1} ->
when f0 is
Ok first ->
when f1 is
Ok second -> Ok {first, second}
Err NoField -> Err TooShort
Err NoField -> Err TooShort
Decode.custom \bytes, fmt -> Decode.decodeWith bytes (Decode.record initialState stepField finalizer) fmt
Decode.custom \bytes, fmt ->
Decode.decodeWith
bytes
(Decode.record
{f0: Err NoField, f1: Err NoField}
(\state, field ->
when field is
"first" ->
Keep (Decode.custom \bytes1, fmt1 ->
when Decode.decodeWith bytes1 Decode.decoder fmt1 is
rec ->
{
result: (when rec.result is
Ok val -> Ok {state & f0: Ok val}
Err e -> Err e),
rest: rec.rest
})
"second" ->
Keep (Decode.custom \bytes1, fmt1 ->
when Decode.decodeWith bytes1 Decode.decoder fmt1 is
rec ->
{
result: (when rec.result is
Ok val -> Ok {state & f1: Ok val}
Err e -> Err e),
rest: rec.rest
})
_ -> Skip)
(\stateRecord ->
when stateRecord.f0 is
Ok first ->
when stateRecord.f1 is
Ok second -> Ok {first, second}
Err NoField -> Err TooShort
Err NoField -> Err TooShort))
fmt
main =
when Str.toUtf8 "{\"first\":\"ab\",\"second\":[\"cd\",\"ef\"]}" |> Decode.decodeWith theDecoder Json.fromUtf8 is