Source file data_encoding.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
module Encoding = struct
include Encoding
type 'a matching_function = 'a -> match_result
let splitted ~json ~binary = raw_splitted ~json:(Json.convert json) ~binary
let assoc enc =
let json = Json_encoding.assoc (Json.conve enc) in
let binary = list (tup2 string enc) in
raw_splitted ~json ~binary
module Bounded = struct
let string length =
raw_splitted
~binary:
(let kind = Binary_size.unsigned_range_to_size length in
check_size (length + Binary_size.integer_to_size kind)
@@ dynamic_size ~kind Variable.string)
~json:
(let open Json_encoding in
conv
(fun s ->
if String.length s > length then invalid_arg "oversized string" ;
s)
(fun s ->
if String.length s > length then
raise
(Cannot_destruct ([], Invalid_argument "oversized string")) ;
s)
string)
let bytes length =
raw_splitted
~binary:
(let kind = Binary_size.unsigned_range_to_size length in
check_size (length + Binary_size.integer_to_size kind)
@@ dynamic_size ~kind Variable.bytes)
~json:
(let open Json_encoding in
conv
(fun s ->
if Bytes.length s > length then invalid_arg "oversized string" ;
s)
(fun s ->
if Bytes.length s > length then
raise
(Cannot_destruct ([], Invalid_argument "oversized string")) ;
s)
Json.bytes_jsont)
end
type 'a lazy_state = Value of 'a | Bytes of Bytes.t | Both of Bytes.t * 'a
type 'a lazy_t = {mutable state : 'a lazy_state; encoding : 'a t}
let force_decode le =
match le.state with
| Value value -> Some value
| Both (_, value) -> Some value
| Bytes bytes -> (
match Binary_reader.of_bytes_opt le.encoding bytes with
| Some expr ->
le.state <- Both (bytes, expr) ;
Some expr
| None -> None)
let force_bytes le =
match le.state with
| Bytes bytes -> bytes
| Both (bytes, _) -> bytes
| Value value ->
let bytes = Binary_writer.to_bytes_exn le.encoding value in
le.state <- Both (bytes, value) ;
bytes
let lazy_encoding encoding =
let binary =
Encoding.conv
force_bytes
(fun bytes -> {state = Bytes bytes; encoding})
Encoding.bytes
in
let json =
Encoding.conv
(fun le ->
match force_decode le with
| Some r -> r
| None ->
raise
(Json_encoding.Cannot_destruct
( [],
Invalid_argument "error when decoding lazily encoded value"
)))
(fun value -> {state = Value value; encoding})
encoding
in
splitted ~json ~binary
let make_lazy encoding value = {encoding; state = Value value}
let apply_lazy ~fun_value ~fun_bytes ~fun_combine le =
match le.state with
| Value value -> fun_value value
| Bytes bytes -> fun_bytes bytes
| Both (bytes, value) -> fun_combine (fun_value value) (fun_bytes bytes)
module Compact = Compact
type 'a compact = 'a Compact.t
end
include Encoding
module With_version = With_version
module Registration = Registration
module Json = struct
include Json
include Json_stream
end
module Bson = Bson
module Binary_schema = Binary_schema
module Binary_stream = Binary_stream
module Binary = struct
include Binary_error_types
include Binary_error
include Binary_length
include Binary_writer
include Binary_reader
include Binary_stream_reader
module Slicer = Binary_slicer
let describe = Binary_description.describe
end
type json = Json.t
let json = Json.encoding
type json_schema = Json.schema
let json_schema = Json.schema_encoding
type bson = Bson.t