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_js.ml.html
Source file ppx_deriving_json_js.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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
open Printf open StdLabels open Ppxlib open Ast_builder.Default open Ppx_deriving_tools open Ppx_deriving_tools.Conv open Ppx_deriving_json_common module Of_json = struct let build_tuple ~loc derive si (ts : core_type list) e = pexp_tuple ~loc (List.mapi ts ~f:(fun i t -> derive t [%expr Js.Array.unsafe_get [%e e] [%e eint ~loc (si + i)]])) let build_js_type ~loc (fs : label_declaration list) = let f ld = let n = ld.pld_name in let n = Option.value ~default:n (ld_attr_json_key ld) in let pof_desc = Otag (n, [%type: Js.Json.t Js.undefined]) in { pof_loc = loc; pof_attributes = []; pof_desc } in let row = ptyp_object ~loc (List.map fs ~f) Closed in [%type: [%t row] Js.t] let build_record ~loc derive (fs : label_declaration list) x make = let handle_field fs ld = ( map_loc lident ld.pld_name, let n = ld.pld_name in let n = Option.value ~default:n (ld_attr_json_key ld) in [%expr match Js.Undefined.toOption [%e fs]##[%e pexp_ident ~loc:n.loc (map_loc lident n)] with | Stdlib.Option.Some v -> [%e derive ld.pld_type [%expr v]] | Stdlib.Option.None -> [%e match ld_attr_default ld with | Some default -> default | None -> [%expr Melange_json.of_json_error ~json:x [%e estring ~loc (sprintf "expected field %S to be present" n.txt)]]]] ) in [%expr let fs = (Obj.magic [%e x] : [%t build_js_type ~loc fs]) in [%e make (pexp_record ~loc (List.map fs ~f:(handle_field [%expr fs])) None)]] let eis_json_object ~loc x = [%expr Stdlib.( && ) (Stdlib.( = ) (Js.typeof [%e x]) "object") (Stdlib.( && ) (Stdlib.not (Js.Array.isArray [%e x])) (Stdlib.not (Stdlib.( == ) (Obj.magic [%e x] : 'a Js.null) Js.null)))] let ensure_json_object ~loc x = [%expr if Stdlib.not [%e eis_json_object ~loc x] then Melange_json.of_json_error ~json:[%e x] [%e estring ~loc (sprintf "expected a JSON object")]] let ensure_json_array_len ~loc ~allow_any_constr ~else_ n len x = [%expr if Stdlib.( <> ) [%e len] [%e eint ~loc n] then [%e match allow_any_constr with | Some allow_any_constr -> allow_any_constr x | None -> [%expr Melange_json.of_json_error ~json:[%e x] [%e estring ~loc (sprintf "expected a JSON array of length %i" n)]]] else [%e else_]] let derive_of_tuple derive t x = let loc = t.tpl_loc in let n = List.length t.tpl_types in [%expr if Stdlib.( && ) (Js.Array.isArray [%e x]) (Stdlib.( = ) (Js.Array.length (Obj.magic [%e x] : Js.Json.t array)) [%e eint ~loc n]) then let es = (Obj.magic [%e x] : Js.Json.t array) in [%e build_tuple ~loc derive 0 t.tpl_types [%expr es]] else Melange_json.of_json_error ~json:[%e x] [%e estring ~loc (sprintf "expected a JSON array of length %i" n)]] let derive_of_record derive t x = let loc = t.rcd_loc in [%expr [%e ensure_json_object ~loc x]; [%e build_record ~loc derive t.rcd_fields x Fun.id]] let derive_of_variant _derive t ~allow_any_constr body x = let loc = t.vrt_loc in [%expr if Js.Array.isArray [%e x] then let array = (Obj.magic [%e x] : Js.Json.t array) in let len = Js.Array.length array in if Stdlib.( > ) len 0 then let tag = Js.Array.unsafe_get array 0 in if Stdlib.( = ) (Js.typeof tag) "string" then let tag = (Obj.magic tag : string) in [%e body] else [%e match allow_any_constr with | Some allow_any_constr -> allow_any_constr x | None -> [%expr Melange_json.of_json_error ~json:[%e x] "expected a non empty JSON array with element \ being a string"]] else [%e match allow_any_constr with | Some allow_any_constr -> allow_any_constr x | None -> [%expr Melange_json.of_json_error ~json:[%e x] "expected a non empty JSON array"]] else [%e match allow_any_constr with | Some allow_any_constr -> allow_any_constr x | None -> [%expr Melange_json.of_json_error ~json:[%e x] "expected a non empty JSON array"]]] let derive_of_variant_case derive make c ~allow_any_constr next = match c with | Vcs_record (n, r) -> let loc = n.loc in let n = Option.value ~default:n (vcs_attr_json_name r.rcd_ctx) in [%expr if Stdlib.( = ) tag [%e estring ~loc:n.loc n.txt] then [%e ensure_json_array_len ~loc ~allow_any_constr 2 [%expr len] [%expr x] ~else_: [%expr let fs = Js.Array.unsafe_get array 1 in [%e ensure_json_object ~loc [%expr fs]]; [%e build_record ~loc derive r.rcd_fields [%expr fs] (fun e -> make (Some e))]]] else [%e next]] | Vcs_tuple (n, t) -> let loc = n.loc in let n = Option.value ~default:n (vcs_attr_json_name t.tpl_ctx) in let arity = List.length t.tpl_types in [%expr if Stdlib.( = ) tag [%e estring ~loc:n.loc n.txt] then [%e ensure_json_array_len ~loc ~allow_any_constr (arity + 1) [%expr len] [%expr x] ~else_: (if Stdlib.( = ) arity 0 then make None else make (Some (build_tuple ~loc derive 1 t.tpl_types [%expr array])))] else [%e next]] let is_allow_any_constr vcs = Ppx_deriving_json_common.vcs_attr_json_allow_any vcs let deriving : Ppx_deriving_tools.deriving = deriving_of () ~name:"of_json" ~of_t:(fun ~loc -> [%type: Js.Json.t]) ~is_allow_any_constr ~derive_of_tuple ~derive_of_record ~derive_of_variant ~derive_of_variant_case end module To_json = struct let as_json ~loc x = [%expr (Obj.magic [%e x] : Js.Json.t)] let derive_of_tuple derive t es = let loc = t.tpl_loc in as_json ~loc (pexp_array ~loc (List.map2 t.tpl_types es ~f:derive)) let derive_of_record derive t es = let loc = t.rcd_loc in let fs = List.map2 t.rcd_fields es ~f:(fun ld x -> let k = let k = ld.pld_name in Option.value ~default:k (ld_attr_json_key ld) in let v = let v = derive ld.pld_type x in match ld_drop_default ld with | `No -> v | `Drop_option -> [%expr match [%e x] with | Stdlib.Option.None -> Js.Undefined.empty | Stdlib.Option.Some _ -> Js.Undefined.return [%e v]] in map_loc lident k, v) in let record = pexp_record ~loc fs None in as_json ~loc [%expr [%mel.obj [%e record]]] let derive_of_variant_case derive c es = match c with | Vcs_record (n, r) -> let loc = n.loc in let n = Option.value ~default:n (vcs_attr_json_name r.rcd_ctx) in let tag = [%expr (Obj.magic [%e estring ~loc:n.loc n.txt] : Js.Json.t)] in let es = [ derive_of_record derive r es ] in as_json ~loc (pexp_array ~loc (tag :: es)) | Vcs_tuple (_n, t) when vcs_attr_json_allow_any t.tpl_ctx -> ( match es with | [ x ] -> x | es -> failwith (sprintf "expected a tuple of length 1, got %i" (List.length es))) | Vcs_tuple (n, t) -> let loc = n.loc in let n = Option.value ~default:n (vcs_attr_json_name t.tpl_ctx) in let tag = [%expr (Obj.magic [%e estring ~loc:n.loc n.txt] : Js.Json.t)] in let es = List.map2 t.tpl_types es ~f:derive in as_json ~loc (pexp_array ~loc (tag :: es)) let deriving : Ppx_deriving_tools.deriving = deriving_to () ~name:"to_json" ~t_to:(fun ~loc -> [%type: Js.Json.t]) ~derive_of_tuple ~derive_of_record ~derive_of_variant_case end let () = let of_json = Ppx_deriving_tools.register Of_json.deriving in let to_json = Ppx_deriving_tools.register To_json.deriving in let json = Ppx_deriving_tools.register_combined "json" [ To_json.deriving; Of_json.deriving ] in let (_ : Deriving.t) = Of_json_string.register ~of_json () in let (_ : Deriving.t) = To_json_string.register ~to_json () in let (_ : Deriving.t) = Json_string.register ~json () in ()
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>