def parse_machine

qasim-bend-kit@0.1.0.2 · libs/JSON.bend:697

import qasim-bend-kit@0.1.0.2/libs/JSON.bend as JSON
import Base

697def parse_machine(fuel: Nat, state: ParserState) -> Result<&1, &1, Error, Parsed>:
698    match fuel:
699        case 0n:
700            Fail{Error{}}
701        case 1n+p:
702            match state:
703                case Complete{parsed}:
704                    Done{parsed}
705                case ParseValue{+clean, +kont}:
706                    match clean:
707                        case SNil{}:
708                            Fail{Error{}}
709                        case SCon{+h, +t}:
710                            match h:
711                                case 'n':
712                                    parse_machine(p, ParsedResult{null_token(clean, String.starts_with(clean, "null")), kont})
713                                case 't':
714                                    parse_machine(p, ParsedResult{true_token(clean, String.starts_with(clean, "true")), kont})
715                                case 'f':
716                                    parse_machine(p, ParsedResult{false_token(clean, String.starts_with(clean, "false")), kont})
717                                case '"':
718                                    +budget = p
719                                    parse_machine(budget, StringResult{scan_string_machine(budget, ScanText{t, SNil{}}), kont})
720                                case '[':
721                                    parse_machine(p, ArrayStart{whitespace(t), Nil{}, True{}, kont})
722                                case '{':
723                                    parse_machine(p, ObjectStart{whitespace(t), Nil{}, True{}, kont})
724                                case '-':
725                                    parse_machine(p, ParsedResult{parse_number(clean), kont})
726                                case _:
727                                    parse_machine(p, ParsedResult{number_from_digit(clean, Char.is_digit(h)), kont})
728                case ParsedResult{result, kont}:
729                    match result:
730                        case Fail{e}:
731                            Fail{e}
732                        case Done{parsed}:
733                            match parsed:
734                                case Parsed{value, rest}:
735                                    parse_machine(p, resume_value(value, rest, kont))
736                case StringResult{result, kont}:
737                    match result:
738                        case Fail{e}:
739                            Fail{e}
740                        case Done{scan}:
741                            match scan:
742                                case StringScan{value, rest}:
743                                    parse_machine(p, resume_value(Str{value}, rest, kont))
744                case ArrayStart{clean, acc, empty_allowed, kont}:
745                    match clean:
746                        case SNil{}:
747                            Fail{Error{}}
748                        case SCon{h, t}:
749                            match h:
750                                case ']':
751                                    match empty_allowed:
752                                        case True{}:
753                                            parse_machine(p, resume_value(Arr{List.reverse(&2, Value, acc)}, t, kont))
754                                        case False{}:
755                                            Fail{Error{}}
756                                case _:
757                                    parse_machine(p, ParseValue{clean, InArray{acc, kont}})
758                case ArrayAfter{value, clean, acc, kont}:
759                    match clean:
760                        case SNil{}:
761                            Fail{Error{}}
762                        case SCon{h, t}:
763                            match h:
764                                case ']':
765                                    parse_machine(p, resume_value(Arr{List.reverse(&2, Value, value <> acc)}, t, kont))
766                                case ',':
767                                    parse_machine(p, ArrayStart{whitespace(t), value <> acc, False{}, kont})
768                                case _:
769                                    Fail{Error{}}
770                case ObjectStart{clean, acc, empty_allowed, kont}:
771                    match clean:
772                        case SNil{}:
773                            Fail{Error{}}
774                        case SCon{h, t}:
775                            match h:
776                                case '}':
777                                    match empty_allowed:
778                                        case True{}:
779                                            parse_machine(p, resume_value(Obj{List.reverse(&2, Sigma<&2, &2, String, key => Value>, acc)}, t, kont))
780                                        case False{}:
781                                            Fail{Error{}}
782                                case '"':
783                                    +budget = p
784                                    parse_machine(budget, ObjectKey{scan_string_machine(budget, ScanText{t, SNil{}}), acc, kont})
785                                case _:
786                                    Fail{Error{}}
787                case ObjectKey{result, acc, kont}:
788                    match result:
789                        case Fail{e}:
790                            Fail{e}
791                        case Done{scan}:
792                            match scan:
793                                case StringScan{key, rest}:
794                                    parse_machine(p, ObjectColon{key, whitespace(rest), acc, kont})
795                case ObjectColon{key, clean, acc, kont}:
796                    match clean:
797                        case SNil{}:
798                            Fail{Error{}}
799                        case SCon{h, t}:
800                            match h:
801                                case ':':
802                                    parse_machine(p, ParseValue{whitespace(t), InObject{key, acc, kont}})
803                                case _:
804                                    Fail{Error{}}
805                case ObjectAfter{key, value, clean, acc, kont}:
806                    match clean:
807                        case SNil{}:
808                            Fail{Error{}}
809                        case SCon{h, t}:
810                            match h:
811                                case '}':
812                                    parse_machine(p, resume_value(Obj{List.reverse(&2, Sigma<&2, &2, String, key => Value>, (key, value) <> acc)}, t, kont))
813                                case ',':
814                                    parse_machine(p, ObjectStart{whitespace(t), (key, value) <> acc, False{}, kont})
815                                case _:
816                                    Fail{Error{}}

Uses (28)

Used by (1)