pub struct SubgroupObjectMeta {
pub object_id: u64,
pub extension_headers_len: u64,
pub payload_length: u64,
pub status: Option<u64>,
pub wire_len: u64,
}Expand description
The framing of one draft-15 subgroup object, without its payload.
Produced by SubgroupObjectReader::read_object_meta for callers that
forward an object’s bytes verbatim and never inspect the payload.
Fields§
§object_id: u64Resolved absolute Object ID.
extension_headers_len: u64Byte length of the extension-header block’s contents, excluding its length prefix.
payload_length: u64Declared payload length. Zero when status is Some.
status: Option<u64>Object status wire code, present only when the payload is empty.
Kept as the raw code, unlike SubgroupObject::object_status: a meta
is produced by SubgroupObjectReader::read_object_meta and is never
an encode input, and a relay that reads a status on one draft may hand
it to a draft that numbers the same value differently. The code is
still one draft-15 assigns — read_object_meta refuses the others.
wire_len: u64Total bytes this object occupies on the wire, prefix fields included.
Implementations§
Source§impl SubgroupObjectMeta
impl SubgroupObjectMeta
Sourcepub fn payload_permission(&self) -> Option<PayloadPermission>
pub fn payload_permission(&self) -> Option<PayloadPermission>
Whether this object is permitted a non-empty payload, or None when
Self::status holds a code draft-15 does not assign.
Self::status is a raw wire code, so the rule of draft-15 Section
10.2.1.1 — “Any object with a status code other than zero MUST have an
empty payload” — cannot be read off it without first deciding what the
code means. This does that decision once: a consumer asking whether an
object may carry bytes gets an answer instead of a number and a rule to
apply to it.
An absent status answers PayloadPermission::Permitted rather than
None. A meta has no status only when its payload length is non-zero,
and Section 10.2.1.1 says of Normal that “This status is implicit for
any non-zero length object” — the object has a status, the encoding just
does not spell it.
None means the code is one the draft leaves unassigned, and so one it
gives no payload rule for. That is not reachable through
SubgroupObjectReader::read_object_meta, which refuses such a code
before it can reach the field, but the fields here are public and a meta
assembled by hand — by a relay carrying a status across from a draft that
numbers them differently, say — can hold anything a varint can. The
answer there is that draft-15 has none, not that the payload is
forbidden.
Sourcepub fn extensions_permitted(&self) -> Option<bool>
pub fn extensions_permitted(&self) -> Option<bool>
Whether this object’s status is allowed to carry the extension block it declares.
The same rule SubgroupObject::extensions_permitted answers, from the
declared length rather than from the bytes. A relay that forwards an
object verbatim reads it through
SubgroupObjectReader::read_object_meta and never copies the block, so
asking this must not require having it — draft-15 Section 10.2.1.2 turns
on whether the block is empty, and the length says that on its own.
A status this draft does not assign answers None rather than false,
for the reason Self::payload_permission gives: the draft states no
rule for a code it does not define, and a meta assembled by hand can
hold one. read_object_meta refuses such a code before it reaches the
field.
An absent status answers from Normal. A meta has no status only when its payload length is non-zero, and such an object is Normal by Section 10.2.1.1, so its extensions are permitted.
Trait Implementations§
Source§impl Clone for SubgroupObjectMeta
impl Clone for SubgroupObjectMeta
Source§fn clone(&self) -> SubgroupObjectMeta
fn clone(&self) -> SubgroupObjectMeta
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more