use crate::message::flags::MsgFlags;
use crate::message::metadata::Metadata;
use bytes::Bytes;
use std::fmt;
#[derive(Clone, Default)]
pub struct Msg {
data: Option<Bytes>,
flags: MsgFlags,
metadata: Metadata, }
impl Msg {
pub fn new() -> Self {
Self::default()
}
pub fn from_vec(data: Vec<u8>) -> Self {
Self {
data: Some(Bytes::from(data)),
..Default::default()
}
}
pub fn from_bytes(data: Bytes) -> Self {
Self {
data: Some(data),
..Default::default()
}
}
pub fn from_static(data: &'static [u8]) -> Self {
Self {
data: Some(Bytes::from_static(data)),
..Default::default()
}
}
pub fn data(&self) -> Option<&[u8]> {
self.data.as_deref()
}
pub fn size(&self) -> usize {
self.data.as_ref().map_or(0, |d| d.len())
}
pub fn flags(&self) -> MsgFlags {
self.flags
}
pub fn set_flags(&mut self, flags: MsgFlags) {
self.flags = flags;
}
pub fn metadata(&self) -> &Metadata {
&self.metadata
}
pub fn metadata_mut(&mut self) -> &mut Metadata {
&mut self.metadata
}
pub fn is_more(&self) -> bool {
self.flags.contains(MsgFlags::MORE)
}
pub fn is_command(&self) -> bool {
self.flags.contains(MsgFlags::COMMAND)
}
pub fn data_bytes(&self) -> Option<Bytes> {
self.data.clone()
}
}
impl fmt::Debug for Msg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Msg")
.field("size", &self.size())
.field("flags", &self.flags)
.field("data", &self.data().map(|d| format!("{} bytes", d.len()))) .field("metadata", &self.metadata) .finish()
}
}