#[cfg(feature = "simd")]
pub struct SimdJsonUtils;
#[cfg(feature = "simd")]
impl SimdJsonUtils {
#[inline]
pub fn from_json_bytes<T>(bytes: &mut [u8]) -> rocketmq_error::Result<T>
where
T: serde::de::DeserializeOwned,
{
simd_json::from_slice(bytes).map_err(|source| crate::error::serialization_source("decode", "SIMD-JSON", source))
}
#[inline]
pub fn from_json_slice<T>(bytes: &mut [u8]) -> rocketmq_error::Result<T>
where
T: serde::de::DeserializeOwned,
{
Self::from_json_bytes(bytes)
}
#[inline]
pub fn from_json_str<T>(json: &str) -> rocketmq_error::Result<T>
where
T: serde::de::DeserializeOwned,
{
let mut bytes = json.as_bytes().to_vec();
simd_json::from_slice(&mut bytes)
.map_err(|source| crate::error::serialization_source("decode", "SIMD-JSON", source))
}
#[inline]
pub fn serialize_json<T>(value: &T) -> rocketmq_error::Result<String>
where
T: serde::Serialize,
{
simd_json::to_string(value).map_err(|source| crate::error::serialization_source("encode", "SIMD-JSON", source))
}
#[inline]
pub fn serialize_json_pretty<T>(value: &T) -> rocketmq_error::Result<String>
where
T: serde::Serialize,
{
serde_json::to_string_pretty(value)
.map_err(|error| crate::error::serialization_source("serialize", "JSON", error))
}
#[inline]
pub fn serialize_json_vec<T>(value: &T) -> rocketmq_error::Result<Vec<u8>>
where
T: serde::Serialize,
{
simd_json::to_vec(value).map_err(|source| crate::error::serialization_source("encode", "SIMD-JSON", source))
}
#[inline]
pub fn serialize_json_vec_pretty<T>(value: &T) -> rocketmq_error::Result<Vec<u8>>
where
T: serde::Serialize,
{
serde_json::to_vec_pretty(value).map_err(|error| crate::error::serialization_source("serialize", "JSON", error))
}
#[inline]
pub fn serialize_json_to_writer<T>(writer: &mut Vec<u8>, value: &T) -> rocketmq_error::Result<()>
where
T: serde::Serialize,
{
simd_json::to_writer(writer, value)
.map_err(|source| crate::error::serialization_source("encode", "SIMD-JSON", source))
}
}
#[cfg(all(test, feature = "simd"))]
mod tests {
use serde::Deserialize;
use serde::Serialize;
use serde_json::json;
use serde_json::Value;
use super::*;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct TestStruct {
name: String,
age: u8,
}
#[test]
fn test_from_json_str_success() {
let json_str = r#"{"name":"Alice","age":30}"#;
let expected = TestStruct {
name: "Alice".to_string(),
age: 30,
};
let result: TestStruct = SimdJsonUtils::from_json_str(json_str).unwrap();
assert_eq!(result, expected);
}
#[test]
fn test_from_json_str_error() {
let json_str = r#"{"name":"Alice","age":"thirty"}"#;
let result: rocketmq_error::Result<TestStruct> = SimdJsonUtils::from_json_str(json_str);
assert!(result.is_err());
}
#[test]
fn test_from_json_bytes_success() {
let mut json_data = br#"{"name":"Bob","age":25}"#.to_vec();
let expected = TestStruct {
name: "Bob".to_string(),
age: 25,
};
let result: TestStruct = SimdJsonUtils::from_json_bytes(&mut json_data).unwrap();
assert_eq!(result, expected);
}
#[test]
fn test_from_json_bytes_error() {
let mut json_data = br#"{"name":"Bob","age":"twenty-five"}"#.to_vec();
let result: rocketmq_error::Result<TestStruct> = SimdJsonUtils::from_json_bytes(&mut json_data);
assert!(result.is_err());
}
#[test]
fn test_from_json_slice_success() {
let mut json_slice = br#"{"name":"Charlie","age":35}"#.to_vec();
let expected = TestStruct {
name: "Charlie".to_string(),
age: 35,
};
let result: TestStruct = SimdJsonUtils::from_json_slice(&mut json_slice).unwrap();
assert_eq!(result, expected);
}
#[test]
fn test_serialize_json_success() {
let value = TestStruct {
name: "David".to_string(),
age: 40,
};
let result: String = SimdJsonUtils::serialize_json(&value).unwrap();
assert!(result.contains("David"));
assert!(result.contains("40"));
}
#[test]
fn test_serialize_json_vec_success() {
let value = TestStruct {
name: "Eve".to_string(),
age: 28,
};
let result: Vec<u8> = SimdJsonUtils::serialize_json_vec(&value).unwrap();
let result_str = String::from_utf8(result).unwrap();
assert!(result_str.contains("Eve"));
assert!(result_str.contains("28"));
}
#[test]
fn test_serialize_json_pretty_success() {
let value = TestStruct {
name: "Frank".to_string(),
age: 45,
};
let result: String = SimdJsonUtils::serialize_json_pretty(&value).unwrap();
assert!(result.contains('\n'));
assert!(result.contains("Frank"));
}
#[test]
fn test_serialize_json_vec_pretty_success() {
let value = TestStruct {
name: "Grace".to_string(),
age: 32,
};
let result: Vec<u8> = SimdJsonUtils::serialize_json_vec_pretty(&value).unwrap();
let result_str = String::from_utf8(result).unwrap();
assert!(result_str.contains('\n'));
assert!(result_str.contains("Grace"));
}
#[test]
fn test_serialize_json_to_writer_success() {
let value = TestStruct {
name: "Henry".to_string(),
age: 50,
};
let mut writer = Vec::new();
let result = SimdJsonUtils::serialize_json_to_writer(&mut writer, &value);
assert!(result.is_ok());
let result_str = String::from_utf8(writer).unwrap();
assert!(result_str.contains("Henry"));
assert!(result_str.contains("50"));
}
#[test]
fn test_roundtrip() {
let original = TestStruct {
name: "Isabella".to_string(),
age: 27,
};
let json_str = SimdJsonUtils::serialize_json(&original).unwrap();
let deserialized: TestStruct = SimdJsonUtils::from_json_str(&json_str).unwrap();
assert_eq!(original, deserialized);
}
#[test]
fn test_complex_types() {
let value = json!({
"string": "test",
"number": 42,
"boolean": true,
"null": null,
"array": [1, 2, 3],
"object": {"nested": "value"}
});
let json_str = SimdJsonUtils::serialize_json(&value).unwrap();
let deserialized: Value = SimdJsonUtils::from_json_str(&json_str).unwrap();
assert_eq!(value["string"], deserialized["string"]);
assert_eq!(value["number"], deserialized["number"]);
assert_eq!(value["boolean"], deserialized["boolean"]);
}
#[test]
fn test_large_payload() {
let large_struct = TestStruct {
name: "X".repeat(1000),
age: 99,
};
let json_vec = SimdJsonUtils::serialize_json_vec(&large_struct).unwrap();
let mut json_vec_mut = json_vec.clone();
let deserialized: TestStruct = SimdJsonUtils::from_json_bytes(&mut json_vec_mut).unwrap();
assert_eq!(large_struct, deserialized);
}
#[test]
fn test_empty_struct() {
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct EmptyStruct {}
let empty = EmptyStruct {};
let json_str = SimdJsonUtils::serialize_json(&empty).unwrap();
let deserialized: EmptyStruct = SimdJsonUtils::from_json_str(&json_str).unwrap();
assert_eq!(empty, deserialized);
}
#[test]
fn test_vector_serialization() {
let vec_data = vec![1, 2, 3, 4, 5];
let json_str = SimdJsonUtils::serialize_json(&vec_data).unwrap();
let deserialized: Vec<i32> = SimdJsonUtils::from_json_str(&json_str).unwrap();
assert_eq!(vec_data, deserialized);
}
}