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