package tezos-protocol-environment
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=ad9e08819871c75ba6f4530b125f7d157799398e4d77a1e6bfea9d91ff37ff55
sha512=c5dc4d40cc09bc6980fbbdb5c2e105bf4252cf9cfcb2b49660b0ebe4dc789f6709ec3b3bf2f87d81580d3eed9521eeb1c960f24d9b14eb0285aaba1f84d10a9b
doc/tezos-protocol-environment.structs/Tezos_protocol_environment_structs/V0/Data_encoding/Binary/index.html
Module Data_encoding.Binary
Source
include module type of struct include Data_encoding.Binary end
type read_error = Data_encoding.Binary.read_error =
| Not_enough_data
(*Decoding 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_bytes
(*Decoding 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_zero
(*An arbitrary-precision number (N or Z) leads to a null byte.
*)| Size_limit_exceeded
(*A 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_long
(*A list contains more elements than is specified in its
*)max_length
parameter.| Array_too_long
(*An array contains more elements than is specified in its
*)max_length
parameter.| Exception_raised_in_user_function of string
| User_invariant_guard of string
All the errors that might be returned while reading a binary value
Read_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
.
type write_error = Data_encoding.Binary.write_error =
All the errors that might be returned while writing a binary value
Compute the expected length of the binary representation of a value.
Returns 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
Returns 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 _
.
read_opt
is like read
but in case of failure, the error is ignored and None
is returned instead.
read_exn
is like read
but in case of failure, the error is wrapped in Read_error
which is raised.
type 'ret status = 'ret Data_encoding.Binary.status =
| Success of {
result : 'ret;
size : int;
stream : Data_encoding.Binary_stream.t;
}
(*Fully decoded value, together with the total amount of bytes reads, and the remaining unread stream.
*)| Await of Bytes.t -> 'ret status
(*Partially decoded value.
*)| Error of read_error
(*Failure. The stream is garbled and it should be dropped.
*)
Return type for the function read_stream
.
val read_stream :
?init:Data_encoding.Binary_stream.t ->
'a Data_encoding.Encoding.t ->
'a status
Streamed 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.
make_writer_state buffer ~offset ~allowed_bytes
is None
if allowed_bytes < 0
, None
if allowed_bytes > length buffer - offset
, Some _
otherwise.
of_bytes_exn enc buf
is equivalent to of_bytes
, except
of_string enc buf
is like of_bytes enc buf
but it reads bytes from a string.
val to_string :
?buffer_size:int ->
'a Data_encoding.Encoding.t ->
'a ->
(string, write_error) result
to_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.