Skip to main content

serde_ndim/
lib.rs

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
9/// Deserialization module.
10pub mod de;
11/// Serialization module.
12pub 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        // using `from_str` for better errors with locations
46        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}