1#![cfg_attr(feature = "docs_rs", feature(doc_cfg))]
2#![warn(missing_docs)]
3#![doc = include_str!("../README.md")]
4#![cfg_attr(not(feature = "std"), no_std)]
5
6#[cfg(not(feature = "std"))]
7extern crate alloc as std;
8
9pub mod de;
11pub mod ser;
13
14#[cfg(feature = "nalgebra")]
15mod nalgebra;
16#[cfg(feature = "ndarray")]
17mod ndarray;
18
19pub use de::deserialize;
20pub use ser::serialize;
21
22#[cfg(test)]
23mod tests {
24 use serde::de::DeserializeOwned;
25 use serde::{Deserialize, Serialize};
26 use std::fmt::Debug;
27
28 #[derive(Debug, Serialize, Deserialize)]
29 #[serde(transparent)]
30 #[serde(bound(
31 serialize = "for<'a> &'a A: crate::ser::NDim, for<'a> <&'a A as IntoIterator>::Item: Serialize",
32 deserialize = "A: crate::de::MakeNDim, A::Item: Deserialize<'de>"
33 ))]
34 pub(crate) struct TestWrapper<A>(#[serde(with = "crate")] pub(crate) A);
35
36 pub(crate) fn test_roundtrip<A: crate::de::MakeNDim>(
37 json: serde_json::Value,
38 ) -> Result<A, format_serde_error::SerdeError>
39 where
40 for<'a> &'a A: crate::ser::NDim,
41 for<'a> <&'a A as IntoIterator>::Item: Serialize,
42 <A as crate::de::MakeNDim>::Item: DeserializeOwned,
43 {
44 let json_string = serde_json::to_string_pretty(&json).unwrap();
45 match serde_json::from_str::<TestWrapper<A>>(&json_string) {
47 Ok(wrapper) => {
48 let new_json = serde_json::to_value(&wrapper).unwrap();
49 assert_eq!(
50 json, new_json,
51 "Roundtrip mismatch\nOriginal input: {json:#}\nAfter roundtrip: {new_json:#}"
52 );
53 Ok(wrapper.0)
54 }
55 Err(err) => Err(format_serde_error::SerdeError::new(json_string, err)),
56 }
57 }
58}