use std::fmt;
pub enum FramePayload {
Owned(Vec<u8>),
DmaBuf {
fd: i32,
len: usize,
},
}
impl FramePayload {
pub fn owned(bytes: Vec<u8>) -> Self {
FramePayload::Owned(bytes)
}
pub fn dma_buf(fd: i32, len: usize) -> Self {
FramePayload::DmaBuf { fd, len }
}
pub fn is_dma_buf(&self) -> bool {
matches!(self, FramePayload::DmaBuf { .. })
}
pub fn is_owned(&self) -> bool {
matches!(self, FramePayload::Owned(_))
}
pub fn len(&self) -> usize {
match self {
FramePayload::Owned(v) => v.len(),
FramePayload::DmaBuf { len, .. } => *len,
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn bytes(&self) -> Option<&[u8]> {
match self {
FramePayload::Owned(v) => Some(v.as_slice()),
FramePayload::DmaBuf { .. } => None,
}
}
pub fn dma_buf_fd(&self) -> Option<i32> {
match self {
FramePayload::DmaBuf { fd, .. } => Some(*fd),
FramePayload::Owned(_) => None,
}
}
pub fn dma_buf_len(&self) -> Option<usize> {
match self {
FramePayload::DmaBuf { len, .. } => Some(*len),
FramePayload::Owned(_) => None,
}
}
}
impl fmt::Debug for FramePayload {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FramePayload::Owned(v) => write!(f, "FramePayload::Owned({} bytes)", v.len()),
FramePayload::DmaBuf { fd, len } => {
write!(f, "FramePayload::DmaBuf {{ fd: {fd}, len: {len} }}")
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn owned_roundtrip() {
let p = FramePayload::owned(vec![1, 2, 3, 4]);
assert!(p.is_owned());
assert!(!p.is_dma_buf());
assert_eq!(p.len(), 4);
assert!(!p.is_empty());
assert_eq!(p.bytes(), Some(&[1u8, 2, 3, 4][..]));
assert_eq!(p.dma_buf_fd(), None);
assert_eq!(p.dma_buf_len(), None);
}
#[test]
fn dma_buf_accessors() {
let p = FramePayload::dma_buf(42, 1920 * 1080 * 3 / 2); assert!(!p.is_owned());
assert!(p.is_dma_buf());
assert_eq!(p.dma_buf_fd(), Some(42));
assert_eq!(p.dma_buf_len(), Some(1920 * 1080 * 3 / 2));
assert!(p.bytes().is_none());
}
#[test]
fn empty_owned_payload() {
let p = FramePayload::owned(vec![]);
assert!(p.is_empty());
}
#[test]
fn debug_format_identifies_variant() {
let owned_dbg = format!("{:?}", FramePayload::owned(vec![0; 100]));
assert!(owned_dbg.contains("Owned"));
assert!(owned_dbg.contains("100"));
let dma_dbg = format!("{:?}", FramePayload::dma_buf(7, 2_073_600));
assert!(dma_dbg.contains("DmaBuf"));
assert!(dma_dbg.contains("fd: 7"));
}
}