Skip to main content

grafix_toolbox/kit/policies/func/
serde.rs

1#[cfg(not(feature = "adv_fs"))]
2pub mod ser {}
3#[cfg(feature = "adv_fs")]
4pub mod ser {
5	pub use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
6
7	pub fn from_vec<R: de::DeserializeOwned>(v: impl Borrow<[u8]>) -> Res<R> {
8		Ok(serde_json::from_slice(v.borrow()).fail())
9	}
10
11	pub fn to_vec<T: Serialize>(v: T) -> Res<Vec<u8>> {
12		serde_json::to_vec(&v).res()
13	}
14
15	pub fn make_true() -> bool {
16		true
17	}
18
19	pub mod as_byte_slice {
20		pub fn serialize<T, S: Serializer>(v: &[T], s: S) -> Result<S::Ok, S::Error> {
21			let (_, b, _) = unsafe { v.align_to::<u8>() };
22			let b = faster_hex::hex_string(b);
23			(v.len(), b).serialize(s)
24		}
25		pub fn deserialize<'de, T: Copy + Default, D: Deserializer<'de>>(d: D) -> Result<Box<[T]>, D::Error> {
26			let (l, s) = <(usize, String)>::deserialize(d)?;
27			let s = s.as_bytes();
28
29			if s.len() != l * type_size::<T>() * 2 {
30				Err(de::Error::custom(format!("Cannot deserialize [Hex; {}] into [{}; {l}]", s.len(), type_name::<T>())))?
31			}
32
33			let mut aligned = vec![T::default(); l];
34			{
35				let a = unsafe { std::slice::from_raw_parts_mut(aligned.as_mut_ptr() as *mut u8, s.len() / 2) };
36				faster_hex::hex_decode(s, a).explain_err(|| "Hex decode failed").map_err(de::Error::custom)?;
37			}
38
39			Ok(aligned.into())
40		}
41		use super::*;
42	}
43
44	use crate::lib::*;
45}