macro_rules! impl_serde_vec2 { ($t:ty, $vec2:ident) => { /// Serialize as a sequence of 2 values. 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() } } /// Deserialize expects a sequence of 2 values. 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!("a sequence of 2 ", stringify!($t), " values")) } 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()); let deserialized = serde_json::from_str::<$vec2>(ST0); 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) => { /// Serialize as a sequence of 3 values. 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() } } /// Deserialize expects a sequence of 3 values. 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!("a sequence of 3 ", stringify!($t), " values")) } 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()); let deserialized = serde_json::from_str::<$vec3>(ST0); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_vec4 { ($t:ty, $vec4:ident) => { /// Serialize as a sequence of 4 values. 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() } } /// Deserialize expects a sequence of 4 values. 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!("a sequence of 4 ", stringify!($t), " values")) } 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()); let deserialized = serde_json::from_str::<$vec4>(ST0); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_quat { ($t:ty, $quat:ident) => { /// Serialize as a sequence of 4 values. 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() } } /// Deserialize expects a sequence of 4 values. 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!("a sequence of 4 ", stringify!($t), " values")) } 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()); let deserialized = serde_json::from_str::<$quat>("{}"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_mat2 { ($t:ty, $mat2:ident) => { /// Serialize as a sequence of 4 values. 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() } } /// Deserialize expects a sequence of 4 values. 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!("a sequence of 4 ", stringify!($t), "values")) } 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()); let deserialized = serde_json::from_str::<$mat2>("{}"); 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) => { /// Serialize as a sequence of 9 values. 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() } } /// Deserialize expects a sequence of 9 values. 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!("a sequence of 9 ", stringify!($t), "values")) } 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()); let deserialized = serde_json::from_str::<$mat3>("{}"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_mat4 { ($t:ty, $mat4:ident) => { /// Serialize as a sequence of 16 values. 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() } } /// Deserialize expects a sequence of 16 values. 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!("a sequence of 16 ", stringify!($t), "values")) } 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()); let deserialized = serde_json::from_str::<$mat4>("{}"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_affine2 { ($t:ty, $affine2:ident) => { /// Serialize as a sequence of 6 values. 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() } } /// Deserialize expects a sequence of 6 values. 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(&concat!("a sequence of 6 ", stringify!($t), "values")) } 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()); let deserialized = serde_json::from_str::<$affine2>("{}"); assert!(deserialized.is_err()); } }; } macro_rules! impl_serde_affine3 { ($t:ty, $affine3:ident) => { /// Serialize as a sequence of 12 values. 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() } } /// Deserialize expects a sequence of 12 values. 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(&concat!("a sequence of 12 ", stringify!($t), "values")) } 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()); let deserialized = serde_json::from_str::<$affine3>("{}"); 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_i8 { pub const V1: i8 = 1; pub const V2: i8 = 2; pub const V3: i8 = 3; pub const V4: i8 = 4; } #[cfg(test)] mod test_i16 { pub const V1: i16 = 1; pub const V2: i16 = 2; pub const V3: i16 = 3; pub const V4: i16 = 4; } #[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_i64 { pub const V1: i64 = 1; pub const V2: i64 = 2; pub const V3: i64 = 3; pub const V4: i64 = 4; } #[cfg(test)] mod test_u8 { pub const V1: u8 = 1; pub const V2: u8 = 2; pub const V3: u8 = 3; pub const V4: u8 = 4; } #[cfg(test)] mod test_u16 { pub const V1: u16 = 1; pub const V2: u16 = 2; pub const V3: u16 = 3; pub const V4: u16 = 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_u64 { pub const V1: u64 = 1; pub const V2: u64 = 2; pub const V3: u64 = 3; pub const V4: u64 = 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]"; pub const ST0: &str = "{}"; } #[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]"; pub const ST0: &str = "{}"; } #[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 ST0: &str = "{}"; 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(concat!("a sequence of 3 ", stringify!($t), "values")) } 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!("a sequence of 4 ", stringify!($t), "values")) } 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 i8 { #[cfg(test)] use super::test_i8::*; #[cfg(test)] use super::test_int::*; use crate::{I8Vec2, I8Vec3, I8Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(i8, I8Vec2, I8Vec3, I8Vec4); } mod i16 { #[cfg(test)] use super::test_i16::*; #[cfg(test)] use super::test_int::*; use crate::{I16Vec2, I16Vec3, I16Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(i16, I16Vec2, I16Vec3, I16Vec4); } 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 i64 { #[cfg(test)] use super::test_i64::*; #[cfg(test)] use super::test_int::*; use crate::{I64Vec2, I64Vec3, I64Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(i64, I64Vec2, I64Vec3, I64Vec4); } mod u8 { #[cfg(test)] use super::test_int::*; #[cfg(test)] use super::test_u8::*; use crate::{U8Vec2, U8Vec3, U8Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(u8, U8Vec2, U8Vec3, U8Vec4); } mod u16 { #[cfg(test)] use super::test_int::*; #[cfg(test)] use super::test_u16::*; use crate::{U16Vec2, U16Vec3, U16Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(u16, U16Vec2, U16Vec3, U16Vec4); } 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); } mod u64 { #[cfg(test)] use super::test_int::*; #[cfg(test)] use super::test_u64::*; use crate::{U64Vec2, U64Vec3, U64Vec4}; use core::fmt; use serde::{ de::{self, Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeTupleStruct, Serializer}, }; impl_serde_vec_types!(u64, U64Vec2, U64Vec3, U64Vec4); } mod euler { use crate::EulerRot; impl serde::Serialize for EulerRot { fn serialize(&self, serializer: S) -> Result { match *self { EulerRot::ZYX => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 0u32, "ZYX") } EulerRot::ZXY => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 1u32, "ZXY") } EulerRot::YXZ => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 2u32, "YXZ") } EulerRot::YZX => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 3u32, "YZX") } EulerRot::XYZ => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 4u32, "XYZ") } EulerRot::XZY => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 5u32, "XZY") } EulerRot::ZYZ => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 6u32, "ZYZ") } EulerRot::ZXZ => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 7u32, "ZXZ") } EulerRot::YXY => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 8u32, "YXY") } EulerRot::YZY => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 9u32, "YZY") } EulerRot::XYX => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 10u32, "XYX") } EulerRot::XZX => { serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 11u32, "XZX") } EulerRot::ZYXEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 12u32, "ZYXEx", ), EulerRot::ZXYEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 13u32, "ZXYEx", ), EulerRot::YXZEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 14u32, "YXZEx", ), EulerRot::YZXEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 15u32, "YZXEx", ), EulerRot::XYZEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 16u32, "XYZEx", ), EulerRot::XZYEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 17u32, "XZYEx", ), EulerRot::ZYZEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 18u32, "ZYZEx", ), EulerRot::ZXZEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 19u32, "ZXZEx", ), EulerRot::YXYEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 20u32, "YXYEx", ), EulerRot::YZYEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 21u32, "YZYEx", ), EulerRot::XYXEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 22u32, "XYXEx", ), EulerRot::XZXEx => serde::Serializer::serialize_unit_variant( serializer, "EulerRot", 23u32, "XZXEx", ), } } } impl<'de> serde::Deserialize<'de> for EulerRot { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { #[allow(clippy::upper_case_acronyms)] enum Field { ZYX, ZXY, YXZ, YZX, XYZ, XZY, ZYZ, ZXZ, YXY, YZY, XYX, XZX, ZYXEx, ZXYEx, YXZEx, YZXEx, XYZEx, XZYEx, ZYZEx, ZXZEx, YXYEx, YZYEx, XYXEx, XZXEx, } struct FieldVisitor; impl serde::de::Visitor<'_> for FieldVisitor { type Value = Field; fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { core::fmt::Formatter::write_str(formatter, "a variant identifier") } fn visit_u64(self, value: u64) -> Result where E: serde::de::Error, { match value { 0u64 => Ok(Field::ZYX), 1u64 => Ok(Field::ZXY), 2u64 => Ok(Field::YXZ), 3u64 => Ok(Field::YZX), 4u64 => Ok(Field::XYZ), 5u64 => Ok(Field::XZY), 6u64 => Ok(Field::ZYZ), 7u64 => Ok(Field::ZXZ), 8u64 => Ok(Field::YXY), 9u64 => Ok(Field::YZY), 10u64 => Ok(Field::XYX), 11u64 => Ok(Field::XZX), 12u64 => Ok(Field::ZYXEx), 13u64 => Ok(Field::ZXYEx), 14u64 => Ok(Field::YXZEx), 15u64 => Ok(Field::YZXEx), 16u64 => Ok(Field::XYZEx), 17u64 => Ok(Field::XZYEx), 18u64 => Ok(Field::ZYZEx), 19u64 => Ok(Field::ZXZEx), 20u64 => Ok(Field::YXYEx), 21u64 => Ok(Field::YZYEx), 22u64 => Ok(Field::XYXEx), 23u64 => Ok(Field::XZXEx), _ => Err(serde::de::Error::invalid_value( serde::de::Unexpected::Unsigned(value), &"variant index 0 <= i < 24", )), } } fn visit_str(self, value: &str) -> Result where E: serde::de::Error, { match value { "ZYX" => Ok(Field::ZYX), "ZXY" => Ok(Field::ZXY), "YXZ" => Ok(Field::YXZ), "YZX" => Ok(Field::YZX), "XYZ" => Ok(Field::XYZ), "XZY" => Ok(Field::XZY), "ZYZ" => Ok(Field::ZYZ), "ZXZ" => Ok(Field::ZXZ), "YXY" => Ok(Field::YXY), "YZY" => Ok(Field::YZY), "XYX" => Ok(Field::XYX), "XZX" => Ok(Field::XZX), "ZYXEx" => Ok(Field::ZYXEx), "ZXYEx" => Ok(Field::ZXYEx), "YXZEx" => Ok(Field::YXZEx), "YZXEx" => Ok(Field::YZXEx), "XYZEx" => Ok(Field::XYZEx), "XZYEx" => Ok(Field::XZYEx), "ZYZEx" => Ok(Field::ZYZEx), "ZXZEx" => Ok(Field::ZXZEx), "YXYEx" => Ok(Field::YXYEx), "YZYEx" => Ok(Field::YZYEx), "XYXEx" => Ok(Field::XYXEx), "XZXEx" => Ok(Field::XZXEx), _ => Err(serde::de::Error::unknown_variant(value, VARIANTS)), } } fn visit_bytes(self, value: &[u8]) -> Result where E: serde::de::Error, { match value { b"ZYX" => Ok(Field::ZYX), b"ZXY" => Ok(Field::ZXY), b"YXZ" => Ok(Field::YXZ), b"YZX" => Ok(Field::YZX), b"XYZ" => Ok(Field::XYZ), b"XZY" => Ok(Field::XZY), b"ZYZ" => Ok(Field::ZYZ), b"ZXZ" => Ok(Field::ZXZ), b"YXY" => Ok(Field::YXY), b"YZY" => Ok(Field::YZY), b"XYX" => Ok(Field::XYX), b"XZX" => Ok(Field::XZX), b"ZYXEx" => Ok(Field::ZYXEx), b"ZXYEx" => Ok(Field::ZXYEx), b"YXZEx" => Ok(Field::YXZEx), b"YZXEx" => Ok(Field::YZXEx), b"XYZEx" => Ok(Field::XYZEx), b"XZYEx" => Ok(Field::XZYEx), b"ZYZEx" => Ok(Field::ZYZEx), b"ZXZEx" => Ok(Field::ZXZEx), b"YXYEx" => Ok(Field::YXYEx), b"YZYEx" => Ok(Field::YZYEx), b"XYXEx" => Ok(Field::XYXEx), b"XZXEx" => Ok(Field::XZXEx), _ => { #[cfg(feature = "std")] let value = &String::from_utf8_lossy(value); #[cfg(not(feature = "std"))] let value = core::str::from_utf8(value).unwrap_or("\u{fffd}\u{fffd}\u{fffd}"); Err(serde::de::Error::unknown_variant(value, VARIANTS)) } } } } impl<'de> serde::Deserialize<'de> for Field { #[inline] fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { serde::Deserializer::deserialize_identifier(deserializer, FieldVisitor) } } struct Visitor<'de> { marker: core::marker::PhantomData, lifetime: core::marker::PhantomData<&'de ()>, } impl<'de> serde::de::Visitor<'de> for Visitor<'de> { type Value = EulerRot; fn expecting( &self, __formatter: &mut core::fmt::Formatter<'_>, ) -> core::fmt::Result { core::fmt::Formatter::write_str(__formatter, "an EulerRot enum") } fn visit_enum(self, data: A) -> Result where A: serde::de::EnumAccess<'de>, { match serde::de::EnumAccess::variant(data)? { (Field::ZYX, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZYX) } (Field::ZXY, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZXY) } (Field::YXZ, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YXZ) } (Field::YZX, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YZX) } (Field::XYZ, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XYZ) } (Field::XZY, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XZY) } (Field::ZYZ, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZYZ) } (Field::ZXZ, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZXZ) } (Field::YXY, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YXY) } (Field::YZY, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YZY) } (Field::XYX, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XYX) } (Field::XZX, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XZX) } (Field::ZYXEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZYXEx) } (Field::ZXYEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZXYEx) } (Field::YXZEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YXZEx) } (Field::YZXEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YZXEx) } (Field::XYZEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XYZEx) } (Field::XZYEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XZYEx) } (Field::ZYZEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZYZEx) } (Field::ZXZEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::ZXZEx) } (Field::YXYEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YXYEx) } (Field::YZYEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::YZYEx) } (Field::XYXEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XYXEx) } (Field::XZXEx, variant) => { serde::de::VariantAccess::unit_variant(variant)?; Ok(EulerRot::XZXEx) } } } } const VARIANTS: &[&str] = &[ "ZYX", "ZXY", "YXZ", "YZX", "XYZ", "XZY", "ZYZ", "ZXZ", "YXY", "YZY", "XYX", "XZX", "ZYXEx", "ZXYEx", "YXZEx", "YZXEx", "XYZEx", "XZYEx", "ZYZEx", "ZXZEx", "YXYEx", "YZYEx", "XYXEx", "XZXEx", ]; serde::Deserializer::deserialize_enum( deserializer, "EulerRot", VARIANTS, Visitor { marker: core::marker::PhantomData::, lifetime: core::marker::PhantomData, }, ) } } #[test] fn test_euler_rot_serde() { const PAIRS: [(EulerRot, &str); 24] = [ (EulerRot::ZYX, "\"ZYX\""), (EulerRot::ZXY, "\"ZXY\""), (EulerRot::YXZ, "\"YXZ\""), (EulerRot::YZX, "\"YZX\""), (EulerRot::XYZ, "\"XYZ\""), (EulerRot::XZY, "\"XZY\""), (EulerRot::ZYZ, "\"ZYZ\""), (EulerRot::ZXZ, "\"ZXZ\""), (EulerRot::YXY, "\"YXY\""), (EulerRot::YZY, "\"YZY\""), (EulerRot::XYX, "\"XYX\""), (EulerRot::XZX, "\"XZX\""), (EulerRot::ZYXEx, "\"ZYXEx\""), (EulerRot::ZXYEx, "\"ZXYEx\""), (EulerRot::YXZEx, "\"YXZEx\""), (EulerRot::YZXEx, "\"YZXEx\""), (EulerRot::XYZEx, "\"XYZEx\""), (EulerRot::XZYEx, "\"XZYEx\""), (EulerRot::ZYZEx, "\"ZYZEx\""), (EulerRot::ZXZEx, "\"ZXZEx\""), (EulerRot::YXYEx, "\"YXYEx\""), (EulerRot::YZYEx, "\"YZYEx\""), (EulerRot::XYXEx, "\"XYXEx\""), (EulerRot::XZXEx, "\"XZXEx\""), ]; for (enum_value, enum_string) in PAIRS { let serialized = serde_json::to_string(&enum_value).unwrap(); assert_eq!(enum_string, serialized); let deserialized = serde_json::from_str(&serialized).unwrap(); assert_eq!(enum_value, deserialized); } } }