package melange-json
Compositional JSON encode/decode library and PPX for Melange
Install
Dune Dependency
Authors
Maintainers
Sources
melange-json-2.0.0.tbz
sha256=5049c1694ac30f7de3dbffc10e9a01b83c3302b4147902d97c31b7482fdb2ad8
sha512=bcad995988dd4f5bfba1824e9ae5d4e12c1ea20dba6a943db04a2a112428dd78d09fd4cc87b5ca2f4fb08b0b5d4165b249953325b210170687d1a0ae47dd18a1
doc/src/ppx_deriving_json_js/ppx_deriving_json_common.ml.html
Source file ppx_deriving_json_common.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
# 1 "ppx/native/common/ppx_deriving_json_common.ml" open StdLabels open Ppxlib open Ast_builder.Default open Ppx_deriving_tools.Conv let get_of_variant_case ?mark_as_seen ~variant ~polyvariant = function | Vcs_ctx_variant ctx -> Attribute.get ?mark_as_seen variant ctx | Vcs_ctx_polyvariant ctx -> Attribute.get ?mark_as_seen polyvariant ctx let get_of_variant ?mark_as_seen ~variant ~polyvariant = function | Vrt_ctx_variant ctx -> Attribute.get ?mark_as_seen variant ctx | Vrt_ctx_polyvariant ctx -> Attribute.get ?mark_as_seen polyvariant ctx let attr_json_name ctx = Attribute.declare "json.name" ctx Ast_pattern.(single_expr_payload (estring __')) (fun x -> x) let vcs_attr_json_name = let variant = attr_json_name Attribute.Context.constructor_declaration in let polyvariant = attr_json_name Attribute.Context.rtag in get_of_variant_case ~variant ~polyvariant let attr_json_allow_any ctx = Attribute.declare_flag "json.allow_any" ctx let vcs_attr_json_allow_any = let variant = attr_json_allow_any Attribute.Context.constructor_declaration in let polyvariant = attr_json_allow_any Attribute.Context.rtag in fun ?mark_as_seen ctx -> match get_of_variant_case ~variant ~polyvariant ?mark_as_seen ctx with | None -> false | Some () -> true let ld_attr_json_key = Attribute.get (Attribute.declare "json.key" Attribute.Context.label_declaration Ast_pattern.(single_expr_payload (estring __')) (fun x -> x)) let ld_attr_json_option = Attribute.get (Attribute.declare "json.option" Attribute.Context.label_declaration Ast_pattern.(pstr nil) ()) let attr_json_allow_extra_fields ctx = Attribute.declare "json.allow_extra_fields" ctx Ast_pattern.(pstr nil) () let td_attr_json_allow_extra_fields = Attribute.get (attr_json_allow_extra_fields Attribute.Context.type_declaration) let cd_attr_json_allow_extra_fields = Attribute.get (attr_json_allow_extra_fields Attribute.Context.constructor_declaration) let ld_attr_json_default = Attribute.get (Attribute.declare "json.default" Attribute.Context.label_declaration Ast_pattern.(single_expr_payload __) (fun x -> x)) let ld_attr_json_drop_default = Attribute.get (Attribute.declare "json.drop_default" Attribute.Context.label_declaration Ast_pattern.(pstr nil) ()) let ld_attr_default ld = match ld_attr_json_default ld with | Some e -> Some e | None -> ( match ld_attr_json_option ld with | Some () -> let loc = ld.pld_loc in Some [%expr Stdlib.Option.None] | None -> None) let ld_drop_default ld = let loc = ld.pld_loc in match ld_attr_json_drop_default ld, ld_attr_json_option ld with | Some (), None -> Location.raise_errorf ~loc "found [@drop_default] attribute without [@option]" | Some (), Some () -> `Drop_option | None, _ -> `No let expand_via ~what ~through make ~ctxt (rec_flag, tds) = let loc = Expansion_context.Deriver.derived_item_loc ctxt in let expand_one (td : type_declaration) = let loc = td.ptype_loc in let pat = let { txt; loc } = td.ptype_name in let txt = Expansion_helpers.mangle what txt in ppat_var ~loc { Location.txt; loc } in let name_of_td_param idx (ty, _) = match ty.ptyp_desc with | Ptyp_any -> Printf.sprintf "_%d" idx | Ptyp_var name -> name | _ -> Location.raise_errorf ~loc:ty.ptyp_loc "unsupported type parameter" in let names = List.mapi td.ptype_params ~f:name_of_td_param in let expr = let of_json = let { txt; loc = _ } = td.ptype_name in let txt = Expansion_helpers.mangle through txt in let of_json = pexp_ident ~loc { loc; txt = lident txt } in pexp_apply ~loc of_json (List.map names ~f:(fun name -> Nolabel, evar ~loc name)) in let body = make ~loc of_json in List.fold_left (List.rev names) ~init:body ~f:(fun e name -> [%expr fun [%p pvar ~loc name] -> [%e e]]) in value_binding ~loc ~pat ~expr in pstr_value_list ~loc rec_flag (List.map tds ~f:expand_one) module Of_json_string = struct let expand = expand_via ~what:(Expansion_helpers.Suffix "of_json_string") ~through:(Expansion_helpers.Suffix "of_json") (fun ~loc of_json -> [%expr fun _json -> [%e of_json] (Melange_json.of_string _json)]) let register ~of_json () = Deriving.add "of_json_string" ~str_type_decl: (Deriving.Generator.V2.make ~deps:[ of_json ] Deriving.Args.empty expand) end module To_json_string = struct let expand = expand_via ~what:(Expansion_helpers.Suffix "to_json_string") ~through:(Expansion_helpers.Suffix "to_json") (fun ~loc to_json -> [%expr fun _data -> Melange_json.to_string ([%e to_json] _data)]) let register ~to_json () = Deriving.add "to_json_string" ~str_type_decl: (Deriving.Generator.V2.make ~deps:[ to_json ] Deriving.Args.empty expand) end module Json_string = struct let expand ~ctxt tds = Of_json_string.expand ~ctxt tds @ To_json_string.expand ~ctxt tds let register ~json () = Deriving.add "json_string" ~str_type_decl: (Deriving.Generator.V2.make ~deps:[ json ] Deriving.Args.empty expand) end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>