use bytes::Bytes;
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum Payload {
Binary(Bytes),
String(String),
}
impl From<&str> for Payload {
fn from(string: &str) -> Self {
Self::String(string.to_owned())
}
}
impl From<String> for Payload {
fn from(str: String) -> Self {
Self::String(str)
}
}
impl From<serde_json::Value> for Payload {
fn from(value: serde_json::Value) -> Self {
Self::String(value.to_string())
}
}
impl From<Vec<u8>> for Payload {
fn from(val: Vec<u8>) -> Self {
Self::Binary(Bytes::from(val))
}
}
impl From<&'static [u8]> for Payload {
fn from(val: &'static [u8]) -> Self {
Self::Binary(Bytes::from_static(val))
}
}
impl From<Bytes> for Payload {
fn from(bytes: Bytes) -> Self {
Self::Binary(bytes)
}
}
impl AsRef<[u8]> for Payload {
fn as_ref(&self) -> &[u8] {
match self {
Payload::Binary(b) => b.as_ref(),
Payload::String(s) => s.as_ref(),
}
}
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn test_from() {
let sut = Payload::from("foo ™");
assert_eq!(Payload::String(String::from("foo ™")), sut);
let sut = Payload::from(String::from("foo ™"));
assert_eq!(Payload::String(String::from("foo ™")), sut);
let sut = Payload::from(json!("foo ™"));
assert_eq!(Payload::String(String::from("\"foo ™\"")), sut);
let sut = Payload::from(vec![1, 2, 3]);
assert_eq!(Payload::Binary(Bytes::from_static(&[1, 2, 3])), sut);
let sut = Payload::from(&[1_u8, 2_u8, 3_u8][..]);
assert_eq!(Payload::Binary(Bytes::from_static(&[1, 2, 3])), sut);
let sut = Payload::from(Bytes::from_static(&[1, 2, 3]));
assert_eq!(Payload::Binary(Bytes::from_static(&[1, 2, 3])), sut);
}
}