moqtap-codec 0.5.0

MoQT (Media over QUIC Transport) wire codec — draft-07 through draft-20 message encoding/decoding
Documentation
//! Draft-14 specific types.
//!
//! Types in this module are specific to draft-14 wire values and are kept
//! separate from the shared [`crate::types`] module so that other drafts
//! can continue to use their own enums without collision.

/// Object status values, from MoQ Transport draft-14 Section 10.2.1.1
/// "Object Status".
///
/// Status is a varint on the wire. The draft assigns 0x0, 0x1, 0x3 and 0x4, and
/// says of everything else: "Any other value SHOULD be treated as a protocol
/// error and the session SHOULD be terminated with a PROTOCOL_VIOLATION".
/// [`ObjectStatus::from_u64`] answers `None` for 0x2 and for every other
/// unassigned value.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ObjectStatus {
    /// Normal object. Implicit for non-zero length; zero-length objects must
    /// encode this explicitly.
    Normal = 0x0,
    /// This Object does not exist at any publisher.
    ObjectDoesNotExist = 0x1,
    /// End of Group. Object ID is one greater than the largest in the group
    /// (or 0 if the group is empty).
    EndOfGroup = 0x3,
    /// End of Track.
    EndOfTrack = 0x4,
}

impl ObjectStatus {
    /// Every status draft-14 assigns, in ascending wire order.
    ///
    /// This is exactly the set [`ObjectStatus::from_u64`] accepts. Any other
    /// value is one the draft does not assign.
    pub const ALL: &[ObjectStatus] = &[
        ObjectStatus::Normal,
        ObjectStatus::ObjectDoesNotExist,
        ObjectStatus::EndOfGroup,
        ObjectStatus::EndOfTrack,
    ];

    /// Convert a raw wire value to [`ObjectStatus`], or `None` if draft-14 does
    /// not assign that value.
    pub fn from_u64(v: u64) -> Option<Self> {
        match v {
            0x0 => Some(ObjectStatus::Normal),
            0x1 => Some(ObjectStatus::ObjectDoesNotExist),
            0x3 => Some(ObjectStatus::EndOfGroup),
            0x4 => Some(ObjectStatus::EndOfTrack),
            _ => None,
        }
    }

    /// Return the wire value.
    pub fn as_u64(self) -> u64 {
        self as u64
    }
}