macro_rules! impl_serde_vec2 { ($t:ty, $vec2:ident) => { impl Serialize for $vec2 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!($vec2), 2)?; state.serialize_field(&self.x)?; state.serialize_field(&self.y)?; state.end() } } impl<'de> Deserialize<'de> for $vec2 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Vec2Visitor; impl<'de> Visitor<'de> for Vec2Visitor { type Value = $vec2; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($vec2))) } fn visit_seq(self, mut seq: V) -> Result<$vec2, V::Error> where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; Ok($vec2::new(x, y)) } } deserializer.deserialize_tuple_struct(stringify!($vec2), 2, Vec2Visitor) } } #[test] fn test_vec2_serde() { let a = $vec2::new(V1, V2); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(SX2, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$vec2>(SX0); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec2>(SX1); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec2>(SX3); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_vec3 { ($t:ty, $vec3:ident) => { impl_serde_vec3!($t, $vec3, test_vec3_serde); }; ($t:ty, $vec3:ident, $test_name:ident) => { impl Serialize for $vec3 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!($vec3), 3)?; state.serialize_field(&self.x)?; state.serialize_field(&self.y)?; state.serialize_field(&self.z)?; state.end() } } impl<'de> Deserialize<'de> for $vec3 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Vec3Visitor; impl<'de> Visitor<'de> for Vec3Visitor { type Value = $vec3; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($vec3))) } fn visit_seq(self, mut seq: V) -> Result<$vec3, V::Error> where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; let z = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(2, &self))?; Ok($vec3::new(x, y, z)) } } deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor) } } #[test] fn $test_name() { let a = $vec3::new(V1, V2, V3); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(SX3, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$vec3>(SX0); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec3>(SX1); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec3>(SX2); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec3>(SX4); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_vec4 { ($t:ty, $vec4:ident) => { impl Serialize for $vec4 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!($vec4), 4)?; state.serialize_field(&self.x)?; state.serialize_field(&self.y)?; state.serialize_field(&self.z)?; state.serialize_field(&self.w)?; state.end() } } impl<'de> Deserialize<'de> for $vec4 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Vec4Visitor; impl<'de> Visitor<'de> for Vec4Visitor { type Value = $vec4; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($vec4))) } fn visit_seq(self, mut seq: V) -> Result<$vec4, V::Error> where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; let z = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(2, &self))?; let w = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(3, &self))?; Ok($vec4::new(x, y, z, w)) } } deserializer.deserialize_tuple_struct(stringify!($vec4), 4, Vec4Visitor) } } #[test] fn test_vec4_serde() { let a = $vec4::new(V1, V2, V3, V4); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(SX4, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$vec4>(SX0); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec4>(SX1); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec4>(SX2); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec4>(SX3); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$vec4>(SX5); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_quat { ($t:ty, $quat:ident) => { impl Serialize for $quat { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!($quat), 4)?; state.serialize_field(&self.x)?; state.serialize_field(&self.y)?; state.serialize_field(&self.z)?; state.serialize_field(&self.w)?; state.end() } } impl<'de> Deserialize<'de> for $quat { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct QuatVisitor; impl<'de> Visitor<'de> for QuatVisitor { type Value = $quat; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($quat))) } fn visit_seq(self, mut seq: V) -> Result<$quat, V::Error> where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; let z = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(2, &self))?; let w = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(3, &self))?; Ok($quat::from_xyzw(x, y, z, w)) } } deserializer.deserialize_tuple_struct(stringify!($quat), 4, QuatVisitor) } } #[test] fn test_quat_serde() { let a = $quat::from_xyzw(1.0, 2.0, 3.0, 4.0); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(serialized, "[1.0,2.0,3.0,4.0]"); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$quat>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$quat>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$quat>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_mat2 { ($t:ty, $mat2:ident) => { impl Serialize for $mat2 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let f: &[_; 4] = self.as_ref(); let mut state = serializer.serialize_tuple_struct(stringify!($mat2), 4)?; state.serialize_field(&f[0])?; state.serialize_field(&f[1])?; state.serialize_field(&f[2])?; state.serialize_field(&f[3])?; state.end() } } impl<'de> Deserialize<'de> for $mat2 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Mat2Visitor; impl<'de> Visitor<'de> for Mat2Visitor { type Value = $mat2; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($mat2))) } fn visit_seq(self, mut seq: V) -> Result<$mat2, V::Error> where V: SeqAccess<'de>, { let mut f = { [0.0; 4] }; for i in 0..4 { f[i] = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(i, &self))?; } Ok($mat2::from_cols_array(&f)) } } deserializer.deserialize_tuple_struct(stringify!($mat2), 4, Mat2Visitor) } } #[test] fn test_mat2_serde() { let a = $mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(serialized, "[1.0,2.0,3.0,4.0]"); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$mat2>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat2>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat2>("[[1.0,2.0],[3.0,4.0]]"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_mat3 { ($t:ty, $mat3:ident) => { impl_serde_mat3!($t, $mat3, test_mat3_serde); }; ($t:ty, $mat3:ident, $test_name:ident) => { impl Serialize for $mat3 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let (m00, m01, m02) = self.x_axis.into(); let (m10, m11, m12) = self.y_axis.into(); let (m20, m21, m22) = self.z_axis.into(); let mut state = serializer.serialize_tuple_struct(stringify!($mat3), 9)?; state.serialize_field(&m00)?; state.serialize_field(&m01)?; state.serialize_field(&m02)?; state.serialize_field(&m10)?; state.serialize_field(&m11)?; state.serialize_field(&m12)?; state.serialize_field(&m20)?; state.serialize_field(&m21)?; state.serialize_field(&m22)?; state.end() } } impl<'de> Deserialize<'de> for $mat3 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Mat3Visitor; impl<'de> Visitor<'de> for Mat3Visitor { type Value = $mat3; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($mat3))) } fn visit_seq(self, mut seq: V) -> Result<$mat3, V::Error> where V: SeqAccess<'de>, { let mut f = { [0.0; 9] }; for i in 0..9 { f[i] = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(i, &self))?; } Ok($mat3::from_cols_array(&f)) } } deserializer.deserialize_tuple_struct(stringify!($mat3), 9, Mat3Visitor) } } #[test] fn $test_name() { let a = $mat3::from_cols_array(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(serialized, "[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]"); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$mat3>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat3>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_mat4 { ($t:ty, $mat4:ident) => { impl Serialize for $mat4 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!($mat4), 16)?; for f in self.as_ref() { state.serialize_field(f)?; } state.end() } } impl<'de> Deserialize<'de> for $mat4 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Mat4Visitor; impl<'de> Visitor<'de> for Mat4Visitor { type Value = $mat4; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!($mat4))) } fn visit_seq(self, mut seq: V) -> Result<$mat4, V::Error> where V: SeqAccess<'de>, { let mut f = { [0.0; 16] }; for i in 0..16 { f[i] = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(i, &self))?; } Ok($mat4::from_cols_array(&f)) } } deserializer.deserialize_tuple_struct(stringify!($mat4), 16, Mat4Visitor) } } #[test] fn test_mat4_serde() { let a = $mat4::from_cols_array(&[ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, ]); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!( serialized, "[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0]" ); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$mat4>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$mat4>( "[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0],[9.0,10.0,11.0,12.0][13.0,14.0,15.0,16.0]]", ); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_affine2 { ($t:ty, $affine2:ident) => { impl Serialize for $affine2 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { // Serialize column-wise as 3x4 matrix: let mut state = serializer.serialize_tuple_struct(stringify!($affine2), 6)?; state.serialize_field(&self.x_axis.x)?; state.serialize_field(&self.x_axis.y)?; state.serialize_field(&self.y_axis.x)?; state.serialize_field(&self.y_axis.y)?; state.serialize_field(&self.z_axis.x)?; state.serialize_field(&self.z_axis.y)?; state.end() } } impl<'de> Deserialize<'de> for $affine2 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Affine2Visitor; impl<'de> Visitor<'de> for Affine2Visitor { type Value = $affine2; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("struct $affine2") } fn visit_seq(self, mut seq: V) -> Result<$affine2, V::Error> where V: SeqAccess<'de>, { let mut f = [0.0; 6]; for (i, v) in f.iter_mut().enumerate() { *v = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(i, &self))?; } Ok($affine2::from_cols_array(&f)) } } deserializer.deserialize_tuple_struct(stringify!($affine2), 6, Affine2Visitor) } } #[test] fn test_affine2_serde() { let a = $affine2::from_cols_array(&[1.0, 0.0, 2.0, 0.0, 3.0, 4.0]); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(serialized, "[1.0,0.0,2.0,0.0,3.0,4.0]"); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$affine2>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>("[[1.0,2.0],[3.0,4.0],[5.0,6.0]]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine2>( "[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0],[9.0,10.0,11.0,12.0][13.0,14.0,15.0,16.0]]", ); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_affine3 { ($t:ty, $affine3:ident) => { impl Serialize for $affine3 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { // Serialize column-wise as 3x4 matrix: let mut state = serializer.serialize_tuple_struct(stringify!($affine3), 12)?; state.serialize_field(&self.x_axis.x)?; state.serialize_field(&self.x_axis.y)?; state.serialize_field(&self.x_axis.z)?; state.serialize_field(&self.y_axis.x)?; state.serialize_field(&self.y_axis.y)?; state.serialize_field(&self.y_axis.z)?; state.serialize_field(&self.z_axis.x)?; state.serialize_field(&self.z_axis.y)?; state.serialize_field(&self.z_axis.z)?; state.serialize_field(&self.w_axis.x)?; state.serialize_field(&self.w_axis.y)?; state.serialize_field(&self.w_axis.z)?; state.end() } } impl<'de> Deserialize<'de> for $affine3 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Affine3Visitor; impl<'de> Visitor<'de> for Affine3Visitor { type Value = $affine3; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("struct $affine3") } fn visit_seq(self, mut seq: V) -> Result<$affine3, V::Error> where V: SeqAccess<'de>, { let mut f = [0.0; 12]; for (i, v) in f.iter_mut().enumerate() { *v = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(i, &self))?; } Ok($affine3::from_cols_array(&f)) } } deserializer.deserialize_tuple_struct(stringify!($affine3), 12, Affine3Visitor) } } #[test] fn test_affine3_serde() { let a = $affine3::from_cols_array(&[ 1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0, 6.0, ]); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!( serialized, "[1.0,0.0,0.0,0.0,2.0,0.0,0.0,0.0,3.0,4.0,5.0,6.0]" ); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::<$affine3>("[]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>("[1.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0,4.0,5.0]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]"); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::<$affine3>( "[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0],[9.0,10.0,11.0,12.0][13.0,14.0,15.0,16.0]]", ); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_vec_types { ($t:ty, $vec2:ident, $vec3:ident, $vec4:ident) => { impl_serde_vec2!($t, $vec2); impl_serde_vec3!($t, $vec3); impl_serde_vec4!($t, $vec4); }; } macro_rules! impl_serde_float_types { ($t:ty, $affine2:ident, $affine3:ident, $mat2:ident, $mat3:ident, $mat4:ident, $quat:ident, $vec2:ident, $vec3:ident, $vec4:ident) => { impl_serde_affine2!($t, $affine2); impl_serde_affine3!($t, $affine3); impl_serde_mat2!($t, $mat2); impl_serde_mat3!($t, $mat3); impl_serde_mat4!($t, $mat4); impl_serde_quat!($t, $quat); impl_serde_vec_types!($t, $vec2, $vec3, $vec4); }; } #[cfg(test)] mod test_f32 { pub const V1: f32 = 1.0; pub const V2: f32 = 2.0; pub const V3: f32 = 3.0; pub const V4: f32 = 4.0; } #[cfg(test)] mod test_f64 { pub const V1: f64 = 1.0; pub const V2: f64 = 2.0; pub const V3: f64 = 3.0; pub const V4: f64 = 4.0; } #[cfg(test)] mod test_i32 { pub const V1: i32 = 1; pub const V2: i32 = 2; pub const V3: i32 = 3; pub const V4: i32 = 4; } #[cfg(test)] mod test_u32 { pub const V1: u32 = 1; pub const V2: u32 = 2; pub const V3: u32 = 3; pub const V4: u32 = 4; } #[cfg(test)] mod test_float { pub const SX0: &str = "[]"; pub const SX1: &str = "[1.0]"; pub const SX2: &str = "[1.0,2.0]"; pub const SX3: &str = "[1.0,2.0,3.0]"; pub const SX4: &str = "[1.0,2.0,3.0,4.0]"; pub const SX5: &str = "[1.0,2.0,3.0,4.0,5.0]"; } #[cfg(test)] mod test_int { pub const SX0: &str = "[]"; pub const SX1: &str = "[1]"; pub const SX2: &str = "[1,2]"; pub const SX3: &str = "[1,2,3]"; pub const SX4: &str = "[1,2,3,4]"; pub const SX5: &str = "[1,2,3,4,5]"; } #[cfg(test)] mod test_bool_mask { pub const SX0: &str = "[]"; pub const SX1: &str = "[true]"; pub const SX2: &str = "[true,true]"; pub const SX3: &str = "[true,true,true]"; pub const SX4: &str = "[true,true,true,true]"; pub const SX5: &str = "[true,true,true,true,true]"; pub const V1: bool = true; pub const V2: bool = true; pub const V3: bool = true; pub const V4: bool = true; } mod bool { #[cfg(test)] use super::test_bool_mask::*; use crate::{BVec2, BVec3, BVec4}; #[cfg(not(feature = "scalar-math"))] use crate::{BVec3A, BVec4A}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec2!(bool, BVec2); impl_serde_vec3!(bool, BVec3); impl_serde_vec4!(bool, BVec4); #[cfg(not(feature = "scalar-math"))] impl Serialize for BVec3A { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct("BVec3A", 3)?; let a: [bool; 3] = (*self).into(); state.serialize_field(&a[0])?; state.serialize_field(&a[1])?; state.serialize_field(&a[2])?; state.end() } } #[cfg(not(feature = "scalar-math"))] impl<'de> Deserialize<'de> for BVec3A { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Vec3Visitor; impl<'de> Visitor<'de> for Vec3Visitor { type Value = BVec3A; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("struct BVec3A") } fn visit_seq(self, mut seq: V) -> Result where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; let z = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(2, &self))?; Ok(BVec3A::new(x, y, z)) } } deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor) } } #[cfg(not(feature = "scalar-math"))] #[test] fn test_bvec3a_serde() { let a = BVec3A::new(V1, V2, V3); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(SX3, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::(SX0); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX1); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX2); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX4); assert!(deserialized.is_err()); } #[cfg(not(feature = "scalar-math"))] impl Serialize for BVec4A { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_tuple_struct(stringify!(BVec4A), 4)?; let a: [bool; 4] = (*self).into(); state.serialize_field(&a[0])?; state.serialize_field(&a[1])?; state.serialize_field(&a[2])?; state.serialize_field(&a[2])?; state.end() } } #[cfg(not(feature = "scalar-math"))] impl<'de> Deserialize<'de> for BVec4A { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Vec4Visitor; impl<'de> Visitor<'de> for Vec4Visitor { type Value = BVec4A; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str(concat!("struct ", stringify!(BVec4A))) } fn visit_seq(self, mut seq: V) -> Result where V: SeqAccess<'de>, { let x = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let y = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; let z = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(2, &self))?; let w = seq .next_element()? .ok_or_else(|| de::Error::invalid_length(3, &self))?; Ok(BVec4A::new(x, y, z, w)) } } deserializer.deserialize_tuple_struct(stringify!(BVec4A), 4, Vec4Visitor) } } #[cfg(not(feature = "scalar-math"))] #[test] fn test_bvec4a_serde() { let a = BVec4A::new(V1, V2, V3, V4); let serialized = serde_json::to_string(&a).unwrap(); assert_eq!(SX4, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(a, deserialized); let deserialized = serde_json::from_str::(SX0); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX1); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX2); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX3); assert!(deserialized.is_err()); let deserialized = serde_json::from_str::(SX5); assert!(deserialized.is_err()); } } mod f32 { #[cfg(test)] use super::test_f32::*; #[cfg(test)] use super::test_float::*; use crate::{Affine2, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_float_types!(f32, Affine2, Affine3A, Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec4); impl_serde_mat3!(f32, Mat3A, test_mat3a_serde); impl_serde_vec3!(f32, Vec3A, test_vec3a_serde); } mod f64 { #[cfg(test)] use super::test_f64::*; #[cfg(test)] use super::test_float::*; use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_float_types!( f64, DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4 ); } mod i32 { #[cfg(test)] use super::test_i32::*; #[cfg(test)] use super::test_int::*; use crate::{IVec2, IVec3, IVec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(i32, IVec2, IVec3, IVec4); } mod u32 { #[cfg(test)] use super::test_int::*; #[cfg(test)] use super::test_u32::*; use crate::{UVec2, UVec3, UVec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(u32, UVec2, UVec3, UVec4); }