Declarative JSON data manipulation for OCaml
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Check JSON interface examples

+82 -3
+4 -3
lib/codec.mli
··· 548 548 ('o, 'b) map 549 549 (** [opt_member name t map] is: 550 550 {[ 551 - let dec_absent = None and enc_omit = Option.is_none in 552 - Json.Codec.Object.member name (Json.Codec.some t) map ~dec_absent 553 - ~enc_omit 551 + let opt_member name t map = 552 + let dec_absent = None and enc_omit = Option.is_none in 553 + Json.Codec.Object.member name (Json.Codec.some t) map ~dec_absent 554 + ~enc_omit 554 555 ]} *) 555 556 556 557 (** {1:cases Case objects} *)
+4
lib/dune
··· 3 3 (public_name json) 4 4 (private_modules core) 5 5 (libraries fmt bytesrw loc)) 6 + 7 + (mdx 8 + (files json.mli codec.mli value.mli tape.mli error.mli sort.mli) 9 + (libraries json))
+12
lib/tape.mli
··· 10 10 build tapes from {!Value.t} here; a string-to-tape parser (the SIMD fast 11 11 path) is not implemented. 12 12 13 + {[ 14 + let tape = 15 + let open Json.Value in 16 + object' [ (name "ok", bool true) ] |> Json.Tape.of_value 17 + 18 + let () = 19 + assert (Json.Tape.tag_at tape 0 = Json.Tape.Root); 20 + assert (Json.Tape.tag_at tape 1 = Json.Tape.Start_object); 21 + assert (Json.Tape.string_at tape 2 = "ok"); 22 + assert (Json.Tape.tag_at tape 3 = Json.Tape.True) 23 + ]} 24 + 13 25 {2 Word layout} 14 26 15 27 Each word is a little-endian 64-bit quantity:
+62
test/test_tape.ml
··· 36 36 let test_roundtrip_object () = roundtrip_value "object" (v_simple ()) 37 37 let test_bytes_roundtrip () = roundtrip_bytes "object bytes" (v_simple ()) 38 38 39 + let check_tag name exp tape i = 40 + Alcotest.(check bool) (name ^ ": tag") true (Json.Tape.tag_at tape i = exp) 41 + 42 + let check_payload name exp tape i = 43 + Alcotest.(check int64) (name ^ ": payload") exp (Json.Tape.payload_at tape i) 44 + 45 + let test_simdjson_word_layout () = 46 + let tape = Json.Tape.of_value (v_simple ()) in 47 + Alcotest.(check int) "word count" 13 (Json.Tape.length tape); 48 + check_tag "root open" Json.Tape.Root tape 0; 49 + check_payload "root open" 12L tape 0; 50 + check_tag "object open" Json.Tape.Start_object tape 1; 51 + check_payload "object open" 11L tape 1; 52 + check_tag "member a" Json.Tape.String tape 2; 53 + Alcotest.(check string) "member a" "a" (Json.Tape.string_at tape 2); 54 + check_tag "int value" Json.Tape.Int64 tape 3; 55 + check_payload "int value" 42L tape 3; 56 + check_tag "member b" Json.Tape.String tape 4; 57 + Alcotest.(check string) "member b" "b" (Json.Tape.string_at tape 4); 58 + check_tag "string value" Json.Tape.String tape 5; 59 + Alcotest.(check string) "string value" "hello" (Json.Tape.string_at tape 5); 60 + check_tag "member c" Json.Tape.String tape 6; 61 + Alcotest.(check string) "member c" "c" (Json.Tape.string_at tape 6); 62 + check_tag "array open" Json.Tape.Start_array tape 7; 63 + check_payload "array open" 10L tape 7; 64 + check_tag "true value" Json.Tape.True tape 8; 65 + check_tag "null value" Json.Tape.Null tape 9; 66 + check_tag "array close" Json.Tape.End_array tape 10; 67 + check_payload "array close" 7L tape 10; 68 + check_tag "object close" Json.Tape.End_object tape 11; 69 + check_payload "object close" 1L tape 11; 70 + check_tag "root close" Json.Tape.Root tape 12; 71 + check_payload "root close" 0L tape 12 72 + 73 + let test_byte_serialization_layout () = 74 + let tape = Json.Tape.of_value (object' [ (name "a", string "x") ]) in 75 + let bs = Json.Tape.to_bytes tape in 76 + Alcotest.(check int32) "word count header" 6l (Bytes.get_int32_le bs 0); 77 + Alcotest.(check int32) "string buffer header" 10l (Bytes.get_int32_le bs 4); 78 + match Json.Tape.of_bytes bs with 79 + | Error e -> Alcotest.failf "of_bytes error: %s" e 80 + | Ok tape' -> 81 + Alcotest.(check int) "decoded word count" 6 (Json.Tape.length tape'); 82 + Alcotest.(check string) "decoded key" "a" (Json.Tape.string_at tape' 2); 83 + Alcotest.(check string) "decoded value" "x" (Json.Tape.string_at tape' 3) 84 + 85 + let test_reject_malformed_bytes () = 86 + Alcotest.(check (result reject string)) 87 + "short header" (Error "tape too short: header < 8 bytes") 88 + (Json.Tape.of_bytes (Bytes.create 7)); 89 + let bad_size = Bytes.create 8 in 90 + Bytes.set_int32_le bad_size 0 1l; 91 + Bytes.set_int32_le bad_size 4 0l; 92 + Alcotest.(check (result reject string)) 93 + "size mismatch" (Error "tape size mismatch: got 8, expected 16") 94 + (Json.Tape.of_bytes bad_size) 95 + 39 96 let suite = 40 97 ( "tape", 41 98 [ 42 99 Alcotest.test_case "roundtrip atoms" `Quick test_roundtrip_atoms; 43 100 Alcotest.test_case "roundtrip nested object" `Quick test_roundtrip_object; 44 101 Alcotest.test_case "bytes roundtrip" `Quick test_bytes_roundtrip; 102 + Alcotest.test_case "simdjson word layout" `Quick test_simdjson_word_layout; 103 + Alcotest.test_case "byte serialization layout" `Quick 104 + test_byte_serialization_layout; 105 + Alcotest.test_case "reject malformed bytes" `Quick 106 + test_reject_malformed_bytes; 45 107 ] )