parent
59818a01fa
commit
a662560c66
@ -0,0 +1,149 @@ |
|||||||
|
use bytes::Bytes; |
||||||
|
|
||||||
|
/// Binary message data
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
pub struct MessageData(MessageDataImpl); |
||||||
|
|
||||||
|
/// opaque inner type to allow modifying the implementation in the future
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
enum MessageDataImpl { |
||||||
|
Shared(Bytes), |
||||||
|
Unique(Vec<u8>), |
||||||
|
} |
||||||
|
|
||||||
|
impl MessageData { |
||||||
|
pub fn len(&self) -> usize { |
||||||
|
self.as_ref().len() |
||||||
|
} |
||||||
|
|
||||||
|
fn make_unique(&mut self) { |
||||||
|
if let MessageDataImpl::Shared(data) = &self.0 { |
||||||
|
self.0 = MessageDataImpl::Unique(Vec::from(data.as_ref())); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl PartialEq for MessageData { |
||||||
|
fn eq(&self, other: &MessageData) -> bool { |
||||||
|
self.as_ref().eq(other.as_ref()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Eq for MessageData {} |
||||||
|
|
||||||
|
impl From<MessageData> for Vec<u8> { |
||||||
|
fn from(data: MessageData) -> Vec<u8> { |
||||||
|
match data.0 { |
||||||
|
MessageDataImpl::Shared(data) => { |
||||||
|
let mut bytes = Vec::with_capacity(data.len()); |
||||||
|
bytes.copy_from_slice(data.as_ref()); |
||||||
|
bytes |
||||||
|
} |
||||||
|
MessageDataImpl::Unique(data) => data, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<MessageData> for Bytes { |
||||||
|
fn from(data: MessageData) -> Bytes { |
||||||
|
match data.0 { |
||||||
|
MessageDataImpl::Shared(data) => data, |
||||||
|
MessageDataImpl::Unique(data) => data.into(), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl AsRef<[u8]> for MessageData { |
||||||
|
fn as_ref(&self) -> &[u8] { |
||||||
|
match &self.0 { |
||||||
|
MessageDataImpl::Shared(data) => data.as_ref(), |
||||||
|
MessageDataImpl::Unique(data) => data.as_ref(), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl AsMut<[u8]> for MessageData { |
||||||
|
fn as_mut(&mut self) -> &mut [u8] { |
||||||
|
self.make_unique(); |
||||||
|
match &mut self.0 { |
||||||
|
MessageDataImpl::Unique(data) => data.as_mut_slice(), |
||||||
|
MessageDataImpl::Shared(_) => unreachable!("Data has just been made unique"), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// String message data
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
pub struct MessageStringData(MessageStringDataImpl); |
||||||
|
|
||||||
|
/// opaque inner type to allow modifying the implementation in the future
|
||||||
|
#[derive(Debug, Clone)] |
||||||
|
enum MessageStringDataImpl { |
||||||
|
Static(&'static str), |
||||||
|
Unique(String), |
||||||
|
} |
||||||
|
|
||||||
|
impl PartialEq for MessageStringData { |
||||||
|
fn eq(&self, other: &MessageStringData) -> bool { |
||||||
|
self.as_ref().eq(other.as_ref()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Eq for MessageStringData {} |
||||||
|
|
||||||
|
impl From<MessageStringData> for String { |
||||||
|
fn from(data: MessageStringData) -> String { |
||||||
|
match data.0 { |
||||||
|
MessageStringDataImpl::Static(data) => data.into(), |
||||||
|
MessageStringDataImpl::Unique(data) => data, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<MessageStringData> for MessageData { |
||||||
|
fn from(data: MessageStringData) -> MessageData { |
||||||
|
match data.0 { |
||||||
|
MessageStringDataImpl::Static(data) => MessageData::from(data.as_bytes()), |
||||||
|
MessageStringDataImpl::Unique(data) => MessageData::from(data.into_bytes()), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl AsRef<str> for MessageStringData { |
||||||
|
fn as_ref(&self) -> &str { |
||||||
|
match &self.0 { |
||||||
|
MessageStringDataImpl::Static(data) => *data, |
||||||
|
MessageStringDataImpl::Unique(data) => data.as_ref(), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<String> for MessageStringData { |
||||||
|
fn from(string: String) -> MessageStringData { |
||||||
|
MessageStringData(MessageStringDataImpl::Unique(string)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<&'static str> for MessageStringData { |
||||||
|
fn from(string: &'static str) -> MessageStringData { |
||||||
|
MessageStringData(MessageStringDataImpl::Static(string)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<Vec<u8>> for MessageData { |
||||||
|
fn from(data: Vec<u8>) -> MessageData { |
||||||
|
MessageData(MessageDataImpl::Unique(data)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<&'static [u8]> for MessageData { |
||||||
|
fn from(data: &'static [u8]) -> MessageData { |
||||||
|
MessageData(MessageDataImpl::Shared(Bytes::from_static(data))) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<Bytes> for MessageData { |
||||||
|
fn from(data: Bytes) -> MessageData { |
||||||
|
MessageData(MessageDataImpl::Shared(data)) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue