~/bend-docscommunity

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

type Frame source · line 34 · raw

Data

Parser stack frames

type StrCharKind source · line 39 · raw

Data

String parser types

type StrRes source · line 44 · raw

Data

type StrState source · line 48 · raw

Data

type PtrUnescState source · line 53 · raw

Data

type PtrSplitState source · line 59 · raw

Data

type NatState source · line 63 · raw

Data

type LineSplitState source · line 67 · raw

Data

type NumRes source · line 73 · raw

Data

Number parser result

type CharKind source · line 77 · raw

Data

General character classification

type StepAct source · line 93 · raw

Data

Parser state machine actions

type PrintTask source · line 116 · raw

Data

Serializer stack task

type PrettyTask source · line 123 · raw

Data

Pretty printer stack task

type DigitsState source · line 1152 · raw

Data

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