def scan_string_machine

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

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

415def scan_string_machine(fuel: Nat, state: StringScanState) -> Result<&1, &1, Error, StringScan>:
416    match fuel:
417        case 0n:
418            Fail{Error{}}
419        case 1n+p:
420            match state:
421                case ScanText{input, reversed}:
422                    match input:
423                        case SNil{}:
424                            Fail{Error{}}
425                        case SCon{+h, +t}:
426                            match h:
427                                case '"':
428                                    Done{StringScan{String.reverse(reversed), t}}
429                                case '\\':
430                                    match t:
431                                        case SNil{}:
432                                            Fail{Error{}}
433                                        case SCon{e, et}:
434                                            match e:
435                                                case '"': scan_string_machine(p, ScanText{et, SCon{'"', reversed}})
436                                                case '\\': scan_string_machine(p, ScanText{et, SCon{'\\', reversed}})
437                                                case '/': scan_string_machine(p, ScanText{et, SCon{'/', reversed}})
438                                                case 'b': scan_string_machine(p, ScanText{et, SCon{'\u{8}', reversed}})
439                                                case 'f': scan_string_machine(p, ScanText{et, SCon{'\u{c}', reversed}})
440                                                case 'n': scan_string_machine(p, ScanText{et, SCon{'\n', reversed}})
441                                                case 'r': scan_string_machine(p, ScanText{et, SCon{'\r', reversed}})
442                                                case 't': scan_string_machine(p, ScanText{et, SCon{'\t', reversed}})
443                                                case 'u': scan_string_machine(p, ScanUnicode{scan_hex(4n, et, 0), reversed})
444                                                case _: Fail{Error{}}
445                                case _:
446                                    scan_string_machine(p, ScanControl{h, t, reversed, is_control(h)})
447                case ScanControl{character, rest, reversed, control}:
448                    match control:
449                        case True{}:
450                            Fail{Error{}}
451                        case False{}:
452                            scan_string_machine(p, ScanText{rest, SCon{character, reversed}})
453                case ScanUnicode{parsed, reversed}:
454                    match parsed:
455                        case Fail{e}:
456                            Fail{e}
457                        case Done{scan}:
458                            match scan:
459                                case HexScan{+code, +rest}:
460                                    scan_string_machine(p, ScanUnicodeHigh{code, rest, reversed, U32.is_ge(code, 55296) && U32.is_le(code, 56319)})
461                case ScanUnicodeHigh{code, +rest, +reversed, is_high}:
462                    match rest:
463                        case SCon{'\\', SCon{'u', t}}:
464                            match is_high:
465                                case True{}:
466                                    scan_string_machine(p, ScanUnicodeLow{code, rest, scan_hex(4n, t, 0), reversed})
467                                case False{}:
468                                    scan_string_machine(p, ScanText{rest, SCon{Char.from_u32(code), reversed}})
469                        case _:
470                            scan_string_machine(p, ScanText{rest, SCon{Char.from_u32(code), reversed}})
471                case ScanUnicodeLow{high, original, parsed, reversed}:
472                    match parsed:
473                        case Fail{e}:
474                            scan_string_machine(p, ScanText{original, SCon{Char.from_u32(high), reversed}})
475                        case Done{scan}:
476                            match scan:
477                                case HexScan{+low, +rest}:
478                                    scan_string_machine(p, ScanUnicodeLowClass{high, low, rest, original, reversed, U32.is_ge(low, 56320) && U32.is_le(low, 57343)})
479                case ScanUnicodeLowClass{high, low, rest, original, reversed, valid}:
480                    match valid:
481                        case True{}:
482                            scan_string_machine(p, ScanText{rest, SCon{Char.from_u32((65536 + (high - 55296) * 1024 + (low - 56320) : U32)), reversed}})
483                        case False{}:
484                            scan_string_machine(p, ScanText{original, SCon{Char.from_u32(high), reversed}})

Uses (22)

Used by (2)