json.bend checks
raw source on the hub · import 0x6bcc5639f884b922a3ea766a6acc017c/json.bend as Json
json.bend: A production-grade, highly reusable JSON library for Bend 2. Compliant with RFC 8259 (JSON specification) and RFC 6901 (JSON Pointer).
Supports: - Full JSON AST: Null, Bool, Number (Pos Nat, Neg Nat), String, Array, Object - Full RFC 8259 character escaping and unescaping - Safe type guards and typed value unwrapping - Comprehensive Object operations: get, has, set, remove, obj_len, keys, values, entries, merge, sort_keys - Functional Array combinators: arr_len, arr_get, arr_push, arr_set, arr_pop, arr_remove, arr_insert, arr_map, arr_filter, arr_fold - Ergonomic typed field extractors with fallback defaults: get_str, get_num, get_bool, etc. - RFC 6901 JSON Pointer queries and deep path updates: pointer, pointer_set - High-performance compact serialization: stringify - Configurable pretty printing with arbitrary indentation: pretty, pretty_indent - Streaming NDJSON (Newline Delimited JSON): parse_ndjson, stringify_ndjson - Fast JSON validation: validate - Linear recursive-descent parser: parse
1 import
import Base
Types
type Json source · line 24 · raw
Data
JNullJson
JBool@val:Bool -> Json
JNum@val:Nat -> Json
JNeg@val:Nat -> Json
JStr@val:String -> Json
JArr@vals:List<&2, Json> -> Json
JObj@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Json
type Frame source · line 34 · raw
Data
Parser stack frames
FArr@items:List<&2, Json> -> Frame
FObjVal@key:String -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Frame
type StrCharKind source · line 39 · raw
Data
String parser types
SCQuoteStrCharKind
SCSlashStrCharKind
SCOtherStrCharKind
type StrRes source · line 44 · raw
Data
SErr@msg:String -> StrRes
SOk@val:String -> @rest:String -> StrRes
type StrState source · line 48 · raw
Data
StrNormalStrState
StrEscapingStrState
StrChar@kind:StrCharKind -> @c:U32 -> StrState
type PtrUnescState source · line 53 · raw
Data
PUNormalPtrUnescState
PUTildePtrUnescState
PUChar@is_tilde:Bool -> @c:U32 -> PtrUnescState
PUTildeChar@is_one:Bool -> @is_zero:Bool -> @c:U32 -> PtrUnescState
type PtrSplitState source · line 59 · raw
Data
PSNormalPtrSplitState
PSChar@is_slash:Bool -> @c:U32 -> PtrSplitState
type NatState source · line 63 · raw
Data
NParseDigitsNatState
NCheckDigit@is_d:Bool -> @c:U32 -> NatState
type LineSplitState source · line 67 · raw
Data
LSNormalLineSplitState
LSCheckNl@is_nl:Bool -> @c:U32 -> LineSplitState
LSEmpty@is_empty:Bool -> @line:String -> LineSplitState
type NumRes source · line 73 · raw
Data
Number parser result
NRes@val:Nat -> @rest:String -> NumRes
type CharKind source · line 77 · raw
Data
General character classification
KindLBracketCharKind
KindRBracketCharKind
KindLBraceCharKind
KindRBraceCharKind
KindQuoteCharKind
KindCommaCharKind
KindColonCharKind
KindNullCharKind
KindTrueCharKind
KindFalseCharKind
KindMinusCharKind
KindDigitCharKind
KindOtherCharKind
type StepAct source · line 93 · raw
Data
Parser state machine actions
ActValStartStepAct
ActValChar@kind:CharKind -> @c:U32 -> StepAct
ActArrOpenStepAct
ActArrOpenChar@kind:CharKind -> @c:U32 -> StepAct
ActArrNext@v:Json -> @items:List<&2, Json> -> StepAct
ActArrNextChar@kind:CharKind -> @v:Json -> @items:List<&2, Json> -> StepAct
ActObjOpenStepAct
ActObjOpenChar@kind:CharKind -> @c:U32 -> StepAct
ActKeyStart@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActKeyStartChar@kind:CharKind -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActKeyParsed@res:StrRes -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActColon@key:String -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActColonChar@kind:CharKind -> @key:String -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActObjNext@key:String -> @v:Json -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActObjNextChar@kind:CharKind -> @key:String -> @v:Json -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> StepAct
ActHaveVal@v:Json -> StepAct
ActCheckEof@v:Json -> StepAct
ActStrParsed@res:StrRes -> StepAct
ActNumParsed@neg_flag:Bool -> @res:NumRes -> StepAct
ActLitCheck@expected:String -> @val:Json -> @ok:Bool -> @rest:String -> StepAct
type PrintTask source · line 116 · raw
Data
Serializer stack task
PVal@j:Json -> PrintTask
PArr@items:List<&2, Json> -> PrintTask
PObj@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> PrintTask
PLit@s:String -> PrintTask
type PrettyTask source · line 123 · raw
Data
Pretty printer stack task
PrVal@j:Json -> @indent:Nat -> PrettyTask
PrArr@items:List<&2, Json> -> @indent:Nat -> PrettyTask
PrObj@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @indent:Nat -> PrettyTask
PrLit@s:String -> PrettyTask
type DigitsState source · line 1152 · raw
Data
DStartDigitsState
DChar@is_d:Bool -> @code:U32 -> DigitsState
Definitions
def null source · line 133 · raw
Json
def bool source · line 136 · raw
@b:Bool -> Json
def true_val source · line 139 · raw
Json
def false_val source · line 142 · raw
Json
def num source · line 145 · raw
@n:Nat -> Json
def neg source · line 148 · raw
@n:Nat -> Json
def str source · line 151 · raw
@s:String -> Json
def arr source · line 154 · raw
@vals:List<&2, Json> -> Json
def obj source · line 157 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Json
def kv source · line 160 · raw
@key:String -> @val:Json -> Sigma<&2, &2, String, _ => Json>
def is_null source · line 167 · raw
@j:Json -> Bool
def is_bool source · line 174 · raw
@j:Json -> Bool
def is_num source · line 181 · raw
@j:Json -> Bool
def is_neg source · line 188 · raw
@j:Json -> Bool
def is_str source · line 195 · raw
@j:Json -> Bool
def is_arr source · line 202 · raw
@j:Json -> Bool
def is_obj source · line 209 · raw
@j:Json -> Bool
def as_bool source · line 220 · raw
@j:Json -> Maybe<&2, Bool>
def as_num source · line 227 · raw
@j:Json -> Maybe<&2, Nat>
def as_neg source · line 234 · raw
@j:Json -> Maybe<&2, Nat>
def as_str source · line 241 · raw
@j:Json -> Maybe<&2, String>
def as_arr source · line 248 · raw
@j:Json -> Maybe<&2, List<&2, Json>>
def as_obj source · line 255 · raw
@j:Json -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>
def get_kv source · line 266 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> Maybe<&2, Json>
def get source · line 275 · raw
@j:Json -> @key:String -> Maybe<&2, Json>
def has.is_some source · line 282 · raw
@m:Maybe<&2, Json> -> Bool
def has source · line 289 · raw
@j:Json -> @key:String -> Bool
def set_kv source · line 292 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> @+val:Json -> List<&2, Sigma<&2, &2, String, _ => Json>>
def set source · line 301 · raw
@j:Json -> @key:String -> @val:Json -> Json
def remove_kv source · line 308 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> List<&2, Sigma<&2, &2, String, _ => Json>>
def remove source · line 317 · raw
@j:Json -> @key:String -> Json
def obj_len_kv source · line 324 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Nat
def obj_len source · line 331 · raw
@j:Json -> Nat
def keys_kv source · line 338 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, String>
def keys source · line 345 · raw
@j:Json -> List<&2, String>
def values_kv source · line 352 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Json>
def values source · line 359 · raw
@j:Json -> List<&2, Json>
def entries source · line 366 · raw
@j:Json -> List<&2, Sigma<&2, &2, String, _ => Json>>
def merge_kvs source · line 373 · raw
@overrides:List<&2, Sigma<&2, &2, String, _ => Json>> -> @base:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Sigma<&2, &2, String, _ => Json>>
def merge source · line 380 · raw
@j1:Json -> @j2:Json -> Json
def insert_kv_go source · line 391 · raw
@+ek:String -> @+ev:Json -> @+kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Sigma<&2, &2, String, _ => Json>>
def insert_kv source · line 400 · raw
@elem:Sigma<&2, &2, String, _ => Json> -> @kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Sigma<&2, &2, String, _ => Json>>
def sort_kvs source · line 404 · raw
@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Sigma<&2, &2, String, _ => Json>>
def sort_keys source · line 411 · raw
@j:Json -> Json
def to_map source · line 418 · raw
@j:Json -> Maybe<&2, Map<&2, Json>>
def from_map source · line 425 · raw
@m:Map<&2, Json> -> Json
def arr_len_list source · line 432 · raw
@vals:List<&2, Json> -> Nat
def arr_len source · line 439 · raw
@j:Json -> Nat
def arr_get_list source · line 446 · raw
@vals:List<&2, Json> -> @idx:Nat -> Maybe<&2, Json>
def arr_get source · line 457 · raw
@j:Json -> @idx:Nat -> Maybe<&2, Json>
def arr_push source · line 464 · raw
@j:Json -> @elem:Json -> Json
def list_set_idx source · line 471 · raw
@xs:List<&2, Json> -> @idx:Nat -> @+val:Json -> List<&2, Json>
def arr_set source · line 482 · raw
@j:Json -> @idx:Nat -> @val:Json -> Json
def list_pop_step source · line 489 · raw
@h:Json -> @res:Pair(Maybe<&2, Json>, List<&2, Json>) -> Pair(Maybe<&2, Json>, List<&2, Json>)
def list_pop_last source · line 493 · raw
@xs:List<&2, Json> -> Pair(Maybe<&2, Json>, List<&2, Json>)
def arr_pop_step source · line 504 · raw
@res:Pair(Maybe<&2, Json>, List<&2, Json>) -> Pair(Maybe<&2, Json>, Json)
def arr_pop source · line 508 · raw
@j:Json -> Pair(Maybe<&2, Json>, Json)
def list_remove source · line 515 · raw
@xs:List<&2, Json> -> @idx:Nat -> List<&2, Json>
def arr_remove source · line 526 · raw
@j:Json -> @idx:Nat -> Json
def list_insert source · line 533 · raw
@xs:List<&2, Json> -> @idx:Nat -> @+val:Json -> List<&2, Json>
def arr_insert source · line 544 · raw
@j:Json -> @idx:Nat -> @val:Json -> Json
def get_str_step source · line 599 · raw
@m:Maybe<&2, Json> -> Maybe<&2, String>
def get_str source · line 606 · raw
@j:Json -> @key:String -> Maybe<&2, String>
def get_num_step source · line 609 · raw
@m:Maybe<&2, Json> -> Maybe<&2, Nat>
def get_num source · line 616 · raw
@j:Json -> @key:String -> Maybe<&2, Nat>
def get_neg_step source · line 619 · raw
@m:Maybe<&2, Json> -> Maybe<&2, Nat>
def get_neg source · line 626 · raw
@j:Json -> @key:String -> Maybe<&2, Nat>
def get_bool_step source · line 629 · raw
@m:Maybe<&2, Json> -> Maybe<&2, Bool>
def get_bool source · line 636 · raw
@j:Json -> @key:String -> Maybe<&2, Bool>
def get_arr_step source · line 639 · raw
@m:Maybe<&2, Json> -> Maybe<&2, List<&2, Json>>
def get_arr source · line 646 · raw
@j:Json -> @key:String -> Maybe<&2, List<&2, Json>>
def get_obj_step source · line 649 · raw
@m:Maybe<&2, Json> -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>
def get_obj source · line 656 · raw
@j:Json -> @key:String -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>
def get_str_or_step source · line 659 · raw
@m:Maybe<&2, String> -> @dflt:String -> String
def get_str_or source · line 666 · raw
@j:Json -> @key:String -> @dflt:String -> String
def get_num_or_step source · line 669 · raw
@m:Maybe<&2, Nat> -> @dflt:Nat -> Nat
def get_num_or source · line 676 · raw
@j:Json -> @key:String -> @dflt:Nat -> Nat
def get_bool_or_step source · line 679 · raw
@m:Maybe<&2, Bool> -> @dflt:Bool -> Bool
def get_bool_or source · line 686 · raw
@j:Json -> @key:String -> @dflt:Bool -> Bool
def unescape_ptr_loop source · line 693 · raw
@fuel:Nat -> @st:PtrUnescState -> @s:String -> @+acc:List<&2, Char> -> String
def unescape_ptr_token source · line 728 · raw
@+s:String -> String
def split_ptr_loop source · line 731 · raw
@fuel:Nat -> @st:PtrSplitState -> @s:String -> @+cur:String -> List<&2, String>
def split_ptr_tokens source · line 750 · raw
@+s:String -> List<&2, String>
def parse_ptr_tokens_slash source · line 753 · raw
@is_slash:Bool -> @+t:String -> Maybe<&2, List<&2, String>>
def parse_ptr_tokens source · line 760 · raw
@+path:String -> Maybe<&2, List<&2, String>>
def parse_nat_loop source · line 767 · raw
@fuel:Nat -> @st:NatState -> @s:String -> @+acc:Nat -> Maybe<&2, Nat>
def parse_nat_lead source · line 786 · raw
@is_zero:Bool -> @is_digit:Bool -> @+c:U32 -> @+t:String -> Maybe<&2, Nat>
def parse_nat source · line 802 · raw
@+s:String -> Maybe<&2, Nat>
def pointer_resolve_arr source · line 811 · raw
@j:Json -> @m:Maybe<&2, Nat> -> Maybe<&2, Json>
def pointer_resolve_token source · line 818 · raw
@j:Json -> @token:String -> Maybe<&2, Json>
def pointer_traverse_loop source · line 827 · raw
@+tokens:List<&2, String> -> @cur:Maybe<&2, Json> -> Maybe<&2, Json>
def pointer_start source · line 838 · raw
@m:Maybe<&2, List<&2, String>> -> @j:Json -> Maybe<&2, Json>
def pointer source · line 845 · raw
@j:Json -> @path:String -> Maybe<&2, Json>
def pointer_set_arr_leaf source · line 848 · raw
@m:Maybe<&2, Nat> -> @j:Json -> @val:Json -> Json
def child_or_obj source · line 855 · raw
@m:Maybe<&2, Json> -> Json
def child_or_null source · line 862 · raw
@m:Maybe<&2, Json> -> Json
def arr_child source · line 869 · raw
@j:Json -> @m:Maybe<&2, Nat> -> Json
def pointer_set_arr_res source · line 876 · raw
@m:Maybe<&2, Nat> -> @j:Json -> @new_child:Json -> Json
def pointer_set_traverse source · line 883 · raw
@+tokens:List<&2, String> -> @+j:Json -> @+val:Json -> Json
def pointer_set_step source · line 909 · raw
@m:Maybe<&2, List<&2, String>> -> @j:Json -> @val:Json -> Json
def pointer_set source · line 916 · raw
@j:Json -> @path:String -> @val:Json -> Json
def escape_char source · line 923 · raw
@+c:Char -> String
def escape_string source · line 933 · raw
@s:String -> String
def quote_string source · line 940 · raw
@s:String -> String
def stringify_loop source · line 943 · raw
@fuel:Nat -> @+tasks:List<&2, PrintTask> -> @acc:String -> String
def stringify source · line 996 · raw
@j:Json -> String
def make_spaces source · line 1003 · raw
@n:Nat -> String
def make_custom_indent source · line 1010 · raw
@fuel:Nat -> @count:Nat -> @+step_str:String -> String
def pretty_indent_loop source · line 1021 · raw
@fuel:Nat -> @+tasks:List<&2, PrettyTask> -> @+step_str:String -> @acc:String -> String
def pretty_indent source · line 1082 · raw
@j:Json -> @step:Nat -> String
def pretty source · line 1085 · raw
@j:Json -> String
def classify_str_char source · line 1092 · raw
@+c:U32 -> StrCharKind
def classify_char source · line 1097 · raw
@+c:U32 -> CharKind
def parse_esc source · line 1112 · raw
@+code:U32 -> Char
def parse_str.loop source · line 1120 · raw
@fuel:Nat -> @st:StrState -> @s:String -> @+acc:List<&2, Char> -> StrRes
def skip_ws source · line 1149 · raw
@s:String -> String
def parse_digits.loop source · line 1156 · raw
@fuel:Nat -> @st:DigitsState -> @s:String -> @+acc:Nat -> NumRes
def parse_digits source · line 1177 · raw
@fuel:Nat -> @s:String -> @acc:Nat -> NumRes
def parse_step source · line 1180 · raw
@fuel:Nat -> @act:StepAct -> @+stack:List<&2, Frame> -> @s:String -> Result<&2, &2, String, Json>
def parse source · line 1351 · raw
@+s:String -> Result<&2, &2, String, Json>
def validate_step source · line 1359 · raw
@r:Result<&2, &2, String, Json> -> Bool
def validate source · line 1366 · raw
@s:String -> Bool
def stringify_ndjson source · line 1369 · raw
@xs:List<&2, Json> -> String
def split_lines_done source · line 1376 · raw
@is_empty:Bool -> @+line:String -> List<&2, String>
def split_lines.loop source · line 1383 · raw
@fuel:Nat -> @st:LineSplitState -> @s:String -> @+cur:String -> List<&2, String>
def split_lines_loop source · line 1411 · raw
@+s:String -> @cur:String -> List<&2, String>
def list_parse_lines source · line 1415 · raw
@lines:List<&2, String> -> List<&2, Result<&2, &2, String, Json>>
def parse_ndjson source · line 1422 · raw
@s:String -> List<&2, Result<&2, &2, String, Json>>
Templates
template list_map source · line 551 · raw
@-f:(@_:Json -> Json) -> @xs:List<&2, Json> -> List<&2, Json>
template arr_map source · line 558 · raw
@-f:(@_:Json -> Json) -> @j:Json -> Json
template list_filter source · line 565 · raw
@-f:(@_:Json -> Bool) -> @+xs:List<&2, Json> -> List<&2, Json>
template arr_filter source · line 574 · raw
@-f:(@_:Json -> Bool) -> @j:Json -> Json
template list_fold source · line 581 · raw
@-f:(@_:Json -> @_:Json -> Json) -> @xs:List<&2, Json> -> @acc:Json -> Json
template arr_fold source · line 588 · raw
@-f:(@_:Json -> @_:Json -> Json) -> @acc:Json -> @j:Json -> Json