protocol.fields
Read, write, and manipulate field data.
Reader functions take [buf start ctx]
and return [end value-or-values]
where end
is the offset in buf
after the read value(s).
Writer functions take [buf value-or-values start ctx]
and return end
where end
is the offset in buf
after the written value(s).
int->octet
(int->octet n cnt)
Convert integer n
into cnt
octets/bytes (in MSB first order)
list->lookup
(list->lookup coll & idxs)
Takes columnar collection and one or more k-idx v-idx pairs and returns a map contructed from key/value pairs selected from k-idx
/v-idx
columns of coll
. If v-idx
does not exist for a given row then the value defaults to nil.
octet->int
(octet->int octets)
Convert sequence of octets/bytes octets
(in MSB first order) into an integer
read-bitfield
(read-bitfield buf start {:keys [path length spec le?], :as ctx})
Read length
bytes from buf
starting at start
and return a map of bitfields based on those bytes and the bitfield spec
. The bitfield spec
is a sequence [name type bits]
entries where name
is the bitfield key name, type
can be either :int
or :bool
(for integer and boolean bitfield respectively), and bits
is the number of bits to decode for that bitfield.
read-choice
(read-choice buf start {:keys [msg-map readers path choice-path choices], :as ctx})
Read using a reader and context that is selected based on a previously read value. The choice-path
vector is looked up in msg-map
(using get-in
) to get a choice key. The choice key is looked up in choices
to get a choice context map. The choice map must contain a :choice-type
that specifies the selected reader. Any other entries in the choice context map are merged into the new context for that reader.
read-lookup
(read-lookup buf start {:keys [readers path lookup-type lookup], :as ctx})
Read lookup-type
type from buf
at start
and lookup that key in lookup
to get the value to return
read-loop
(read-loop buf start {:keys [readers path loop-type length], :as ctx})
Read a sequence of loop-type
elements from buf
starting at start
. Elements will be read until either length is reached, the end of the buffer is reached, or the loop-type
reader returns a three-tuple [end value stop?]
with a truthy stop?
value.
read-repeat
(read-repeat buf start {:keys [readers path length repeat-type repeat-size], :as ctx})
Read a sequence of repeat-type
elements from buf
starting at start
. The number of elements read is length
/ repeat-size
write-bitfield
(write-bitfield buf bf-map start {:keys [spec path le?], :as ctx})
Write the bitfield values from bf-map
into buf
starting at start
and based on the bitfield spec
. The bitfield spec
is a sequence [name type bits]
entries where name
is the bitfield key in bf-map
, type
can be either :int
or :bool
(for integer and boolean bitfield respectively), and bits
is the number of bits to encode for that bitfield.
write-choice
(write-choice buf value start {:keys [msg-map writers path choice-path choices], :as ctx})
Write using a writer and context that is selected based on another value in msg-map
. The choice-path
vector is looked up in msg-map
(using get-in
) to get a choice key. The choice key is looked up in choices
to get a choice context map. The choice map must contain a :choice-type
that specifies the selected writer. Any other entries in the choice context map are merged into the new context for that writer.
write-lookup
(write-lookup buf k start {:keys [writers path lookup-type lookup], :as ctx})
Lookup k
in lookup
and write it as a lookup-type
type into buf
at start
write-loop
(write-loop buf values start {:keys [writers path loop-type], :as ctx})
Write a sequence of loop-type
elements into buf
starting at start
. All elements in values
will be written to the buffer.
write-repeat
(write-repeat buf values start {:keys [writers path repeat-type repeat-size], :as ctx})
Write a sequence of repeat-type
elements (of size repeat-size
) into buf
starting at start