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{}}