1use serde::{de::DeserializeOwned, Serialize};
27
28#[cfg(feature = "simd-json")]
33pub fn from_slice<T: DeserializeOwned>(slice: &[u8]) -> Result<T, JsonError> {
34 let mut slice_copy = slice.to_vec();
36 simd_json::from_slice(&mut slice_copy).map_err(JsonError::SimdJson)
37}
38
39#[cfg(not(feature = "simd-json"))]
43pub fn from_slice<T: DeserializeOwned>(slice: &[u8]) -> Result<T, JsonError> {
44 serde_json::from_slice(slice).map_err(JsonError::SerdeJson)
45}
46
47#[cfg(feature = "simd-json")]
52pub fn from_slice_mut<T: DeserializeOwned>(slice: &mut [u8]) -> Result<T, JsonError> {
53 simd_json::from_slice(slice).map_err(JsonError::SimdJson)
54}
55
56#[cfg(not(feature = "simd-json"))]
60pub fn from_slice_mut<T: DeserializeOwned>(slice: &mut [u8]) -> Result<T, JsonError> {
61 serde_json::from_slice(slice).map_err(JsonError::SerdeJson)
62}
63
64pub fn to_vec<T: Serialize>(value: &T) -> Result<Vec<u8>, JsonError> {
68 serde_json::to_vec(value).map_err(JsonError::SerdeJson)
69}
70
71pub fn to_vec_with_capacity<T: Serialize>(
76 value: &T,
77 capacity: usize,
78) -> Result<Vec<u8>, JsonError> {
79 let mut buf = Vec::with_capacity(capacity);
80 serde_json::to_writer(&mut buf, value).map_err(JsonError::SerdeJson)?;
81 Ok(buf)
82}
83
84pub fn to_vec_pretty<T: Serialize>(value: &T) -> Result<Vec<u8>, JsonError> {
86 serde_json::to_vec_pretty(value).map_err(JsonError::SerdeJson)
87}
88
89#[derive(Debug)]
91pub enum JsonError {
92 SerdeJson(serde_json::Error),
93 #[cfg(feature = "simd-json")]
94 SimdJson(simd_json::Error),
95}
96
97impl std::fmt::Display for JsonError {
98 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
99 match self {
100 JsonError::SerdeJson(e) => write!(f, "{}", e),
101 #[cfg(feature = "simd-json")]
102 JsonError::SimdJson(e) => write!(f, "{}", e),
103 }
104 }
105}
106
107impl std::error::Error for JsonError {
108 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
109 match self {
110 JsonError::SerdeJson(e) => Some(e),
111 #[cfg(feature = "simd-json")]
112 JsonError::SimdJson(e) => Some(e),
113 }
114 }
115}
116
117impl From<serde_json::Error> for JsonError {
118 fn from(e: serde_json::Error) -> Self {
119 JsonError::SerdeJson(e)
120 }
121}
122
123#[cfg(feature = "simd-json")]
124impl From<simd_json::Error> for JsonError {
125 fn from(e: simd_json::Error) -> Self {
126 JsonError::SimdJson(e)
127 }
128}