glam/features/
impl_serde.rs

1macro_rules! impl_serde_vec2 {
2    ($t:ty, $vec2:ident) => {
3        impl Serialize for $vec2 {
4            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
5            where
6                S: Serializer,
7            {
8                let mut state = serializer.serialize_tuple_struct(stringify!($vec2), 2)?;
9                state.serialize_field(&self.x)?;
10                state.serialize_field(&self.y)?;
11                state.end()
12            }
13        }
14
15        impl<'de> Deserialize<'de> for $vec2 {
16            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
17            where
18                D: Deserializer<'de>,
19            {
20                struct Vec2Visitor;
21
22                impl<'de> Visitor<'de> for Vec2Visitor {
23                    type Value = $vec2;
24
25                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
26                        formatter.write_str(concat!("struct ", stringify!($vec2)))
27                    }
28
29                    fn visit_seq<V>(self, mut seq: V) -> Result<$vec2, V::Error>
30                    where
31                        V: SeqAccess<'de>,
32                    {
33                        let x = seq
34                            .next_element()?
35                            .ok_or_else(|| de::Error::invalid_length(0, &self))?;
36                        let y = seq
37                            .next_element()?
38                            .ok_or_else(|| de::Error::invalid_length(1, &self))?;
39                        Ok($vec2::new(x, y))
40                    }
41                }
42
43                deserializer.deserialize_tuple_struct(stringify!($vec2), 2, Vec2Visitor)
44            }
45        }
46
47        #[test]
48        fn test_vec2_serde() {
49            let a = $vec2::new(V1, V2);
50            let serialized = serde_json::to_string(&a).unwrap();
51            assert_eq!(SX2, serialized);
52            let deserialized = serde_json::from_str(&serialized).unwrap();
53            assert_eq!(a, deserialized);
54            let deserialized = serde_json::from_str::<$vec2>(SX0);
55            assert!(deserialized.is_err());
56            let deserialized = serde_json::from_str::<$vec2>(SX1);
57            assert!(deserialized.is_err());
58            let deserialized = serde_json::from_str::<$vec2>(SX3);
59            assert!(deserialized.is_err());
60        }
61    };
62}
63
64macro_rules! impl_serde_vec3 {
65    ($t:ty, $vec3:ident) => {
66        impl_serde_vec3!($t, $vec3, test_vec3_serde);
67    };
68    ($t:ty, $vec3:ident, $test_name:ident) => {
69        impl Serialize for $vec3 {
70            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
71            where
72                S: Serializer,
73            {
74                let mut state = serializer.serialize_tuple_struct(stringify!($vec3), 3)?;
75                state.serialize_field(&self.x)?;
76                state.serialize_field(&self.y)?;
77                state.serialize_field(&self.z)?;
78                state.end()
79            }
80        }
81
82        impl<'de> Deserialize<'de> for $vec3 {
83            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
84            where
85                D: Deserializer<'de>,
86            {
87                struct Vec3Visitor;
88
89                impl<'de> Visitor<'de> for Vec3Visitor {
90                    type Value = $vec3;
91
92                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
93                        formatter.write_str(concat!("struct ", stringify!($vec3)))
94                    }
95
96                    fn visit_seq<V>(self, mut seq: V) -> Result<$vec3, V::Error>
97                    where
98                        V: SeqAccess<'de>,
99                    {
100                        let x = seq
101                            .next_element()?
102                            .ok_or_else(|| de::Error::invalid_length(0, &self))?;
103                        let y = seq
104                            .next_element()?
105                            .ok_or_else(|| de::Error::invalid_length(1, &self))?;
106                        let z = seq
107                            .next_element()?
108                            .ok_or_else(|| de::Error::invalid_length(2, &self))?;
109                        Ok($vec3::new(x, y, z))
110                    }
111                }
112
113                deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor)
114            }
115        }
116
117        #[test]
118        fn $test_name() {
119            let a = $vec3::new(V1, V2, V3);
120            let serialized = serde_json::to_string(&a).unwrap();
121            assert_eq!(SX3, serialized);
122            let deserialized = serde_json::from_str(&serialized).unwrap();
123            assert_eq!(a, deserialized);
124            let deserialized = serde_json::from_str::<$vec3>(SX0);
125            assert!(deserialized.is_err());
126            let deserialized = serde_json::from_str::<$vec3>(SX1);
127            assert!(deserialized.is_err());
128            let deserialized = serde_json::from_str::<$vec3>(SX2);
129            assert!(deserialized.is_err());
130            let deserialized = serde_json::from_str::<$vec3>(SX4);
131            assert!(deserialized.is_err());
132        }
133    };
134}
135
136macro_rules! impl_serde_vec4 {
137    ($t:ty, $vec4:ident) => {
138        impl Serialize for $vec4 {
139            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
140            where
141                S: Serializer,
142            {
143                let mut state = serializer.serialize_tuple_struct(stringify!($vec4), 4)?;
144                state.serialize_field(&self.x)?;
145                state.serialize_field(&self.y)?;
146                state.serialize_field(&self.z)?;
147                state.serialize_field(&self.w)?;
148                state.end()
149            }
150        }
151
152        impl<'de> Deserialize<'de> for $vec4 {
153            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
154            where
155                D: Deserializer<'de>,
156            {
157                struct Vec4Visitor;
158
159                impl<'de> Visitor<'de> for Vec4Visitor {
160                    type Value = $vec4;
161
162                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
163                        formatter.write_str(concat!("struct ", stringify!($vec4)))
164                    }
165
166                    fn visit_seq<V>(self, mut seq: V) -> Result<$vec4, V::Error>
167                    where
168                        V: SeqAccess<'de>,
169                    {
170                        let x = seq
171                            .next_element()?
172                            .ok_or_else(|| de::Error::invalid_length(0, &self))?;
173                        let y = seq
174                            .next_element()?
175                            .ok_or_else(|| de::Error::invalid_length(1, &self))?;
176                        let z = seq
177                            .next_element()?
178                            .ok_or_else(|| de::Error::invalid_length(2, &self))?;
179                        let w = seq
180                            .next_element()?
181                            .ok_or_else(|| de::Error::invalid_length(3, &self))?;
182                        Ok($vec4::new(x, y, z, w))
183                    }
184                }
185
186                deserializer.deserialize_tuple_struct(stringify!($vec4), 4, Vec4Visitor)
187            }
188        }
189
190        #[test]
191        fn test_vec4_serde() {
192            let a = $vec4::new(V1, V2, V3, V4);
193            let serialized = serde_json::to_string(&a).unwrap();
194            assert_eq!(SX4, serialized);
195            let deserialized = serde_json::from_str(&serialized).unwrap();
196            assert_eq!(a, deserialized);
197            let deserialized = serde_json::from_str::<$vec4>(SX0);
198            assert!(deserialized.is_err());
199            let deserialized = serde_json::from_str::<$vec4>(SX1);
200            assert!(deserialized.is_err());
201            let deserialized = serde_json::from_str::<$vec4>(SX2);
202            assert!(deserialized.is_err());
203            let deserialized = serde_json::from_str::<$vec4>(SX3);
204            assert!(deserialized.is_err());
205            let deserialized = serde_json::from_str::<$vec4>(SX5);
206            assert!(deserialized.is_err());
207        }
208    };
209}
210
211macro_rules! impl_serde_quat {
212    ($t:ty, $quat:ident) => {
213        impl Serialize for $quat {
214            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
215            where
216                S: Serializer,
217            {
218                let mut state = serializer.serialize_tuple_struct(stringify!($quat), 4)?;
219                state.serialize_field(&self.x)?;
220                state.serialize_field(&self.y)?;
221                state.serialize_field(&self.z)?;
222                state.serialize_field(&self.w)?;
223                state.end()
224            }
225        }
226
227        impl<'de> Deserialize<'de> for $quat {
228            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
229            where
230                D: Deserializer<'de>,
231            {
232                struct QuatVisitor;
233
234                impl<'de> Visitor<'de> for QuatVisitor {
235                    type Value = $quat;
236
237                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
238                        formatter.write_str(concat!("struct ", stringify!($quat)))
239                    }
240
241                    fn visit_seq<V>(self, mut seq: V) -> Result<$quat, V::Error>
242                    where
243                        V: SeqAccess<'de>,
244                    {
245                        let x = seq
246                            .next_element()?
247                            .ok_or_else(|| de::Error::invalid_length(0, &self))?;
248                        let y = seq
249                            .next_element()?
250                            .ok_or_else(|| de::Error::invalid_length(1, &self))?;
251                        let z = seq
252                            .next_element()?
253                            .ok_or_else(|| de::Error::invalid_length(2, &self))?;
254                        let w = seq
255                            .next_element()?
256                            .ok_or_else(|| de::Error::invalid_length(3, &self))?;
257                        Ok($quat::from_xyzw(x, y, z, w))
258                    }
259                }
260
261                deserializer.deserialize_tuple_struct(stringify!($quat), 4, QuatVisitor)
262            }
263        }
264
265        #[test]
266        fn test_quat_serde() {
267            let a = $quat::from_xyzw(1.0, 2.0, 3.0, 4.0);
268            let serialized = serde_json::to_string(&a).unwrap();
269            assert_eq!(serialized, "[1.0,2.0,3.0,4.0]");
270            let deserialized = serde_json::from_str(&serialized).unwrap();
271            assert_eq!(a, deserialized);
272            let deserialized = serde_json::from_str::<$quat>("[]");
273            assert!(deserialized.is_err());
274            let deserialized = serde_json::from_str::<$quat>("[1.0]");
275            assert!(deserialized.is_err());
276            let deserialized = serde_json::from_str::<$quat>("[1.0,2.0]");
277            assert!(deserialized.is_err());
278            let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0]");
279            assert!(deserialized.is_err());
280            let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0,4.0,5.0]");
281            assert!(deserialized.is_err());
282        }
283    };
284}
285
286macro_rules! impl_serde_mat2 {
287    ($t:ty, $mat2:ident) => {
288        impl Serialize for $mat2 {
289            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
290            where
291                S: Serializer,
292            {
293                let f: &[_; 4] = self.as_ref();
294                let mut state = serializer.serialize_tuple_struct(stringify!($mat2), 4)?;
295                state.serialize_field(&f[0])?;
296                state.serialize_field(&f[1])?;
297                state.serialize_field(&f[2])?;
298                state.serialize_field(&f[3])?;
299                state.end()
300            }
301        }
302
303        impl<'de> Deserialize<'de> for $mat2 {
304            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
305            where
306                D: Deserializer<'de>,
307            {
308                struct Mat2Visitor;
309
310                impl<'de> Visitor<'de> for Mat2Visitor {
311                    type Value = $mat2;
312
313                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
314                        formatter.write_str(concat!("struct ", stringify!($mat2)))
315                    }
316
317                    fn visit_seq<V>(self, mut seq: V) -> Result<$mat2, V::Error>
318                    where
319                        V: SeqAccess<'de>,
320                    {
321                        let mut f = { [0.0; 4] };
322                        for i in 0..4 {
323                            f[i] = seq
324                                .next_element()?
325                                .ok_or_else(|| de::Error::invalid_length(i, &self))?;
326                        }
327                        Ok($mat2::from_cols_array(&f))
328                    }
329                }
330
331                deserializer.deserialize_tuple_struct(stringify!($mat2), 4, Mat2Visitor)
332            }
333        }
334
335        #[test]
336        fn test_mat2_serde() {
337            let a = $mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]);
338            let serialized = serde_json::to_string(&a).unwrap();
339            assert_eq!(serialized, "[1.0,2.0,3.0,4.0]");
340            let deserialized = serde_json::from_str(&serialized).unwrap();
341            assert_eq!(a, deserialized);
342            let deserialized = serde_json::from_str::<$mat2>("[]");
343            assert!(deserialized.is_err());
344            let deserialized = serde_json::from_str::<$mat2>("[1.0]");
345            assert!(deserialized.is_err());
346            let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0]");
347            assert!(deserialized.is_err());
348            let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0]");
349            assert!(deserialized.is_err());
350            let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0,4.0,5.0]");
351            assert!(deserialized.is_err());
352            let deserialized = serde_json::from_str::<$mat2>("[[1.0,2.0],[3.0,4.0]]");
353            assert!(deserialized.is_err());
354        }
355    };
356}
357
358macro_rules! impl_serde_mat3 {
359    ($t:ty, $mat3:ident) => {
360        impl_serde_mat3!($t, $mat3, test_mat3_serde);
361    };
362    ($t:ty, $mat3:ident, $test_name:ident) => {
363        impl Serialize for $mat3 {
364            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
365            where
366                S: Serializer,
367            {
368                let (m00, m01, m02) = self.x_axis.into();
369                let (m10, m11, m12) = self.y_axis.into();
370                let (m20, m21, m22) = self.z_axis.into();
371
372                let mut state = serializer.serialize_tuple_struct(stringify!($mat3), 9)?;
373                state.serialize_field(&m00)?;
374                state.serialize_field(&m01)?;
375                state.serialize_field(&m02)?;
376                state.serialize_field(&m10)?;
377                state.serialize_field(&m11)?;
378                state.serialize_field(&m12)?;
379                state.serialize_field(&m20)?;
380                state.serialize_field(&m21)?;
381                state.serialize_field(&m22)?;
382                state.end()
383            }
384        }
385
386        impl<'de> Deserialize<'de> for $mat3 {
387            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
388            where
389                D: Deserializer<'de>,
390            {
391                struct Mat3Visitor;
392
393                impl<'de> Visitor<'de> for Mat3Visitor {
394                    type Value = $mat3;
395
396                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
397                        formatter.write_str(concat!("struct ", stringify!($mat3)))
398                    }
399
400                    fn visit_seq<V>(self, mut seq: V) -> Result<$mat3, V::Error>
401                    where
402                        V: SeqAccess<'de>,
403                    {
404                        let mut f = { [0.0; 9] };
405                        for i in 0..9 {
406                            f[i] = seq
407                                .next_element()?
408                                .ok_or_else(|| de::Error::invalid_length(i, &self))?;
409                        }
410                        Ok($mat3::from_cols_array(&f))
411                    }
412                }
413
414                deserializer.deserialize_tuple_struct(stringify!($mat3), 9, Mat3Visitor)
415            }
416        }
417
418        #[test]
419        fn $test_name() {
420            let a = $mat3::from_cols_array(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]);
421            let serialized = serde_json::to_string(&a).unwrap();
422            assert_eq!(serialized, "[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]");
423            let deserialized = serde_json::from_str(&serialized).unwrap();
424            assert_eq!(a, deserialized);
425            let deserialized = serde_json::from_str::<$mat3>("[]");
426            assert!(deserialized.is_err());
427            let deserialized = serde_json::from_str::<$mat3>("[1.0]");
428            assert!(deserialized.is_err());
429            let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0]");
430            assert!(deserialized.is_err());
431            let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0]");
432            assert!(deserialized.is_err());
433            let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0,4.0,5.0]");
434            assert!(deserialized.is_err());
435            let deserialized =
436                serde_json::from_str::<$mat3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
437            assert!(deserialized.is_err());
438        }
439    };
440}
441
442macro_rules! impl_serde_mat4 {
443    ($t:ty, $mat4:ident) => {
444        impl Serialize for $mat4 {
445            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
446            where
447                S: Serializer,
448            {
449                let mut state = serializer.serialize_tuple_struct(stringify!($mat4), 16)?;
450                for f in self.as_ref() {
451                    state.serialize_field(f)?;
452                }
453                state.end()
454            }
455        }
456
457        impl<'de> Deserialize<'de> for $mat4 {
458            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
459            where
460                D: Deserializer<'de>,
461            {
462                struct Mat4Visitor;
463
464                impl<'de> Visitor<'de> for Mat4Visitor {
465                    type Value = $mat4;
466
467                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
468                        formatter.write_str(concat!("struct ", stringify!($mat4)))
469                    }
470
471                    fn visit_seq<V>(self, mut seq: V) -> Result<$mat4, V::Error>
472                    where
473                        V: SeqAccess<'de>,
474                    {
475                        let mut f = { [0.0; 16] };
476                        for i in 0..16 {
477                            f[i] = seq
478                                .next_element()?
479                                .ok_or_else(|| de::Error::invalid_length(i, &self))?;
480                        }
481                        Ok($mat4::from_cols_array(&f))
482                    }
483                }
484
485                deserializer.deserialize_tuple_struct(stringify!($mat4), 16, Mat4Visitor)
486            }
487        }
488
489        #[test]
490        fn test_mat4_serde() {
491            let a = $mat4::from_cols_array(&[
492                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,
493                16.0,
494            ]);
495            let serialized = serde_json::to_string(&a).unwrap();
496            assert_eq!(
497                serialized,
498                "[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]"
499            );
500            let deserialized = serde_json::from_str(&serialized).unwrap();
501            assert_eq!(a, deserialized);
502            let deserialized = serde_json::from_str::<$mat4>("[]");
503            assert!(deserialized.is_err());
504            let deserialized = serde_json::from_str::<$mat4>("[1.0]");
505            assert!(deserialized.is_err());
506            let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0]");
507            assert!(deserialized.is_err());
508            let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0]");
509            assert!(deserialized.is_err());
510            let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0,4.0,5.0]");
511            assert!(deserialized.is_err());
512            let deserialized =
513                serde_json::from_str::<$mat4>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
514            assert!(deserialized.is_err());
515            let deserialized = serde_json::from_str::<$mat4>(
516                "[[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]]",
517            );
518            assert!(deserialized.is_err());
519        }
520    };
521}
522
523macro_rules! impl_serde_affine2 {
524    ($t:ty, $affine2:ident) => {
525        impl Serialize for $affine2 {
526            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
527            where
528                S: Serializer,
529            {
530                // Serialize column-wise as 3x4 matrix:
531                let mut state = serializer.serialize_tuple_struct(stringify!($affine2), 6)?;
532                state.serialize_field(&self.x_axis.x)?;
533                state.serialize_field(&self.x_axis.y)?;
534                state.serialize_field(&self.y_axis.x)?;
535                state.serialize_field(&self.y_axis.y)?;
536                state.serialize_field(&self.z_axis.x)?;
537                state.serialize_field(&self.z_axis.y)?;
538                state.end()
539            }
540        }
541
542        impl<'de> Deserialize<'de> for $affine2 {
543            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
544            where
545                D: Deserializer<'de>,
546            {
547                struct Affine2Visitor;
548
549                impl<'de> Visitor<'de> for Affine2Visitor {
550                    type Value = $affine2;
551
552                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
553                        formatter.write_str("struct $affine2")
554                    }
555
556                    fn visit_seq<V>(self, mut seq: V) -> Result<$affine2, V::Error>
557                    where
558                        V: SeqAccess<'de>,
559                    {
560                        let mut f = [0.0; 6];
561                        for (i, v) in f.iter_mut().enumerate() {
562                            *v = seq
563                                .next_element()?
564                                .ok_or_else(|| de::Error::invalid_length(i, &self))?;
565                        }
566                        Ok($affine2::from_cols_array(&f))
567                    }
568                }
569
570                deserializer.deserialize_tuple_struct(stringify!($affine2), 6, Affine2Visitor)
571            }
572        }
573
574        #[test]
575        fn test_affine2_serde() {
576            let a = $affine2::from_cols_array(&[1.0, 0.0, 2.0, 0.0, 3.0, 4.0]);
577            let serialized = serde_json::to_string(&a).unwrap();
578            assert_eq!(serialized, "[1.0,0.0,2.0,0.0,3.0,4.0]");
579            let deserialized = serde_json::from_str(&serialized).unwrap();
580            assert_eq!(a, deserialized);
581
582            let deserialized = serde_json::from_str::<$affine2>("[]");
583            assert!(deserialized.is_err());
584            let deserialized = serde_json::from_str::<$affine2>("[1.0]");
585            assert!(deserialized.is_err());
586            let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0]");
587            assert!(deserialized.is_err());
588            let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0]");
589            assert!(deserialized.is_err());
590            let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0,4.0,5.0]");
591            assert!(deserialized.is_err());
592            let deserialized = serde_json::from_str::<$affine2>("[[1.0,2.0],[3.0,4.0],[5.0,6.0]]");
593            assert!(deserialized.is_err());
594            let deserialized = serde_json::from_str::<$affine2>(
595                "[[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]]",
596            );
597            assert!(deserialized.is_err());
598        }
599    };
600}
601
602macro_rules! impl_serde_affine3 {
603    ($t:ty, $affine3:ident) => {
604        impl Serialize for $affine3 {
605            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
606            where
607                S: Serializer,
608            {
609                // Serialize column-wise as 3x4 matrix:
610                let mut state = serializer.serialize_tuple_struct(stringify!($affine3), 12)?;
611                state.serialize_field(&self.x_axis.x)?;
612                state.serialize_field(&self.x_axis.y)?;
613                state.serialize_field(&self.x_axis.z)?;
614                state.serialize_field(&self.y_axis.x)?;
615                state.serialize_field(&self.y_axis.y)?;
616                state.serialize_field(&self.y_axis.z)?;
617                state.serialize_field(&self.z_axis.x)?;
618                state.serialize_field(&self.z_axis.y)?;
619                state.serialize_field(&self.z_axis.z)?;
620                state.serialize_field(&self.w_axis.x)?;
621                state.serialize_field(&self.w_axis.y)?;
622                state.serialize_field(&self.w_axis.z)?;
623                state.end()
624            }
625        }
626
627        impl<'de> Deserialize<'de> for $affine3 {
628            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
629            where
630                D: Deserializer<'de>,
631            {
632                struct Affine3Visitor;
633
634                impl<'de> Visitor<'de> for Affine3Visitor {
635                    type Value = $affine3;
636
637                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
638                        formatter.write_str("struct $affine3")
639                    }
640
641                    fn visit_seq<V>(self, mut seq: V) -> Result<$affine3, V::Error>
642                    where
643                        V: SeqAccess<'de>,
644                    {
645                        let mut f = [0.0; 12];
646                        for (i, v) in f.iter_mut().enumerate() {
647                            *v = seq
648                                .next_element()?
649                                .ok_or_else(|| de::Error::invalid_length(i, &self))?;
650                        }
651                        Ok($affine3::from_cols_array(&f))
652                    }
653                }
654
655                deserializer.deserialize_tuple_struct(stringify!($affine3), 12, Affine3Visitor)
656            }
657        }
658
659        #[test]
660        fn test_affine3_serde() {
661            let a = $affine3::from_cols_array(&[
662                1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0, 6.0,
663            ]);
664            let serialized = serde_json::to_string(&a).unwrap();
665            assert_eq!(
666                serialized,
667                "[1.0,0.0,0.0,0.0,2.0,0.0,0.0,0.0,3.0,4.0,5.0,6.0]"
668            );
669            let deserialized = serde_json::from_str(&serialized).unwrap();
670            assert_eq!(a, deserialized);
671
672            let deserialized = serde_json::from_str::<$affine3>("[]");
673            assert!(deserialized.is_err());
674            let deserialized = serde_json::from_str::<$affine3>("[1.0]");
675            assert!(deserialized.is_err());
676            let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0]");
677            assert!(deserialized.is_err());
678            let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0]");
679            assert!(deserialized.is_err());
680            let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0,4.0,5.0]");
681            assert!(deserialized.is_err());
682            let deserialized =
683                serde_json::from_str::<$affine3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
684            assert!(deserialized.is_err());
685            let deserialized = serde_json::from_str::<$affine3>(
686                "[[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]]",
687            );
688            assert!(deserialized.is_err());
689        }
690    };
691}
692
693macro_rules! impl_serde_vec_types {
694    ($t:ty, $vec2:ident, $vec3:ident, $vec4:ident) => {
695        impl_serde_vec2!($t, $vec2);
696        impl_serde_vec3!($t, $vec3);
697        impl_serde_vec4!($t, $vec4);
698    };
699}
700
701macro_rules! impl_serde_float_types {
702    ($t:ty, $affine2:ident, $affine3:ident, $mat2:ident, $mat3:ident, $mat4:ident, $quat:ident, $vec2:ident, $vec3:ident, $vec4:ident) => {
703        impl_serde_affine2!($t, $affine2);
704        impl_serde_affine3!($t, $affine3);
705        impl_serde_mat2!($t, $mat2);
706        impl_serde_mat3!($t, $mat3);
707        impl_serde_mat4!($t, $mat4);
708        impl_serde_quat!($t, $quat);
709        impl_serde_vec_types!($t, $vec2, $vec3, $vec4);
710    };
711}
712
713#[cfg(test)]
714mod test_f32 {
715    pub const V1: f32 = 1.0;
716    pub const V2: f32 = 2.0;
717    pub const V3: f32 = 3.0;
718    pub const V4: f32 = 4.0;
719}
720
721#[cfg(test)]
722mod test_f64 {
723    pub const V1: f64 = 1.0;
724    pub const V2: f64 = 2.0;
725    pub const V3: f64 = 3.0;
726    pub const V4: f64 = 4.0;
727}
728
729#[cfg(test)]
730mod test_i16 {
731    pub const V1: i16 = 1;
732    pub const V2: i16 = 2;
733    pub const V3: i16 = 3;
734    pub const V4: i16 = 4;
735}
736
737#[cfg(test)]
738mod test_i32 {
739    pub const V1: i32 = 1;
740    pub const V2: i32 = 2;
741    pub const V3: i32 = 3;
742    pub const V4: i32 = 4;
743}
744
745#[cfg(test)]
746mod test_i64 {
747    pub const V1: i64 = 1;
748    pub const V2: i64 = 2;
749    pub const V3: i64 = 3;
750    pub const V4: i64 = 4;
751}
752
753#[cfg(test)]
754mod test_u16 {
755    pub const V1: u16 = 1;
756    pub const V2: u16 = 2;
757    pub const V3: u16 = 3;
758    pub const V4: u16 = 4;
759}
760
761#[cfg(test)]
762mod test_u32 {
763    pub const V1: u32 = 1;
764    pub const V2: u32 = 2;
765    pub const V3: u32 = 3;
766    pub const V4: u32 = 4;
767}
768
769#[cfg(test)]
770mod test_u64 {
771    pub const V1: u64 = 1;
772    pub const V2: u64 = 2;
773    pub const V3: u64 = 3;
774    pub const V4: u64 = 4;
775}
776
777#[cfg(test)]
778mod test_float {
779    pub const SX0: &str = "[]";
780    pub const SX1: &str = "[1.0]";
781    pub const SX2: &str = "[1.0,2.0]";
782    pub const SX3: &str = "[1.0,2.0,3.0]";
783    pub const SX4: &str = "[1.0,2.0,3.0,4.0]";
784    pub const SX5: &str = "[1.0,2.0,3.0,4.0,5.0]";
785}
786
787#[cfg(test)]
788mod test_int {
789    pub const SX0: &str = "[]";
790    pub const SX1: &str = "[1]";
791    pub const SX2: &str = "[1,2]";
792    pub const SX3: &str = "[1,2,3]";
793    pub const SX4: &str = "[1,2,3,4]";
794    pub const SX5: &str = "[1,2,3,4,5]";
795}
796
797#[cfg(test)]
798mod test_bool_mask {
799    pub const SX0: &str = "[]";
800    pub const SX1: &str = "[true]";
801    pub const SX2: &str = "[true,true]";
802    pub const SX3: &str = "[true,true,true]";
803    pub const SX4: &str = "[true,true,true,true]";
804    pub const SX5: &str = "[true,true,true,true,true]";
805    pub const V1: bool = true;
806    pub const V2: bool = true;
807    pub const V3: bool = true;
808    pub const V4: bool = true;
809}
810
811mod bool {
812    #[cfg(test)]
813    use super::test_bool_mask::*;
814    use crate::{BVec2, BVec3, BVec4};
815    #[cfg(not(feature = "scalar-math"))]
816    use crate::{BVec3A, BVec4A};
817    use core::fmt;
818    use serde::{
819        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
820        ser::{Serialize, SerializeTupleStruct, Serializer},
821    };
822
823    impl_serde_vec2!(bool, BVec2);
824    impl_serde_vec3!(bool, BVec3);
825    impl_serde_vec4!(bool, BVec4);
826
827    #[cfg(not(feature = "scalar-math"))]
828    impl Serialize for BVec3A {
829        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
830        where
831            S: Serializer,
832        {
833            let mut state = serializer.serialize_tuple_struct("BVec3A", 3)?;
834            let a: [bool; 3] = (*self).into();
835            state.serialize_field(&a[0])?;
836            state.serialize_field(&a[1])?;
837            state.serialize_field(&a[2])?;
838            state.end()
839        }
840    }
841
842    #[cfg(not(feature = "scalar-math"))]
843    impl<'de> Deserialize<'de> for BVec3A {
844        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
845        where
846            D: Deserializer<'de>,
847        {
848            struct Vec3Visitor;
849
850            impl<'de> Visitor<'de> for Vec3Visitor {
851                type Value = BVec3A;
852
853                fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
854                    formatter.write_str("struct BVec3A")
855                }
856
857                fn visit_seq<V>(self, mut seq: V) -> Result<BVec3A, V::Error>
858                where
859                    V: SeqAccess<'de>,
860                {
861                    let x = seq
862                        .next_element()?
863                        .ok_or_else(|| de::Error::invalid_length(0, &self))?;
864                    let y = seq
865                        .next_element()?
866                        .ok_or_else(|| de::Error::invalid_length(1, &self))?;
867                    let z = seq
868                        .next_element()?
869                        .ok_or_else(|| de::Error::invalid_length(2, &self))?;
870                    Ok(BVec3A::new(x, y, z))
871                }
872            }
873
874            deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor)
875        }
876    }
877
878    #[cfg(not(feature = "scalar-math"))]
879    #[test]
880    fn test_bvec3a_serde() {
881        let a = BVec3A::new(V1, V2, V3);
882        let serialized = serde_json::to_string(&a).unwrap();
883        assert_eq!(SX3, serialized);
884        let deserialized = serde_json::from_str(&serialized).unwrap();
885        assert_eq!(a, deserialized);
886        let deserialized = serde_json::from_str::<BVec3A>(SX0);
887        assert!(deserialized.is_err());
888        let deserialized = serde_json::from_str::<BVec3A>(SX1);
889        assert!(deserialized.is_err());
890        let deserialized = serde_json::from_str::<BVec3A>(SX2);
891        assert!(deserialized.is_err());
892        let deserialized = serde_json::from_str::<BVec3A>(SX4);
893        assert!(deserialized.is_err());
894    }
895
896    #[cfg(not(feature = "scalar-math"))]
897    impl Serialize for BVec4A {
898        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
899        where
900            S: Serializer,
901        {
902            let mut state = serializer.serialize_tuple_struct(stringify!(BVec4A), 4)?;
903            let a: [bool; 4] = (*self).into();
904            state.serialize_field(&a[0])?;
905            state.serialize_field(&a[1])?;
906            state.serialize_field(&a[2])?;
907            state.serialize_field(&a[2])?;
908            state.end()
909        }
910    }
911
912    #[cfg(not(feature = "scalar-math"))]
913    impl<'de> Deserialize<'de> for BVec4A {
914        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
915        where
916            D: Deserializer<'de>,
917        {
918            struct Vec4Visitor;
919
920            impl<'de> Visitor<'de> for Vec4Visitor {
921                type Value = BVec4A;
922
923                fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
924                    formatter.write_str(concat!("struct ", stringify!(BVec4A)))
925                }
926
927                fn visit_seq<V>(self, mut seq: V) -> Result<BVec4A, V::Error>
928                where
929                    V: SeqAccess<'de>,
930                {
931                    let x = seq
932                        .next_element()?
933                        .ok_or_else(|| de::Error::invalid_length(0, &self))?;
934                    let y = seq
935                        .next_element()?
936                        .ok_or_else(|| de::Error::invalid_length(1, &self))?;
937                    let z = seq
938                        .next_element()?
939                        .ok_or_else(|| de::Error::invalid_length(2, &self))?;
940                    let w = seq
941                        .next_element()?
942                        .ok_or_else(|| de::Error::invalid_length(3, &self))?;
943                    Ok(BVec4A::new(x, y, z, w))
944                }
945            }
946
947            deserializer.deserialize_tuple_struct(stringify!(BVec4A), 4, Vec4Visitor)
948        }
949    }
950
951    #[cfg(not(feature = "scalar-math"))]
952    #[test]
953    fn test_bvec4a_serde() {
954        let a = BVec4A::new(V1, V2, V3, V4);
955        let serialized = serde_json::to_string(&a).unwrap();
956        assert_eq!(SX4, serialized);
957        let deserialized = serde_json::from_str(&serialized).unwrap();
958        assert_eq!(a, deserialized);
959        let deserialized = serde_json::from_str::<BVec4A>(SX0);
960        assert!(deserialized.is_err());
961        let deserialized = serde_json::from_str::<BVec4A>(SX1);
962        assert!(deserialized.is_err());
963        let deserialized = serde_json::from_str::<BVec4A>(SX2);
964        assert!(deserialized.is_err());
965        let deserialized = serde_json::from_str::<BVec4A>(SX3);
966        assert!(deserialized.is_err());
967        let deserialized = serde_json::from_str::<BVec4A>(SX5);
968        assert!(deserialized.is_err());
969    }
970}
971
972mod f32 {
973    #[cfg(test)]
974    use super::test_f32::*;
975    #[cfg(test)]
976    use super::test_float::*;
977    use crate::{Affine2, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4};
978    use core::fmt;
979    use serde::{
980        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
981        ser::{Serialize, SerializeTupleStruct, Serializer},
982    };
983
984    impl_serde_float_types!(f32, Affine2, Affine3A, Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec4);
985    impl_serde_mat3!(f32, Mat3A, test_mat3a_serde);
986    impl_serde_vec3!(f32, Vec3A, test_vec3a_serde);
987}
988
989mod f64 {
990    #[cfg(test)]
991    use super::test_f64::*;
992    #[cfg(test)]
993    use super::test_float::*;
994    use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4};
995    use core::fmt;
996    use serde::{
997        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
998        ser::{Serialize, SerializeTupleStruct, Serializer},
999    };
1000
1001    impl_serde_float_types!(
1002        f64, DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4
1003    );
1004}
1005
1006mod i16 {
1007    #[cfg(test)]
1008    use super::test_i16::*;
1009    #[cfg(test)]
1010    use super::test_int::*;
1011    use crate::{I16Vec2, I16Vec3, I16Vec4};
1012    use core::fmt;
1013    use serde::{
1014        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1015        ser::{Serialize, SerializeTupleStruct, Serializer},
1016    };
1017
1018    impl_serde_vec_types!(i16, I16Vec2, I16Vec3, I16Vec4);
1019}
1020
1021mod i32 {
1022    #[cfg(test)]
1023    use super::test_i32::*;
1024    #[cfg(test)]
1025    use super::test_int::*;
1026    use crate::{IVec2, IVec3, IVec4};
1027    use core::fmt;
1028    use serde::{
1029        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1030        ser::{Serialize, SerializeTupleStruct, Serializer},
1031    };
1032
1033    impl_serde_vec_types!(i32, IVec2, IVec3, IVec4);
1034}
1035
1036mod i64 {
1037    #[cfg(test)]
1038    use super::test_i64::*;
1039    #[cfg(test)]
1040    use super::test_int::*;
1041    use crate::{I64Vec2, I64Vec3, I64Vec4};
1042    use core::fmt;
1043    use serde::{
1044        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1045        ser::{Serialize, SerializeTupleStruct, Serializer},
1046    };
1047
1048    impl_serde_vec_types!(i64, I64Vec2, I64Vec3, I64Vec4);
1049}
1050
1051mod u16 {
1052    #[cfg(test)]
1053    use super::test_int::*;
1054    #[cfg(test)]
1055    use super::test_u16::*;
1056    use crate::{U16Vec2, U16Vec3, U16Vec4};
1057    use core::fmt;
1058    use serde::{
1059        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1060        ser::{Serialize, SerializeTupleStruct, Serializer},
1061    };
1062
1063    impl_serde_vec_types!(u16, U16Vec2, U16Vec3, U16Vec4);
1064}
1065
1066mod u32 {
1067    #[cfg(test)]
1068    use super::test_int::*;
1069    #[cfg(test)]
1070    use super::test_u32::*;
1071    use crate::{UVec2, UVec3, UVec4};
1072    use core::fmt;
1073    use serde::{
1074        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1075        ser::{Serialize, SerializeTupleStruct, Serializer},
1076    };
1077
1078    impl_serde_vec_types!(u32, UVec2, UVec3, UVec4);
1079}
1080
1081mod u64 {
1082    #[cfg(test)]
1083    use super::test_int::*;
1084    #[cfg(test)]
1085    use super::test_u64::*;
1086    use crate::{U64Vec2, U64Vec3, U64Vec4};
1087    use core::fmt;
1088    use serde::{
1089        de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1090        ser::{Serialize, SerializeTupleStruct, Serializer},
1091    };
1092
1093    impl_serde_vec_types!(u64, U64Vec2, U64Vec3, U64Vec4);
1094}
1095
1096mod euler {
1097    use crate::EulerRot;
1098
1099    impl serde::Serialize for EulerRot {
1100        fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1101            match *self {
1102                EulerRot::ZYX => {
1103                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 0u32, "ZYX")
1104                }
1105                EulerRot::ZXY => {
1106                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 1u32, "ZXY")
1107                }
1108                EulerRot::YXZ => {
1109                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 2u32, "YXZ")
1110                }
1111                EulerRot::YZX => {
1112                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 3u32, "YZX")
1113                }
1114                EulerRot::XYZ => {
1115                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 4u32, "XYZ")
1116                }
1117                EulerRot::XZY => {
1118                    serde::Serializer::serialize_unit_variant(serializer, "EulerRot", 5u32, "XZY")
1119                }
1120            }
1121        }
1122    }
1123
1124    impl<'de> serde::Deserialize<'de> for EulerRot {
1125        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1126        where
1127            D: serde::Deserializer<'de>,
1128        {
1129            #[allow(clippy::upper_case_acronyms)]
1130            enum Field {
1131                ZYX,
1132                ZXY,
1133                YXZ,
1134                YZX,
1135                XYZ,
1136                XZY,
1137            }
1138            struct FieldVisitor;
1139
1140            impl<'de> serde::de::Visitor<'de> for FieldVisitor {
1141                type Value = Field;
1142                fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1143                    core::fmt::Formatter::write_str(formatter, "variant identifier")
1144                }
1145                fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
1146                where
1147                    E: serde::de::Error,
1148                {
1149                    match value {
1150                        0u64 => Ok(Field::ZYX),
1151                        1u64 => Ok(Field::ZXY),
1152                        2u64 => Ok(Field::YXZ),
1153                        3u64 => Ok(Field::YZX),
1154                        4u64 => Ok(Field::XYZ),
1155                        5u64 => Ok(Field::XZY),
1156                        _ => Err(serde::de::Error::invalid_value(
1157                            serde::de::Unexpected::Unsigned(value),
1158                            &"variant index 0 <= i < 6",
1159                        )),
1160                    }
1161                }
1162                fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1163                where
1164                    E: serde::de::Error,
1165                {
1166                    match value {
1167                        "ZYX" => Ok(Field::ZYX),
1168                        "ZXY" => Ok(Field::ZXY),
1169                        "YXZ" => Ok(Field::YXZ),
1170                        "YZX" => Ok(Field::YZX),
1171                        "XYZ" => Ok(Field::XYZ),
1172                        "XZY" => Ok(Field::XZY),
1173                        _ => Err(serde::de::Error::unknown_variant(value, VARIANTS)),
1174                    }
1175                }
1176                fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
1177                where
1178                    E: serde::de::Error,
1179                {
1180                    match value {
1181                        b"ZYX" => Ok(Field::ZYX),
1182                        b"ZXY" => Ok(Field::ZXY),
1183                        b"YXZ" => Ok(Field::YXZ),
1184                        b"YZX" => Ok(Field::YZX),
1185                        b"XYZ" => Ok(Field::XYZ),
1186                        b"XZY" => Ok(Field::XZY),
1187                        _ => {
1188                            #[cfg(feature = "std")]
1189                            let value = &String::from_utf8_lossy(value);
1190                            #[cfg(not(feature = "std"))]
1191                            let value =
1192                                core::str::from_utf8(value).unwrap_or("\u{fffd}\u{fffd}\u{fffd}");
1193                            Err(serde::de::Error::unknown_variant(value, VARIANTS))
1194                        }
1195                    }
1196                }
1197            }
1198            impl<'de> serde::Deserialize<'de> for Field {
1199                #[inline]
1200                fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1201                where
1202                    D: serde::Deserializer<'de>,
1203                {
1204                    serde::Deserializer::deserialize_identifier(deserializer, FieldVisitor)
1205                }
1206            }
1207            struct Visitor<'de> {
1208                marker: core::marker::PhantomData<EulerRot>,
1209                lifetime: core::marker::PhantomData<&'de ()>,
1210            }
1211            impl<'de> serde::de::Visitor<'de> for Visitor<'de> {
1212                type Value = EulerRot;
1213                fn expecting(
1214                    &self,
1215                    __formatter: &mut core::fmt::Formatter<'_>,
1216                ) -> core::fmt::Result {
1217                    core::fmt::Formatter::write_str(__formatter, "enum EulerRot")
1218                }
1219                fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
1220                where
1221                    A: serde::de::EnumAccess<'de>,
1222                {
1223                    match serde::de::EnumAccess::variant(data)? {
1224                        (Field::ZYX, variant) => {
1225                            serde::de::VariantAccess::unit_variant(variant)?;
1226                            Ok(EulerRot::ZYX)
1227                        }
1228                        (Field::ZXY, variant) => {
1229                            serde::de::VariantAccess::unit_variant(variant)?;
1230                            Ok(EulerRot::ZXY)
1231                        }
1232                        (Field::YXZ, variant) => {
1233                            serde::de::VariantAccess::unit_variant(variant)?;
1234                            Ok(EulerRot::YXZ)
1235                        }
1236                        (Field::YZX, variant) => {
1237                            serde::de::VariantAccess::unit_variant(variant)?;
1238                            Ok(EulerRot::YZX)
1239                        }
1240                        (Field::XYZ, variant) => {
1241                            serde::de::VariantAccess::unit_variant(variant)?;
1242                            Ok(EulerRot::XYZ)
1243                        }
1244                        (Field::XZY, variant) => {
1245                            serde::de::VariantAccess::unit_variant(variant)?;
1246                            Ok(EulerRot::XZY)
1247                        }
1248                    }
1249                }
1250            }
1251            const VARIANTS: &[&str] = &["ZYX", "ZXY", "YXZ", "YZX", "XYZ", "XZY"];
1252            serde::Deserializer::deserialize_enum(
1253                deserializer,
1254                "EulerRot",
1255                VARIANTS,
1256                Visitor {
1257                    marker: core::marker::PhantomData::<EulerRot>,
1258                    lifetime: core::marker::PhantomData,
1259                },
1260            )
1261        }
1262    }
1263
1264    #[test]
1265    fn test_euler_rot_serde() {
1266        let a = EulerRot::XYZ;
1267        let serialized = serde_json::to_string(&a).unwrap();
1268        assert_eq!("\"XYZ\"", serialized);
1269        let deserialized = serde_json::from_str(&serialized).unwrap();
1270        assert_eq!(a, deserialized);
1271    }
1272}