~/bend-docscommunity

json.bend fails

raw source on the hub · import 0x1f4d6c03caf955232d0b0dc6e6f36cf4/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

type Frame source · line 35 · raw

Data

Parser stack frames

type StrCharKind source · line 40 · raw

Data

String parser types

type StrRes source · line 46 · raw

Data

type Hex4Res source · line 50 · raw

Data

type EscRes source · line 54 · raw

Data

type EscCharKind source · line 58 · raw

Data

type StrState source · line 69 · raw

Data

type PtrUnescState source · line 75 · raw

Data

type PtrSplitState source · line 81 · raw

Data

type NatState source · line 85 · raw

Data

type LineSplitState source · line 90 · raw

Data

type WsState source · line 95 · raw

Data

type NumRes source · line 100 · raw

Data

Number parser result

type NumCharKind source · line 105 · raw

Data

type NumState source · line 114 · raw

Data

type CharKind source · line 135 · raw

Data

General character classification

type StepAct source · line 151 · raw

Data

Parser state machine actions

type PrintTask source · line 174 · raw

Data

Serializer stack task

type PrettyTask source · line 181 · raw

Data

Pretty printer stack task

type SizeTask source · line 188 · raw

Data

Size calculation stack task

Definitions

def null source · line 198 · raw

Json

def bool source · line 201 · raw

@b:Bool -> Json

def true_val source · line 204 · raw

Json

def false_val source · line 207 · raw

Json

def num source · line 210 · raw

@n:Nat -> Json

def neg source · line 213 · raw

@n:Nat -> Json

def str source · line 216 · raw

@s:String -> Json

def arr source · line 219 · raw

@vals:List<&2, Json> -> Json

def obj source · line 222 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Json

def kv source · line 225 · raw

@key:String -> @val:Json -> Sigma<&2, &2, String, _ => Json>

def raw source · line 228 · raw

@s:String -> Json

def is_null source · line 235 · raw

@j:Json -> Bool

def is_bool source · line 242 · raw

@j:Json -> Bool

def is_num source · line 249 · raw

@j:Json -> Bool

def is_neg source · line 256 · raw

@j:Json -> Bool

def is_str source · line 263 · raw

@j:Json -> Bool

def is_arr source · line 270 · raw

@j:Json -> Bool

def is_obj source · line 277 · raw

@j:Json -> Bool

def is_raw source · line 284 · raw

@j:Json -> Bool

def as_bool source · line 295 · raw

@j:Json -> Maybe<&2, Bool>

def as_num source · line 302 · raw

@j:Json -> Maybe<&2, Nat>

def as_neg source · line 309 · raw

@j:Json -> Maybe<&2, Nat>

def as_str source · line 316 · raw

@j:Json -> Maybe<&2, String>

def as_arr source · line 323 · raw

@j:Json -> Maybe<&2, List<&2, Json>>

def as_obj source · line 330 · raw

@j:Json -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>

def as_raw source · line 337 · raw

@j:Json -> Maybe<&2, String>

def get_kv source · line 348 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> Maybe<&2, Json>

def get source · line 357 · raw

@j:Json -> @key:String -> Maybe<&2, Json>

def has.is_some source · line 364 · raw

@m:Maybe<&2, Json> -> Bool

def has source · line 371 · raw

@j:Json -> @key:String -> Bool

def set_kv source · line 374 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> @+val:Json -> List<&2, Sigma<&2, &2, String, _ => Json>>

def set source · line 383 · raw

@j:Json -> @key:String -> @val:Json -> Json

def remove_kv source · line 390 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> @+key:String -> List<&2, Sigma<&2, &2, String, _ => Json>>

def remove source · line 399 · raw

@j:Json -> @key:String -> Json

def obj_len_kv source · line 406 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> Nat

def obj_len source · line 413 · raw

@j:Json -> Nat

def keys_kv source · line 420 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, String>

def keys source · line 427 · raw

@j:Json -> List<&2, String>

def values_kv source · line 434 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Json>

def values source · line 441 · raw

@j:Json -> List<&2, Json>

def entries source · line 448 · raw

@j:Json -> List<&2, Sigma<&2, &2, String, _ => Json>>

def merge_kvs source · line 455 · 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 462 · raw

@j1:Json -> @j2:Json -> Json

def insert_kv_go source · line 473 · 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 482 · 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 486 · raw

@kvs:List<&2, Sigma<&2, &2, String, _ => Json>> -> List<&2, Sigma<&2, &2, String, _ => Json>>

def sort_keys source · line 493 · raw

@j:Json -> Json

def to_map source · line 500 · raw

@j:Json -> Maybe<&2, Map<&2, Json>>

def from_map source · line 507 · raw

@m:Map<&2, Json> -> Json

def arr_len_list source · line 514 · raw

@vals:List<&2, Json> -> Nat

def arr_len source · line 521 · raw

@j:Json -> Nat

def arr_get_list source · line 528 · raw

@vals:List<&2, Json> -> @idx:Nat -> Maybe<&2, Json>

def arr_get source · line 539 · raw

@j:Json -> @idx:Nat -> Maybe<&2, Json>

def arr_push source · line 546 · raw

@j:Json -> @elem:Json -> Json

def list_set_idx source · line 553 · raw

@xs:List<&2, Json> -> @idx:Nat -> @+val:Json -> List<&2, Json>

def arr_set source · line 564 · raw

@j:Json -> @idx:Nat -> @val:Json -> Json

def list_pop_step source · line 571 · raw

@h:Json -> @res:Pair(Maybe<&2, Json>, List<&2, Json>) -> Pair(Maybe<&2, Json>, List<&2, Json>)

def list_pop_last source · line 575 · raw

@xs:List<&2, Json> -> Pair(Maybe<&2, Json>, List<&2, Json>)

def arr_pop_step source · line 586 · raw

@res:Pair(Maybe<&2, Json>, List<&2, Json>) -> Pair(Maybe<&2, Json>, Json)

def arr_pop source · line 590 · raw

@j:Json -> Pair(Maybe<&2, Json>, Json)

def list_remove source · line 597 · raw

@xs:List<&2, Json> -> @idx:Nat -> List<&2, Json>

def arr_remove source · line 608 · raw

@j:Json -> @idx:Nat -> Json

def list_insert source · line 615 · raw

@xs:List<&2, Json> -> @idx:Nat -> @+val:Json -> List<&2, Json>

def arr_insert source · line 626 · raw

@j:Json -> @idx:Nat -> @val:Json -> Json

def get_str_step source · line 681 · raw

@m:Maybe<&2, Json> -> Maybe<&2, String>

def get_str source · line 688 · raw

@j:Json -> @key:String -> Maybe<&2, String>

def get_num_step source · line 691 · raw

@m:Maybe<&2, Json> -> Maybe<&2, Nat>

def get_num source · line 698 · raw

@j:Json -> @key:String -> Maybe<&2, Nat>

def get_neg_step source · line 701 · raw

@m:Maybe<&2, Json> -> Maybe<&2, Nat>

def get_neg source · line 708 · raw

@j:Json -> @key:String -> Maybe<&2, Nat>

def get_bool_step source · line 711 · raw

@m:Maybe<&2, Json> -> Maybe<&2, Bool>

def get_bool source · line 718 · raw

@j:Json -> @key:String -> Maybe<&2, Bool>

def get_arr_step source · line 721 · raw

@m:Maybe<&2, Json> -> Maybe<&2, List<&2, Json>>

def get_arr source · line 728 · raw

@j:Json -> @key:String -> Maybe<&2, List<&2, Json>>

def get_obj_step source · line 731 · raw

@m:Maybe<&2, Json> -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>

def get_obj source · line 738 · raw

@j:Json -> @key:String -> Maybe<&2, List<&2, Sigma<&2, &2, String, _ => Json>>>

def get_str_or_step source · line 741 · raw

@m:Maybe<&2, String> -> @dflt:String -> String

def get_str_or source · line 748 · raw

@j:Json -> @key:String -> @dflt:String -> String

def get_num_or_step source · line 751 · raw

@m:Maybe<&2, Nat> -> @dflt:Nat -> Nat

def get_num_or source · line 758 · raw

@j:Json -> @key:String -> @dflt:Nat -> Nat

def get_bool_or_step source · line 761 · raw

@m:Maybe<&2, Bool> -> @dflt:Bool -> Bool

def get_bool_or source · line 768 · raw

@j:Json -> @key:String -> @dflt:Bool -> Bool

def str_len_loop source · line 775 · raw

@s:String -> @acc:Nat -> Nat

def str_len source · line 782 · raw

@s:String -> Nat

def str_from_rev_loop source · line 785 · raw

@cs:List<&2, Char> -> @cur:String -> String

def unescape_ptr_loop source · line 792 · raw

@fuel:Nat -> @st:PtrUnescState -> @s:String -> @acc:List<&2, Char> -> String

def unescape_ptr_token source · line 827 · raw

@+s:String -> String

def split_ptr_loop source · line 830 · raw

@fuel:Nat -> @st:PtrSplitState -> @s:String -> @+cur:String -> List<&2, String>

def split_ptr_tokens source · line 849 · raw

@+s:String -> List<&2, String>

def parse_ptr_tokens_slash source · line 852 · raw

@is_slash:Bool -> @+t:String -> Maybe<&2, List<&2, String>>

def parse_ptr_tokens source · line 859 · raw

@+path:String -> Maybe<&2, List<&2, String>>

def check_safe_mul10_step source · line 866 · raw

@is_small:Bool -> @acc:Nat -> @d:Nat -> Bool

def check_safe_mul10 source · line 873 · raw

@+acc:Nat -> @d:Nat -> Bool

def parse_nat_loop source · line 876 · raw

@fuel:Nat -> @st:NatState -> @s:String -> @+acc:Nat -> Maybe<&2, Nat>

def parse_nat_lead source · line 902 · raw

@is_zero:Bool -> @is_digit:Bool -> @+c:U32 -> @+t:String -> Maybe<&2, Nat>

def parse_nat source · line 918 · raw

@+s:String -> Maybe<&2, Nat>

def pointer_resolve_arr source · line 927 · raw

@j:Json -> @m:Maybe<&2, Nat> -> Maybe<&2, Json>

def pointer_resolve_token source · line 934 · raw

@j:Json -> @token:String -> Maybe<&2, Json>

def pointer_traverse_loop source · line 943 · raw

@+tokens:List<&2, String> -> @cur:Maybe<&2, Json> -> Maybe<&2, Json>

def pointer_start source · line 954 · raw

@m:Maybe<&2, List<&2, String>> -> @j:Json -> Maybe<&2, Json>

def pointer source · line 961 · raw

@j:Json -> @path:String -> Maybe<&2, Json>

def pointer_set_arr_leaf source · line 964 · raw

@m:Maybe<&2, Nat> -> @j:Json -> @val:Json -> Json

def child_or_obj source · line 971 · raw

@m:Maybe<&2, Json> -> Json

def child_or_null source · line 978 · raw

@m:Maybe<&2, Json> -> Json

def arr_child source · line 985 · raw

@j:Json -> @m:Maybe<&2, Nat> -> Json

def pointer_set_arr_res source · line 992 · raw

@m:Maybe<&2, Nat> -> @j:Json -> @new_child:Json -> Json

def pointer_set_traverse source · line 999 · raw

@+tokens:List<&2, String> -> @+j:Json -> @+val:Json -> Json

def pointer_set_step source · line 1025 · raw

@m:Maybe<&2, List<&2, String>> -> @j:Json -> @val:Json -> Json

def pointer_set source · line 1032 · raw

@j:Json -> @path:String -> @val:Json -> Json

def hex_to_char source · line 1039 · raw

@+d:U32 -> Char

def escape_char source · line 1044 · raw

@+c:Char -> String

def classify_esc_char source · line 1058 · raw

@+c:U32 -> EscCharKind

def escape_step source · line 1069 · raw

@kind:EscCharKind -> @acc:List<&2, Char> -> List<&2, Char>

def escape_str_loop source · line 1090 · raw

@fuel:Nat -> @s:String -> @acc:List<&2, Char> -> String

def escape_string source · line 1101 · raw

@+s:String -> String

def quote_string source · line 1106 · raw

@+s:String -> String

def json_size_loop source · line 1111 · raw

@fuel:Nat -> @+tasks:List<&2, SizeTask> -> @+acc:Nat -> Nat

def json_size source · line 1152 · raw

@j:Json -> Nat

def join_chunks_loop source · line 1155 · raw

@fuel:Nat -> @xs:List<&2, String> -> @cur:String -> String

def stringify_loop source · line 1166 · raw

@fuel:Nat -> @+tasks:List<&2, PrintTask> -> @+acc:List<&2, String> -> Result<&2, &2, String, String>

def stringify_checked source · line 1225 · raw

@+j:Json -> Result<&2, &2, String, String>

def stringify_unwrap source · line 1230 · raw

@r:Result<&2, &2, String, String> -> String

def stringify source · line 1237 · raw

@j:Json -> String

def make_spaces source · line 1244 · raw

@n:Nat -> String

def make_custom_indent source · line 1251 · raw

@count:Nat -> @+step_str:String -> String

def pretty_indent_loop source · line 1258 · raw

@fuel:Nat -> @+tasks:List<&2, PrettyTask> -> @+step_str:String -> @+acc:List<&2, String> -> String

def pretty_indent source · line 1315 · raw

@+j:Json -> @step:Nat -> String

def pretty source · line 1320 · raw

@j:Json -> String

def classify_str_char source · line 1327 · raw

@+c:U32 -> StrCharKind

def classify_char source · line 1333 · raw

@+c:U32 -> CharKind

def hex_digit_val source · line 1348 · raw

@+c:U32 -> U32

def make_hex4 source · line 1354 · raw

@+d1:U32 -> @+d2:U32 -> @+d3:U32 -> @+d4:U32 -> @rest:String -> Hex4Res

def parse_hex4 source · line 1360 · raw

@s:String -> Hex4Res

def finish_low_hex4 source · line 1379 · raw

@is_valid_lo:Bool -> @+hi_val:U32 -> @+lo_val:U32 -> @rest:String -> EscRes

def handle_low_hex4 source · line 1387 · raw

@+hi_val:U32 -> @h4:Hex4Res -> EscRes

def check_slash_u source · line 1395 · raw

@is_slash_u:Bool -> @+hi_val:U32 -> @t2:String -> EscRes

def parse_low_surrogate source · line 1402 · raw

@+hi_val:U32 -> @rest:String -> EscRes

def check_surrogate_hi source · line 1414 · raw

@is_hi:Bool -> @+val:U32 -> @rest:String -> EscRes

def check_surrogate_kind source · line 1421 · raw

@is_hi:Bool -> @is_lo:Bool -> @+val:U32 -> @rest:String -> EscRes

def check_surrogate source · line 1428 · raw

@+val:U32 -> @rest:String -> EscRes

def handle_unicode_hex4 source · line 1433 · raw

@h4:Hex4Res -> EscRes

def parse_escape_step source · line 1440 · raw

@is_u:Bool -> @+c:U32 -> @+rest:String -> EscRes

def parse_escape_seq source · line 1455 · raw

@+c:U32 -> @rest:String -> EscRes

def parse_str.loop source · line 1458 · raw

@fuel:Nat -> @st:StrState -> @s:String -> @acc:List<&2, Char> -> StrRes

def is_json_ws source · line 1496 · raw

@+c:U32 -> Bool

def skip_ws_loop source · line 1499 · raw

@fuel:Nat -> @st:WsState -> @s:String -> String

def skip_ws source · line 1518 · raw

@s:String -> String

def classify_num_char source · line 1521 · raw

@+c:U32 -> NumCharKind

def safe_mul_add source · line 1530 · raw

@is_safe:Bool -> @acc:Nat -> @d:Nat -> Nat

def parse_num_loop source · line 1537 · raw

@fuel:Nat -> @st:NumState -> @s:String -> @acc:List<&2, Char> -> NumRes

def parse_number source · line 1709 · raw

@fuel:Nat -> @s:String -> NumRes

def parse_step source · line 1712 · raw

@fuel:Nat -> @act:StepAct -> @+stack:List<&2, Frame> -> @s:String -> Result<&2, &2, String, Json>

def parse source · line 1887 · raw

@+s:String -> Result<&2, &2, String, Json>

def validate_step source · line 1895 · raw

@r:Result<&2, &2, String, Json> -> Bool

def validate source · line 1902 · raw

@s:String -> Bool

def stringify_ndjson source · line 1905 · raw

@xs:List<&2, Json> -> String

def split_lines_done source · line 1912 · raw

@is_empty:Bool -> @+line:String -> List<&2, String>

def split_lines.loop source · line 1919 · raw

@fuel:Nat -> @st:LineSplitState -> @s:String -> @+cur:String -> List<&2, String>

def split_lines_loop source · line 1947 · raw

@+s:String -> @cur:String -> List<&2, String>

def list_parse_lines source · line 1951 · raw

@lines:List<&2, String> -> List<&2, Result<&2, &2, String, Json>>

def parse_ndjson source · line 1958 · raw

@s:String -> List<&2, Result<&2, &2, String, Json>>

Templates

template list_map source · line 633 · raw

@-f:(@_:Json -> Json) -> @xs:List<&2, Json> -> List<&2, Json>

template arr_map source · line 640 · raw

@-f:(@_:Json -> Json) -> @j:Json -> Json

template list_filter source · line 647 · raw

@-f:(@_:Json -> Bool) -> @+xs:List<&2, Json> -> List<&2, Json>

template arr_filter source · line 656 · raw

@-f:(@_:Json -> Bool) -> @j:Json -> Json

template list_fold source · line 663 · raw

@-f:(@_:Json -> @_:Json -> Json) -> @xs:List<&2, Json> -> @acc:Json -> Json

template arr_fold source · line 670 · raw

@-f:(@_:Json -> @_:Json -> Json) -> @acc:Json -> @j:Json -> Json