V1.Binarytype read_error = | Not_enough_dataDecoding requires more bytes than are available in the source of the data. E.g., there are fewer bytes available in the reading buffer than is required by the length field of a dynamically-sized string.
*)| Extra_bytesDecoding requires fewer bytes than were provided.
*)| No_case_matched| Unexpected_tag of int| Invalid_int of {}An integer is out of range. E.g., an integer is beyond a user-provided range.
*)| Invalid_float of {}A float is out of range.
*)| Trailing_zeroAn arbitrary-precision number (N or Z) leads to a null byte.
*)| Size_limit_exceededA value is encoded with more bytes than is allowed by the encoding. E.g., the constraints of a check_size are being broken.
| List_too_longA list contains more elements than is specified in its max_length parameter.
| Array_too_longAn array contains more elements than is specified in its max_length parameter.
| Exception_raised_in_user_function of string| User_invariant_guard of stringAll the errors that might be returned while reading a binary value
exception Read_error of read_errorRead_error e is an exception wrapping the read_error e. It is used only by function suffixed by _exn where the suffix-less function would have returned Error e.
val pp_read_error : Stdlib.Format.formatter -> read_error -> unitval read_error_encoding : read_error ttype write_error = All the errors that might be returned while writing a binary value
val pp_write_error : Stdlib.Format.formatter -> write_error -> unitval write_error_encoding : write_error texception Write_error of write_errorval length : 'a Encoding.t -> 'a -> intCompute the expected length of the binary representation of a value.
val fixed_length : 'a Encoding.t -> int optionReturns the size of the binary representation that the given encoding might produce, only when this size does not depends of the value itself.
E.g., fixed_length (tup2 int64 (Fixed.string 2)) is Some _
E.g., fixed_length (result int64 (Fixed.string 2)) is None
E.g., fixed_length (list (tup2 int64 (Fixed.string 2))) is None
val maximum_length : 'a Encoding.t -> int optionReturns the maximum size of the binary representation that the given encoding might produce, only when this maximum size does not depends of the value itself.
E.g., maximum_length (tup2 int64 (Fixed.string 2)) is Some _
E.g., maximum_length (result int64 (Fixed.string 2)) is Some _
E.g., maximum_length (list (tup2 int64 (Fixed.string 2))) is None
Note that the function assumes that recursive encodings (build using mu) are used for recursive data types. As a result, maximum_length will return None if given a recursive encoding.
If there are static guarantees about the maximum size of the representation for values of a given type, you can wrap your encoding in check_size. This will cause maximum_length to return Some _.
val read :
'a Encoding.t ->
string ->
int ->
int ->
(int * 'a, read_error) Stdlib.resultread enc buf ofs len tries to reconstruct a value from the bytes in buf starting at offset ofs and reading at most len bytes. This function also returns the offset of the first unread bytes in the buf.
The function will fail (returning Error _) if
buf designated by ofs and len are not compatible with the encoding enc (e.g., an integer is out the range specified in the encoding, or a union's tag is not recognised),len bytes to decode the value,conv or delayed) raises an exception,Other reading functions (of_string, of_bytes) may fail for the same reasons.
The returned value contains no pointer back to buf (as a whole or as sub-strings), even in the case where the encoding is or includes Fixed.string or Fixed.bytes.
val read_opt : 'a Encoding.t -> string -> int -> int -> (int * 'a) optionread_opt is like read but in case of failure, the error is ignored and None is returned instead.
val read_exn : 'a Encoding.t -> string -> int -> int -> int * 'aread_exn is like read but in case of failure, the error is wrapped in Read_error which is raised.
type 'ret status = | Success of {result : 'ret;size : int;stream : Binary_stream.t;}Fully decoded value, together with the total amount of bytes reads, and the remaining unread stream.
*)| Await of Stdlib.Bytes.t -> 'ret statusPartially decoded value.
*)| Error of read_errorFailure. The stream is garbled and it should be dropped.
*)Return type for the function read_stream.
val read_stream : ?init:Binary_stream.t -> 'a Encoding.t -> 'a statusStreamed equivalent of read.
read_stream e is Await k and you can use k to feed the first bytes to be decoded.
If you feed invalid bytes (i.e., bytes that do not match e) to k, it returns Error.
If you feed bytes that form a valid strict prefix for e, then it returns Await k, and you can use k to feed it more bytes.
If you feed it sufficient bytes to decode a whole value described by e, then it returns Success s where s.result is the decoded value, s.size is the number of bytes that were read to decode this value, and s.stream is the left-over stream.
The leftover stream may contain more bytes which you may treat however you like depending on your application. You may ignore padding bytes reserved for extensions (in which case you can simply ignore the stream). You may use the leftover stream to call read_stream again to decode the rest of the value.
read_stream ~init e is the same as let (Await k) = read_stream e in k b where b are the leftover bytes of init.
E.g., reading multiple values from a socket or some such source of bytes that becomes available as time goes by.
let iter socket encoding f =
let rec loop = function
| Success {result; size; stream} ->
log "read %d bytes" size;
f result (* apply iterator function on each decoded value *);
loop (read_stream ~init:stream e) (* continue with leftover *)
| Await k ->
loop (k (read_more_bytes_from socket))
| Error e ->
log "error: %a" pp_read_error e
in
loop (read_stream e)The internal state that writers handle. It is presented explicitly as an abstract type so that you must use the constructor to obtain it. The constructor (make_writer_state) performs basic bound checks.
val make_writer_state :
bytes ->
offset:int ->
allowed_bytes:int ->
writer_state optionmake_writer_state buffer ~offset ~allowed_bytes is None if allowed_bytes < 0, None if allowed_bytes > length buffer - offset, Some _ otherwise.
val write :
'a Encoding.t ->
'a ->
writer_state ->
(int, write_error) Stdlib.resultwrite enc v state where Some state is make_writer_state buffer ~offset ~allowed_bytes writes the binary enc representation of v onto buffer starting at offset. The function will fail (returning Error _) if the encoding would use more than allowed_bytes.
The function returns the offset of first unwritten bytes, or returns Error _ in case of failure. In the latter case, some data might have been written on the buffer.
val write_opt : 'a Encoding.t -> 'a -> writer_state -> int optionval write_exn : 'a Encoding.t -> 'a -> writer_state -> intval of_bytes :
'a Encoding.t ->
Stdlib.Bytes.t ->
('a, read_error) Stdlib.resultof_bytes enc buf is equivalent to read enc buf 0 (length buf). The function fails if the buffer is not fully read.
val of_bytes_opt : 'a Encoding.t -> Stdlib.Bytes.t -> 'a optionval of_bytes_exn : 'a Encoding.t -> Stdlib.Bytes.t -> 'aof_bytes_exn enc buf is equivalent to of_bytes, except
val of_string : 'a Encoding.t -> string -> ('a, read_error) Stdlib.resultof_string enc buf is like of_bytes enc buf but it reads bytes from a string.
val of_string_opt : 'a Encoding.t -> string -> 'a optionval of_string_exn : 'a Encoding.t -> string -> 'aval to_bytes :
?buffer_size:int ->
'a Encoding.t ->
'a ->
(Stdlib.Bytes.t, write_error) Stdlib.resultto_bytes enc v is the equivalent of write env buf 0 len where buf is a newly allocated buffer. The parameter buffer_size controls the initial size of buf.
val to_bytes_opt :
?buffer_size:int ->
'a Encoding.t ->
'a ->
Stdlib.Bytes.t optionval to_bytes_exn : ?buffer_size:int -> 'a Encoding.t -> 'a -> Stdlib.Bytes.tto_bytes_exn enc v is equivalent to to_bytes enc v, except
val to_string :
?buffer_size:int ->
'a Encoding.t ->
'a ->
(string, write_error) Stdlib.resultto_string enc v is like to_bytes but it returns a string.
Note: to_string enc v is always equal to Bytes.to_string (to_bytes enc v) but more efficient.
val to_string_opt : ?buffer_size:int -> 'a Encoding.t -> 'a -> string optionval to_string_exn : ?buffer_size:int -> 'a Encoding.t -> 'a -> stringval describe : 'a Encoding.t -> Binary_schema.tmodule Slicer : sig ... end