#![allow(unused_imports)]
use serde::{Serialize, Deserialize};
use log::{error, info};
use arbitrary::Arbitrary;
impl<'a> Arbitrary<'a> for MessageFormat {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
let choice = u.int_in_range(0..=1)?;
match choice {
0 => Ok(MessageFormat::Json),
1 => Ok(MessageFormat::Cbor),
_ => unreachable!(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
pub enum MessageFormat {
Json,
Cbor,
}
pub struct MessageHandler;
impl MessageHandler {
pub fn serialize<T: Serialize>(data: &T, format: MessageFormat) -> Result<Vec<u8>, String> {
match format {
MessageFormat::Json => Self::private_serialize_json(data),
MessageFormat::Cbor => Self::private_serialize_cbor(data),
}
}
pub fn deserialize<'a, T: Deserialize<'a>>(data: &'a [u8], format: MessageFormat) -> Result<Option<T>, String> {
match format {
MessageFormat::Json => Self::private_deserialize_json(data),
MessageFormat::Cbor => Self::private_deserialize_cbor(data),
}
}
fn private_serialize_json<T: Serialize>(data: &T) -> Result<Vec<u8>, String> {
serde_json::to_vec(data).map_err(|e| {
error!("Failed to serialize JSON: {}", e);
format!("Failed to serialize JSON: {}", e)
})
}
fn private_serialize_cbor<T: Serialize>(data: &T) -> Result<Vec<u8>, String> {
serde_cbor::to_vec(data).map_err(|e| {
error!("Failed to serialize CBOR: {}", e);
format!("Failed to serialize CBOR: {}", e)
})
}
fn private_deserialize_json<'a, T: Deserialize<'a>>(data: &'a [u8]) -> Result<Option<T>, String> {
serde_json::from_slice(data).map(|v| Some(v)).map_err(|e| {
error!("Failed to deserialize JSON: {}", e);
format!("Failed to deserialize JSON: {}", e)
})
}
fn private_deserialize_cbor<'a, T: Deserialize<'a>>(data: &'a [u8]) -> Result<Option<T>, String> {
serde_cbor::from_slice(data).map(|v| Some(v)).map_err(|e| {
error!("Failed to deserialize CBOR: {}", e);
format!("Failed to deserialize CBOR: {}", e)
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_json_serialization() {
let message = "Hello, WebSocket!";
let serialized = MessageHandler::serialize(&message, MessageFormat::Json);
assert!(serialized.is_ok(), "Expected successful JSON serialization");
let serialized = serialized.unwrap();
assert!(!serialized.is_empty(), "Expected non-empty JSON serialized data");
let deserialized: Result<Option<String>, String> = MessageHandler::deserialize(&serialized, MessageFormat::Json);
assert!(deserialized.is_ok(), "Expected successful JSON deserialization");
assert_eq!(deserialized.unwrap(), Some(message.to_string()), "Expected deserialized JSON to match original message");
}
#[test]
fn test_cbor_serialization() {
let message = "Hello, WebSocket!";
let serialized = MessageHandler::serialize(&message, MessageFormat::Cbor);
assert!(serialized.is_ok(), "Expected successful CBOR serialization");
let serialized = serialized.unwrap();
assert!(!serialized.is_empty(), "Expected non-empty CBOR serialized data");
let deserialized: Result<Option<String>, String> = MessageHandler::deserialize(&serialized, MessageFormat::Cbor);
assert!(deserialized.is_ok(), "Expected successful CBOR deserialization");
assert_eq!(deserialized.unwrap(), Some(message.to_string()), "Expected deserialized CBOR to match original message");
}
}