1macro_rules! impl_serde_vec2 {
2 ($t:ty, $vec2:ident) => {
3 impl Serialize for $vec2 {
5 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6 where
7 S: Serializer,
8 {
9 let mut state = serializer.serialize_tuple_struct(stringify!($vec2), 2)?;
10 state.serialize_field(&self.x)?;
11 state.serialize_field(&self.y)?;
12 state.end()
13 }
14 }
15
16 impl<'de> Deserialize<'de> for $vec2 {
18 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
19 where
20 D: Deserializer<'de>,
21 {
22 struct Vec2Visitor;
23
24 impl<'de> Visitor<'de> for Vec2Visitor {
25 type Value = $vec2;
26
27 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
28 formatter.write_str(&concat!("a sequence of 2 ", stringify!($t), " values"))
29 }
30
31 fn visit_seq<V>(self, mut seq: V) -> Result<$vec2, V::Error>
32 where
33 V: SeqAccess<'de>,
34 {
35 let x = seq
36 .next_element()?
37 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
38 let y = seq
39 .next_element()?
40 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
41 Ok($vec2::new(x, y))
42 }
43 }
44
45 deserializer.deserialize_tuple_struct(stringify!($vec2), 2, Vec2Visitor)
46 }
47 }
48
49 #[test]
50 fn test_vec2_serde() {
51 let a = $vec2::new(V1, V2);
52 let serialized = serde_json::to_string(&a).unwrap();
53 assert_eq!(SX2, serialized);
54 let deserialized = serde_json::from_str(&serialized).unwrap();
55 assert_eq!(a, deserialized);
56 let deserialized = serde_json::from_str::<$vec2>(SX0);
57 assert!(deserialized.is_err());
58 let deserialized = serde_json::from_str::<$vec2>(SX1);
59 assert!(deserialized.is_err());
60 let deserialized = serde_json::from_str::<$vec2>(SX3);
61 assert!(deserialized.is_err());
62
63 let deserialized = serde_json::from_str::<$vec2>(ST0);
64 assert!(deserialized.is_err());
65 }
66 };
67}
68
69macro_rules! impl_serde_vec3 {
70 ($t:ty, $vec3:ident) => {
71 impl_serde_vec3!($t, $vec3, test_vec3_serde);
72 };
73 ($t:ty, $vec3:ident, $test_name:ident) => {
74 impl Serialize for $vec3 {
76 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
77 where
78 S: Serializer,
79 {
80 let mut state = serializer.serialize_tuple_struct(stringify!($vec3), 3)?;
81 state.serialize_field(&self.x)?;
82 state.serialize_field(&self.y)?;
83 state.serialize_field(&self.z)?;
84 state.end()
85 }
86 }
87
88 impl<'de> Deserialize<'de> for $vec3 {
90 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91 where
92 D: Deserializer<'de>,
93 {
94 struct Vec3Visitor;
95
96 impl<'de> Visitor<'de> for Vec3Visitor {
97 type Value = $vec3;
98
99 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
100 formatter.write_str(&concat!("a sequence of 3 ", stringify!($t), " values"))
101 }
102
103 fn visit_seq<V>(self, mut seq: V) -> Result<$vec3, V::Error>
104 where
105 V: SeqAccess<'de>,
106 {
107 let x = seq
108 .next_element()?
109 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
110 let y = seq
111 .next_element()?
112 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
113 let z = seq
114 .next_element()?
115 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
116 Ok($vec3::new(x, y, z))
117 }
118 }
119
120 deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor)
121 }
122 }
123
124 #[test]
125 fn $test_name() {
126 let a = $vec3::new(V1, V2, V3);
127 let serialized = serde_json::to_string(&a).unwrap();
128 assert_eq!(SX3, serialized);
129 let deserialized = serde_json::from_str(&serialized).unwrap();
130 assert_eq!(a, deserialized);
131 let deserialized = serde_json::from_str::<$vec3>(SX0);
132 assert!(deserialized.is_err());
133 let deserialized = serde_json::from_str::<$vec3>(SX1);
134 assert!(deserialized.is_err());
135 let deserialized = serde_json::from_str::<$vec3>(SX2);
136 assert!(deserialized.is_err());
137 let deserialized = serde_json::from_str::<$vec3>(SX4);
138 assert!(deserialized.is_err());
139 let deserialized = serde_json::from_str::<$vec3>(ST0);
140 assert!(deserialized.is_err());
141 }
142 };
143}
144
145macro_rules! impl_serde_vec4 {
146 ($t:ty, $vec4:ident) => {
147 impl Serialize for $vec4 {
149 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
150 where
151 S: Serializer,
152 {
153 let mut state = serializer.serialize_tuple_struct(stringify!($vec4), 4)?;
154 state.serialize_field(&self.x)?;
155 state.serialize_field(&self.y)?;
156 state.serialize_field(&self.z)?;
157 state.serialize_field(&self.w)?;
158 state.end()
159 }
160 }
161
162 impl<'de> Deserialize<'de> for $vec4 {
164 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
165 where
166 D: Deserializer<'de>,
167 {
168 struct Vec4Visitor;
169
170 impl<'de> Visitor<'de> for Vec4Visitor {
171 type Value = $vec4;
172
173 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
174 formatter.write_str(&concat!("a sequence of 4 ", stringify!($t), " values"))
175 }
176
177 fn visit_seq<V>(self, mut seq: V) -> Result<$vec4, V::Error>
178 where
179 V: SeqAccess<'de>,
180 {
181 let x = seq
182 .next_element()?
183 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
184 let y = seq
185 .next_element()?
186 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
187 let z = seq
188 .next_element()?
189 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
190 let w = seq
191 .next_element()?
192 .ok_or_else(|| de::Error::invalid_length(3, &self))?;
193 Ok($vec4::new(x, y, z, w))
194 }
195 }
196
197 deserializer.deserialize_tuple_struct(stringify!($vec4), 4, Vec4Visitor)
198 }
199 }
200
201 #[test]
202 fn test_vec4_serde() {
203 let a = $vec4::new(V1, V2, V3, V4);
204 let serialized = serde_json::to_string(&a).unwrap();
205 assert_eq!(SX4, serialized);
206 let deserialized = serde_json::from_str(&serialized).unwrap();
207 assert_eq!(a, deserialized);
208 let deserialized = serde_json::from_str::<$vec4>(SX0);
209 assert!(deserialized.is_err());
210 let deserialized = serde_json::from_str::<$vec4>(SX1);
211 assert!(deserialized.is_err());
212 let deserialized = serde_json::from_str::<$vec4>(SX2);
213 assert!(deserialized.is_err());
214 let deserialized = serde_json::from_str::<$vec4>(SX3);
215 assert!(deserialized.is_err());
216 let deserialized = serde_json::from_str::<$vec4>(SX5);
217 assert!(deserialized.is_err());
218 let deserialized = serde_json::from_str::<$vec4>(ST0);
219 assert!(deserialized.is_err());
220 }
221 };
222}
223
224macro_rules! impl_serde_quat {
225 ($t:ty, $quat:ident) => {
226 impl Serialize for $quat {
228 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
229 where
230 S: Serializer,
231 {
232 let mut state = serializer.serialize_tuple_struct(stringify!($quat), 4)?;
233 state.serialize_field(&self.x)?;
234 state.serialize_field(&self.y)?;
235 state.serialize_field(&self.z)?;
236 state.serialize_field(&self.w)?;
237 state.end()
238 }
239 }
240
241 impl<'de> Deserialize<'de> for $quat {
243 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
244 where
245 D: Deserializer<'de>,
246 {
247 struct QuatVisitor;
248
249 impl<'de> Visitor<'de> for QuatVisitor {
250 type Value = $quat;
251
252 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
253 formatter.write_str(&concat!("a sequence of 4 ", stringify!($t), " values"))
254 }
255
256 fn visit_seq<V>(self, mut seq: V) -> Result<$quat, V::Error>
257 where
258 V: SeqAccess<'de>,
259 {
260 let x = seq
261 .next_element()?
262 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
263 let y = seq
264 .next_element()?
265 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
266 let z = seq
267 .next_element()?
268 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
269 let w = seq
270 .next_element()?
271 .ok_or_else(|| de::Error::invalid_length(3, &self))?;
272 Ok($quat::from_xyzw(x, y, z, w))
273 }
274 }
275
276 deserializer.deserialize_tuple_struct(stringify!($quat), 4, QuatVisitor)
277 }
278 }
279
280 #[test]
281 fn test_quat_serde() {
282 let a = $quat::from_xyzw(1.0, 2.0, 3.0, 4.0);
283 let serialized = serde_json::to_string(&a).unwrap();
284 assert_eq!(serialized, "[1.0,2.0,3.0,4.0]");
285 let deserialized = serde_json::from_str(&serialized).unwrap();
286 assert_eq!(a, deserialized);
287 let deserialized = serde_json::from_str::<$quat>("[]");
288 assert!(deserialized.is_err());
289 let deserialized = serde_json::from_str::<$quat>("[1.0]");
290 assert!(deserialized.is_err());
291 let deserialized = serde_json::from_str::<$quat>("[1.0,2.0]");
292 assert!(deserialized.is_err());
293 let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0]");
294 assert!(deserialized.is_err());
295 let deserialized = serde_json::from_str::<$quat>("[1.0,2.0,3.0,4.0,5.0]");
296 assert!(deserialized.is_err());
297 let deserialized = serde_json::from_str::<$quat>("{}");
298 assert!(deserialized.is_err());
299 }
300 };
301}
302
303macro_rules! impl_serde_mat2 {
304 ($t:ty, $mat2:ident) => {
305 impl Serialize for $mat2 {
307 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
308 where
309 S: Serializer,
310 {
311 let f: &[_; 4] = self.as_ref();
312 let mut state = serializer.serialize_tuple_struct(stringify!($mat2), 4)?;
313 state.serialize_field(&f[0])?;
314 state.serialize_field(&f[1])?;
315 state.serialize_field(&f[2])?;
316 state.serialize_field(&f[3])?;
317 state.end()
318 }
319 }
320
321 impl<'de> Deserialize<'de> for $mat2 {
323 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
324 where
325 D: Deserializer<'de>,
326 {
327 struct Mat2Visitor;
328
329 impl<'de> Visitor<'de> for Mat2Visitor {
330 type Value = $mat2;
331
332 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
333 formatter.write_str(&concat!("a sequence of 4 ", stringify!($t), "values"))
334 }
335
336 fn visit_seq<V>(self, mut seq: V) -> Result<$mat2, V::Error>
337 where
338 V: SeqAccess<'de>,
339 {
340 let mut f = { [0.0; 4] };
341 for i in 0..4 {
342 f[i] = seq
343 .next_element()?
344 .ok_or_else(|| de::Error::invalid_length(i, &self))?;
345 }
346 Ok($mat2::from_cols_array(&f))
347 }
348 }
349
350 deserializer.deserialize_tuple_struct(stringify!($mat2), 4, Mat2Visitor)
351 }
352 }
353
354 #[test]
355 fn test_mat2_serde() {
356 let a = $mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]);
357 let serialized = serde_json::to_string(&a).unwrap();
358 assert_eq!(serialized, "[1.0,2.0,3.0,4.0]");
359 let deserialized = serde_json::from_str(&serialized).unwrap();
360 assert_eq!(a, deserialized);
361 let deserialized = serde_json::from_str::<$mat2>("[]");
362 assert!(deserialized.is_err());
363 let deserialized = serde_json::from_str::<$mat2>("[1.0]");
364 assert!(deserialized.is_err());
365 let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0]");
366 assert!(deserialized.is_err());
367 let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0]");
368 assert!(deserialized.is_err());
369 let deserialized = serde_json::from_str::<$mat2>("[1.0,2.0,3.0,4.0,5.0]");
370 assert!(deserialized.is_err());
371 let deserialized = serde_json::from_str::<$mat2>("[[1.0,2.0],[3.0,4.0]]");
372 assert!(deserialized.is_err());
373 let deserialized = serde_json::from_str::<$mat2>("{}");
374 assert!(deserialized.is_err());
375 }
376 };
377}
378
379macro_rules! impl_serde_mat3 {
380 ($t:ty, $mat3:ident) => {
381 impl_serde_mat3!($t, $mat3, test_mat3_serde);
382 };
383 ($t:ty, $mat3:ident, $test_name:ident) => {
384 impl Serialize for $mat3 {
386 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
387 where
388 S: Serializer,
389 {
390 let (m00, m01, m02) = self.x_axis.into();
391 let (m10, m11, m12) = self.y_axis.into();
392 let (m20, m21, m22) = self.z_axis.into();
393
394 let mut state = serializer.serialize_tuple_struct(stringify!($mat3), 9)?;
395 state.serialize_field(&m00)?;
396 state.serialize_field(&m01)?;
397 state.serialize_field(&m02)?;
398 state.serialize_field(&m10)?;
399 state.serialize_field(&m11)?;
400 state.serialize_field(&m12)?;
401 state.serialize_field(&m20)?;
402 state.serialize_field(&m21)?;
403 state.serialize_field(&m22)?;
404 state.end()
405 }
406 }
407
408 impl<'de> Deserialize<'de> for $mat3 {
410 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
411 where
412 D: Deserializer<'de>,
413 {
414 struct Mat3Visitor;
415
416 impl<'de> Visitor<'de> for Mat3Visitor {
417 type Value = $mat3;
418
419 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
420 formatter.write_str(&concat!("a sequence of 9 ", stringify!($t), "values"))
421 }
422
423 fn visit_seq<V>(self, mut seq: V) -> Result<$mat3, V::Error>
424 where
425 V: SeqAccess<'de>,
426 {
427 let mut f = { [0.0; 9] };
428 for i in 0..9 {
429 f[i] = seq
430 .next_element()?
431 .ok_or_else(|| de::Error::invalid_length(i, &self))?;
432 }
433 Ok($mat3::from_cols_array(&f))
434 }
435 }
436
437 deserializer.deserialize_tuple_struct(stringify!($mat3), 9, Mat3Visitor)
438 }
439 }
440
441 #[test]
442 fn $test_name() {
443 let a = $mat3::from_cols_array(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]);
444 let serialized = serde_json::to_string(&a).unwrap();
445 assert_eq!(serialized, "[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]");
446 let deserialized = serde_json::from_str(&serialized).unwrap();
447 assert_eq!(a, deserialized);
448 let deserialized = serde_json::from_str::<$mat3>("[]");
449 assert!(deserialized.is_err());
450 let deserialized = serde_json::from_str::<$mat3>("[1.0]");
451 assert!(deserialized.is_err());
452 let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0]");
453 assert!(deserialized.is_err());
454 let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0]");
455 assert!(deserialized.is_err());
456 let deserialized = serde_json::from_str::<$mat3>("[1.0,2.0,3.0,4.0,5.0]");
457 assert!(deserialized.is_err());
458 let deserialized =
459 serde_json::from_str::<$mat3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
460 assert!(deserialized.is_err());
461 let deserialized = serde_json::from_str::<$mat3>("{}");
462 assert!(deserialized.is_err());
463 }
464 };
465}
466
467macro_rules! impl_serde_mat4 {
468 ($t:ty, $mat4:ident) => {
469 impl Serialize for $mat4 {
471 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
472 where
473 S: Serializer,
474 {
475 let mut state = serializer.serialize_tuple_struct(stringify!($mat4), 16)?;
476 for f in self.as_ref() {
477 state.serialize_field(f)?;
478 }
479 state.end()
480 }
481 }
482
483 impl<'de> Deserialize<'de> for $mat4 {
485 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
486 where
487 D: Deserializer<'de>,
488 {
489 struct Mat4Visitor;
490
491 impl<'de> Visitor<'de> for Mat4Visitor {
492 type Value = $mat4;
493
494 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
495 formatter.write_str(&concat!("a sequence of 16 ", stringify!($t), "values"))
496 }
497
498 fn visit_seq<V>(self, mut seq: V) -> Result<$mat4, V::Error>
499 where
500 V: SeqAccess<'de>,
501 {
502 let mut f = { [0.0; 16] };
503 for i in 0..16 {
504 f[i] = seq
505 .next_element()?
506 .ok_or_else(|| de::Error::invalid_length(i, &self))?;
507 }
508 Ok($mat4::from_cols_array(&f))
509 }
510 }
511
512 deserializer.deserialize_tuple_struct(stringify!($mat4), 16, Mat4Visitor)
513 }
514 }
515
516 #[test]
517 fn test_mat4_serde() {
518 let a = $mat4::from_cols_array(&[
519 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,
520 16.0,
521 ]);
522 let serialized = serde_json::to_string(&a).unwrap();
523 assert_eq!(
524 serialized,
525 "[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]"
526 );
527 let deserialized = serde_json::from_str(&serialized).unwrap();
528 assert_eq!(a, deserialized);
529 let deserialized = serde_json::from_str::<$mat4>("[]");
530 assert!(deserialized.is_err());
531 let deserialized = serde_json::from_str::<$mat4>("[1.0]");
532 assert!(deserialized.is_err());
533 let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0]");
534 assert!(deserialized.is_err());
535 let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0]");
536 assert!(deserialized.is_err());
537 let deserialized = serde_json::from_str::<$mat4>("[1.0,2.0,3.0,4.0,5.0]");
538 assert!(deserialized.is_err());
539 let deserialized =
540 serde_json::from_str::<$mat4>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
541 assert!(deserialized.is_err());
542 let deserialized = serde_json::from_str::<$mat4>(
543 "[[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]]",
544 );
545 assert!(deserialized.is_err());
546 let deserialized = serde_json::from_str::<$mat4>("{}");
547 assert!(deserialized.is_err());
548 }
549 };
550}
551
552macro_rules! impl_serde_affine2 {
553 ($t:ty, $affine2:ident) => {
554 impl Serialize for $affine2 {
556 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
557 where
558 S: Serializer,
559 {
560 let mut state = serializer.serialize_tuple_struct(stringify!($affine2), 6)?;
562 state.serialize_field(&self.x_axis.x)?;
563 state.serialize_field(&self.x_axis.y)?;
564 state.serialize_field(&self.y_axis.x)?;
565 state.serialize_field(&self.y_axis.y)?;
566 state.serialize_field(&self.z_axis.x)?;
567 state.serialize_field(&self.z_axis.y)?;
568 state.end()
569 }
570 }
571
572 impl<'de> Deserialize<'de> for $affine2 {
574 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
575 where
576 D: Deserializer<'de>,
577 {
578 struct Affine2Visitor;
579
580 impl<'de> Visitor<'de> for Affine2Visitor {
581 type Value = $affine2;
582
583 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
584 formatter.write_str(&concat!("a sequence of 6 ", stringify!($t), "values"))
585 }
586
587 fn visit_seq<V>(self, mut seq: V) -> Result<$affine2, V::Error>
588 where
589 V: SeqAccess<'de>,
590 {
591 let mut f = [0.0; 6];
592 for (i, v) in f.iter_mut().enumerate() {
593 *v = seq
594 .next_element()?
595 .ok_or_else(|| de::Error::invalid_length(i, &self))?;
596 }
597 Ok($affine2::from_cols_array(&f))
598 }
599 }
600
601 deserializer.deserialize_tuple_struct(stringify!($affine2), 6, Affine2Visitor)
602 }
603 }
604
605 #[test]
606 fn test_affine2_serde() {
607 let a = $affine2::from_cols_array(&[1.0, 0.0, 2.0, 0.0, 3.0, 4.0]);
608 let serialized = serde_json::to_string(&a).unwrap();
609 assert_eq!(serialized, "[1.0,0.0,2.0,0.0,3.0,4.0]");
610 let deserialized = serde_json::from_str(&serialized).unwrap();
611 assert_eq!(a, deserialized);
612
613 let deserialized = serde_json::from_str::<$affine2>("[]");
614 assert!(deserialized.is_err());
615 let deserialized = serde_json::from_str::<$affine2>("[1.0]");
616 assert!(deserialized.is_err());
617 let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0]");
618 assert!(deserialized.is_err());
619 let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0]");
620 assert!(deserialized.is_err());
621 let deserialized = serde_json::from_str::<$affine2>("[1.0,2.0,3.0,4.0,5.0]");
622 assert!(deserialized.is_err());
623 let deserialized = serde_json::from_str::<$affine2>("[[1.0,2.0],[3.0,4.0],[5.0,6.0]]");
624 assert!(deserialized.is_err());
625 let deserialized = serde_json::from_str::<$affine2>(
626 "[[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]]",
627 );
628 assert!(deserialized.is_err());
629 let deserialized = serde_json::from_str::<$affine2>("{}");
630 assert!(deserialized.is_err());
631 }
632 };
633}
634
635macro_rules! impl_serde_affine3 {
636 ($testname:ident, $t:ty, $affine3:ident) => {
637 impl Serialize for $affine3 {
639 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
640 where
641 S: Serializer,
642 {
643 let mut state = serializer.serialize_tuple_struct(stringify!($affine3), 12)?;
645 state.serialize_field(&self.x_axis.x)?;
646 state.serialize_field(&self.x_axis.y)?;
647 state.serialize_field(&self.x_axis.z)?;
648 state.serialize_field(&self.y_axis.x)?;
649 state.serialize_field(&self.y_axis.y)?;
650 state.serialize_field(&self.y_axis.z)?;
651 state.serialize_field(&self.z_axis.x)?;
652 state.serialize_field(&self.z_axis.y)?;
653 state.serialize_field(&self.z_axis.z)?;
654 state.serialize_field(&self.w_axis.x)?;
655 state.serialize_field(&self.w_axis.y)?;
656 state.serialize_field(&self.w_axis.z)?;
657 state.end()
658 }
659 }
660
661 impl<'de> Deserialize<'de> for $affine3 {
663 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
664 where
665 D: Deserializer<'de>,
666 {
667 struct Affine3Visitor;
668
669 impl<'de> Visitor<'de> for Affine3Visitor {
670 type Value = $affine3;
671
672 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
673 formatter.write_str(&concat!("a sequence of 12 ", stringify!($t), "values"))
674 }
675
676 fn visit_seq<V>(self, mut seq: V) -> Result<$affine3, V::Error>
677 where
678 V: SeqAccess<'de>,
679 {
680 let mut f = [0.0; 12];
681 for (i, v) in f.iter_mut().enumerate() {
682 *v = seq
683 .next_element()?
684 .ok_or_else(|| de::Error::invalid_length(i, &self))?;
685 }
686 Ok($affine3::from_cols_array(&f))
687 }
688 }
689
690 deserializer.deserialize_tuple_struct(stringify!($affine3), 12, Affine3Visitor)
691 }
692 }
693
694 #[test]
695 fn $testname() {
696 let a = $affine3::from_cols_array(&[
697 1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0, 6.0,
698 ]);
699 let serialized = serde_json::to_string(&a).unwrap();
700 assert_eq!(
701 serialized,
702 "[1.0,0.0,0.0,0.0,2.0,0.0,0.0,0.0,3.0,4.0,5.0,6.0]"
703 );
704 let deserialized = serde_json::from_str(&serialized).unwrap();
705 assert_eq!(a, deserialized);
706
707 let deserialized = serde_json::from_str::<$affine3>("[]");
708 assert!(deserialized.is_err());
709 let deserialized = serde_json::from_str::<$affine3>("[1.0]");
710 assert!(deserialized.is_err());
711 let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0]");
712 assert!(deserialized.is_err());
713 let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0]");
714 assert!(deserialized.is_err());
715 let deserialized = serde_json::from_str::<$affine3>("[1.0,2.0,3.0,4.0,5.0]");
716 assert!(deserialized.is_err());
717 let deserialized =
718 serde_json::from_str::<$affine3>("[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]");
719 assert!(deserialized.is_err());
720 let deserialized = serde_json::from_str::<$affine3>(
721 "[[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]]",
722 );
723 assert!(deserialized.is_err());
724 let deserialized = serde_json::from_str::<$affine3>("{}");
725 assert!(deserialized.is_err());
726 }
727 };
728}
729
730macro_rules! impl_serde_vec_types {
731 ($t:ty, $vec2:ident, $vec3:ident, $vec4:ident) => {
732 impl_serde_vec2!($t, $vec2);
733 impl_serde_vec3!($t, $vec3);
734 impl_serde_vec4!($t, $vec4);
735 };
736}
737
738macro_rules! impl_serde_float_types {
739 ($t:ty, $affine2:ident, $affine3:ident, $mat2:ident, $mat3:ident, $mat4:ident, $quat:ident, $vec2:ident, $vec3:ident, $vec4:ident) => {
740 impl_serde_affine2!($t, $affine2);
741 impl_serde_affine3!(test_affine3_serde, $t, $affine3);
742 impl_serde_mat2!($t, $mat2);
743 impl_serde_mat3!($t, $mat3);
744 impl_serde_mat4!($t, $mat4);
745 impl_serde_quat!($t, $quat);
746 impl_serde_vec_types!($t, $vec2, $vec3, $vec4);
747 };
748}
749
750#[cfg(test)]
751mod test_f32 {
752 pub const V1: f32 = 1.0;
753 pub const V2: f32 = 2.0;
754 pub const V3: f32 = 3.0;
755 pub const V4: f32 = 4.0;
756}
757
758#[cfg(test)]
759mod test_f64 {
760 pub const V1: f64 = 1.0;
761 pub const V2: f64 = 2.0;
762 pub const V3: f64 = 3.0;
763 pub const V4: f64 = 4.0;
764}
765
766#[cfg(test)]
767mod test_i8 {
768 pub const V1: i8 = 1;
769 pub const V2: i8 = 2;
770 pub const V3: i8 = 3;
771 pub const V4: i8 = 4;
772}
773
774#[cfg(test)]
775mod test_i16 {
776 pub const V1: i16 = 1;
777 pub const V2: i16 = 2;
778 pub const V3: i16 = 3;
779 pub const V4: i16 = 4;
780}
781
782#[cfg(test)]
783mod test_i32 {
784 pub const V1: i32 = 1;
785 pub const V2: i32 = 2;
786 pub const V3: i32 = 3;
787 pub const V4: i32 = 4;
788}
789
790#[cfg(test)]
791mod test_i64 {
792 pub const V1: i64 = 1;
793 pub const V2: i64 = 2;
794 pub const V3: i64 = 3;
795 pub const V4: i64 = 4;
796}
797
798#[cfg(test)]
799mod test_isize {
800 pub const V1: isize = 1;
801 pub const V2: isize = 2;
802 pub const V3: isize = 3;
803 pub const V4: isize = 4;
804}
805
806#[cfg(test)]
807mod test_u8 {
808 pub const V1: u8 = 1;
809 pub const V2: u8 = 2;
810 pub const V3: u8 = 3;
811 pub const V4: u8 = 4;
812}
813
814#[cfg(test)]
815mod test_u16 {
816 pub const V1: u16 = 1;
817 pub const V2: u16 = 2;
818 pub const V3: u16 = 3;
819 pub const V4: u16 = 4;
820}
821
822#[cfg(test)]
823mod test_u32 {
824 pub const V1: u32 = 1;
825 pub const V2: u32 = 2;
826 pub const V3: u32 = 3;
827 pub const V4: u32 = 4;
828}
829
830#[cfg(test)]
831mod test_u64 {
832 pub const V1: u64 = 1;
833 pub const V2: u64 = 2;
834 pub const V3: u64 = 3;
835 pub const V4: u64 = 4;
836}
837
838#[cfg(test)]
839mod test_usize {
840 pub const V1: usize = 1;
841 pub const V2: usize = 2;
842 pub const V3: usize = 3;
843 pub const V4: usize = 4;
844}
845
846#[cfg(test)]
847mod test_float {
848 pub const SX0: &str = "[]";
849 pub const SX1: &str = "[1.0]";
850 pub const SX2: &str = "[1.0,2.0]";
851 pub const SX3: &str = "[1.0,2.0,3.0]";
852 pub const SX4: &str = "[1.0,2.0,3.0,4.0]";
853 pub const SX5: &str = "[1.0,2.0,3.0,4.0,5.0]";
854 pub const ST0: &str = "{}";
855}
856
857#[cfg(test)]
858mod test_int {
859 pub const SX0: &str = "[]";
860 pub const SX1: &str = "[1]";
861 pub const SX2: &str = "[1,2]";
862 pub const SX3: &str = "[1,2,3]";
863 pub const SX4: &str = "[1,2,3,4]";
864 pub const SX5: &str = "[1,2,3,4,5]";
865 pub const ST0: &str = "{}";
866}
867
868#[cfg(test)]
869mod test_bool_mask {
870 pub const SX0: &str = "[]";
871 pub const SX1: &str = "[true]";
872 pub const SX2: &str = "[true,true]";
873 pub const SX3: &str = "[true,true,true]";
874 pub const SX4: &str = "[true,true,true,true]";
875 pub const SX5: &str = "[true,true,true,true,true]";
876 pub const ST0: &str = "{}";
877 pub const V1: bool = true;
878 pub const V2: bool = true;
879 pub const V3: bool = true;
880 pub const V4: bool = true;
881}
882
883mod bool {
884 #[cfg(test)]
885 use super::test_bool_mask::*;
886 use crate::{BVec2, BVec3, BVec4};
887 #[cfg(not(feature = "scalar-math"))]
888 use crate::{BVec3A, BVec4A};
889 use core::fmt;
890 use serde_core::{
891 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
892 ser::{Serialize, SerializeTupleStruct, Serializer},
893 };
894
895 impl_serde_vec2!(bool, BVec2);
896 impl_serde_vec3!(bool, BVec3);
897 impl_serde_vec4!(bool, BVec4);
898
899 #[cfg(not(feature = "scalar-math"))]
900 impl Serialize for BVec3A {
901 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
902 where
903 S: Serializer,
904 {
905 let mut state = serializer.serialize_tuple_struct("BVec3A", 3)?;
906 let a: [bool; 3] = (*self).into();
907 state.serialize_field(&a[0])?;
908 state.serialize_field(&a[1])?;
909 state.serialize_field(&a[2])?;
910 state.end()
911 }
912 }
913
914 #[cfg(not(feature = "scalar-math"))]
915 impl<'de> Deserialize<'de> for BVec3A {
916 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
917 where
918 D: Deserializer<'de>,
919 {
920 struct Vec3Visitor;
921
922 impl<'de> Visitor<'de> for Vec3Visitor {
923 type Value = BVec3A;
924
925 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
926 formatter.write_str(concat!("a sequence of 3 ", stringify!($t), "values"))
927 }
928
929 fn visit_seq<V>(self, mut seq: V) -> Result<BVec3A, V::Error>
930 where
931 V: SeqAccess<'de>,
932 {
933 let x = seq
934 .next_element()?
935 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
936 let y = seq
937 .next_element()?
938 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
939 let z = seq
940 .next_element()?
941 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
942 Ok(BVec3A::new(x, y, z))
943 }
944 }
945
946 deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor)
947 }
948 }
949
950 #[cfg(not(feature = "scalar-math"))]
951 #[test]
952 fn test_bvec3a_serde() {
953 let a = BVec3A::new(V1, V2, V3);
954 let serialized = serde_json::to_string(&a).unwrap();
955 assert_eq!(SX3, serialized);
956 let deserialized = serde_json::from_str(&serialized).unwrap();
957 assert_eq!(a, deserialized);
958 let deserialized = serde_json::from_str::<BVec3A>(SX0);
959 assert!(deserialized.is_err());
960 let deserialized = serde_json::from_str::<BVec3A>(SX1);
961 assert!(deserialized.is_err());
962 let deserialized = serde_json::from_str::<BVec3A>(SX2);
963 assert!(deserialized.is_err());
964 let deserialized = serde_json::from_str::<BVec3A>(SX4);
965 assert!(deserialized.is_err());
966 }
967
968 #[cfg(not(feature = "scalar-math"))]
969 impl Serialize for BVec4A {
970 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
971 where
972 S: Serializer,
973 {
974 let mut state = serializer.serialize_tuple_struct(stringify!(BVec4A), 4)?;
975 let a: [bool; 4] = (*self).into();
976 state.serialize_field(&a[0])?;
977 state.serialize_field(&a[1])?;
978 state.serialize_field(&a[2])?;
979 state.serialize_field(&a[2])?;
980 state.end()
981 }
982 }
983
984 #[cfg(not(feature = "scalar-math"))]
985 impl<'de> Deserialize<'de> for BVec4A {
986 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
987 where
988 D: Deserializer<'de>,
989 {
990 struct Vec4Visitor;
991
992 impl<'de> Visitor<'de> for Vec4Visitor {
993 type Value = BVec4A;
994
995 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
996 formatter.write_str(concat!("a sequence of 4 ", stringify!($t), "values"))
997 }
998
999 fn visit_seq<V>(self, mut seq: V) -> Result<BVec4A, V::Error>
1000 where
1001 V: SeqAccess<'de>,
1002 {
1003 let x = seq
1004 .next_element()?
1005 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
1006 let y = seq
1007 .next_element()?
1008 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
1009 let z = seq
1010 .next_element()?
1011 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
1012 let w = seq
1013 .next_element()?
1014 .ok_or_else(|| de::Error::invalid_length(3, &self))?;
1015 Ok(BVec4A::new(x, y, z, w))
1016 }
1017 }
1018
1019 deserializer.deserialize_tuple_struct(stringify!(BVec4A), 4, Vec4Visitor)
1020 }
1021 }
1022
1023 #[cfg(not(feature = "scalar-math"))]
1024 #[test]
1025 fn test_bvec4a_serde() {
1026 let a = BVec4A::new(V1, V2, V3, V4);
1027 let serialized = serde_json::to_string(&a).unwrap();
1028 assert_eq!(SX4, serialized);
1029 let deserialized = serde_json::from_str(&serialized).unwrap();
1030 assert_eq!(a, deserialized);
1031 let deserialized = serde_json::from_str::<BVec4A>(SX0);
1032 assert!(deserialized.is_err());
1033 let deserialized = serde_json::from_str::<BVec4A>(SX1);
1034 assert!(deserialized.is_err());
1035 let deserialized = serde_json::from_str::<BVec4A>(SX2);
1036 assert!(deserialized.is_err());
1037 let deserialized = serde_json::from_str::<BVec4A>(SX3);
1038 assert!(deserialized.is_err());
1039 let deserialized = serde_json::from_str::<BVec4A>(SX5);
1040 assert!(deserialized.is_err());
1041 }
1042}
1043
1044mod f32 {
1045 #[cfg(test)]
1046 use super::test_f32::*;
1047 #[cfg(test)]
1048 use super::test_float::*;
1049 use crate::{
1050 Affine2, Affine3, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4,
1051 };
1052 use core::fmt;
1053 use serde_core::{
1054 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1055 ser::{Serialize, SerializeTupleStruct, Serializer},
1056 };
1057
1058 impl_serde_float_types!(f32, Affine2, Affine3, Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec4);
1059 impl_serde_affine3!(test_affine3a_serde, f32, Affine3A);
1060 impl_serde_mat3!(f32, Mat3A, test_mat3a_serde);
1061 impl_serde_vec3!(f32, Vec3A, test_vec3a_serde);
1062}
1063
1064mod f64 {
1065 #[cfg(test)]
1066 use super::test_f64::*;
1067 #[cfg(test)]
1068 use super::test_float::*;
1069 use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4};
1070 use core::fmt;
1071 use serde_core::{
1072 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1073 ser::{Serialize, SerializeTupleStruct, Serializer},
1074 };
1075
1076 impl_serde_float_types!(
1077 f64, DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4
1078 );
1079}
1080
1081mod i8 {
1082 #[cfg(test)]
1083 use super::test_i8::*;
1084 #[cfg(test)]
1085 use super::test_int::*;
1086 use crate::{I8Vec2, I8Vec3, I8Vec4};
1087 use core::fmt;
1088 use serde_core::{
1089 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1090 ser::{Serialize, SerializeTupleStruct, Serializer},
1091 };
1092
1093 impl_serde_vec_types!(i8, I8Vec2, I8Vec3, I8Vec4);
1094}
1095
1096mod i16 {
1097 #[cfg(test)]
1098 use super::test_i16::*;
1099 #[cfg(test)]
1100 use super::test_int::*;
1101 use crate::{I16Vec2, I16Vec3, I16Vec4};
1102 use core::fmt;
1103 use serde_core::{
1104 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1105 ser::{Serialize, SerializeTupleStruct, Serializer},
1106 };
1107
1108 impl_serde_vec_types!(i16, I16Vec2, I16Vec3, I16Vec4);
1109}
1110
1111mod i32 {
1112 #[cfg(test)]
1113 use super::test_i32::*;
1114 #[cfg(test)]
1115 use super::test_int::*;
1116 use crate::{IVec2, IVec3, IVec4};
1117 use core::fmt;
1118 use serde_core::{
1119 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1120 ser::{Serialize, SerializeTupleStruct, Serializer},
1121 };
1122
1123 impl_serde_vec_types!(i32, IVec2, IVec3, IVec4);
1124}
1125
1126mod i64 {
1127 #[cfg(test)]
1128 use super::test_i64::*;
1129 #[cfg(test)]
1130 use super::test_int::*;
1131 use crate::{I64Vec2, I64Vec3, I64Vec4};
1132 use core::fmt;
1133 use serde_core::{
1134 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1135 ser::{Serialize, SerializeTupleStruct, Serializer},
1136 };
1137
1138 impl_serde_vec_types!(i64, I64Vec2, I64Vec3, I64Vec4);
1139}
1140
1141mod isize {
1142 #[cfg(test)]
1143 use super::test_int::*;
1144 #[cfg(test)]
1145 use super::test_isize::*;
1146 use crate::{ISizeVec2, ISizeVec3, ISizeVec4};
1147 use core::fmt;
1148 use serde_core::{
1149 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1150 ser::{Serialize, SerializeTupleStruct, Serializer},
1151 };
1152
1153 impl_serde_vec_types!(isize, ISizeVec2, ISizeVec3, ISizeVec4);
1154}
1155
1156mod u8 {
1157 #[cfg(test)]
1158 use super::test_int::*;
1159 #[cfg(test)]
1160 use super::test_u8::*;
1161 use crate::{U8Vec2, U8Vec3, U8Vec4};
1162 use core::fmt;
1163 use serde_core::{
1164 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1165 ser::{Serialize, SerializeTupleStruct, Serializer},
1166 };
1167
1168 impl_serde_vec_types!(u8, U8Vec2, U8Vec3, U8Vec4);
1169}
1170
1171mod u16 {
1172 #[cfg(test)]
1173 use super::test_int::*;
1174 #[cfg(test)]
1175 use super::test_u16::*;
1176 use crate::{U16Vec2, U16Vec3, U16Vec4};
1177 use core::fmt;
1178 use serde_core::{
1179 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1180 ser::{Serialize, SerializeTupleStruct, Serializer},
1181 };
1182
1183 impl_serde_vec_types!(u16, U16Vec2, U16Vec3, U16Vec4);
1184}
1185
1186mod u32 {
1187 #[cfg(test)]
1188 use super::test_int::*;
1189 #[cfg(test)]
1190 use super::test_u32::*;
1191 use crate::{UVec2, UVec3, UVec4};
1192 use core::fmt;
1193 use serde_core::{
1194 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1195 ser::{Serialize, SerializeTupleStruct, Serializer},
1196 };
1197
1198 impl_serde_vec_types!(u32, UVec2, UVec3, UVec4);
1199}
1200
1201mod u64 {
1202 #[cfg(test)]
1203 use super::test_int::*;
1204 #[cfg(test)]
1205 use super::test_u64::*;
1206 use crate::{U64Vec2, U64Vec3, U64Vec4};
1207 use core::fmt;
1208 use serde_core::{
1209 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1210 ser::{Serialize, SerializeTupleStruct, Serializer},
1211 };
1212
1213 impl_serde_vec_types!(u64, U64Vec2, U64Vec3, U64Vec4);
1214}
1215
1216mod usize {
1217 #[cfg(test)]
1218 use super::test_int::*;
1219 #[cfg(test)]
1220 use super::test_usize::*;
1221 use crate::{USizeVec2, USizeVec3, USizeVec4};
1222 use core::fmt;
1223 use serde_core::{
1224 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1225 ser::{Serialize, SerializeTupleStruct, Serializer},
1226 };
1227
1228 impl_serde_vec_types!(usize, USizeVec2, USizeVec3, USizeVec4);
1229}
1230
1231mod euler {
1232 use crate::EulerRot;
1233
1234 impl serde_core::Serialize for EulerRot {
1235 fn serialize<S: serde_core::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1236 match *self {
1237 EulerRot::ZYX => serde_core::Serializer::serialize_unit_variant(
1238 serializer, "EulerRot", 0u32, "ZYX",
1239 ),
1240 EulerRot::ZXY => serde_core::Serializer::serialize_unit_variant(
1241 serializer, "EulerRot", 1u32, "ZXY",
1242 ),
1243 EulerRot::YXZ => serde_core::Serializer::serialize_unit_variant(
1244 serializer, "EulerRot", 2u32, "YXZ",
1245 ),
1246 EulerRot::YZX => serde_core::Serializer::serialize_unit_variant(
1247 serializer, "EulerRot", 3u32, "YZX",
1248 ),
1249 EulerRot::XYZ => serde_core::Serializer::serialize_unit_variant(
1250 serializer, "EulerRot", 4u32, "XYZ",
1251 ),
1252 EulerRot::XZY => serde_core::Serializer::serialize_unit_variant(
1253 serializer, "EulerRot", 5u32, "XZY",
1254 ),
1255 EulerRot::ZYZ => serde_core::Serializer::serialize_unit_variant(
1256 serializer, "EulerRot", 6u32, "ZYZ",
1257 ),
1258 EulerRot::ZXZ => serde_core::Serializer::serialize_unit_variant(
1259 serializer, "EulerRot", 7u32, "ZXZ",
1260 ),
1261 EulerRot::YXY => serde_core::Serializer::serialize_unit_variant(
1262 serializer, "EulerRot", 8u32, "YXY",
1263 ),
1264 EulerRot::YZY => serde_core::Serializer::serialize_unit_variant(
1265 serializer, "EulerRot", 9u32, "YZY",
1266 ),
1267 EulerRot::XYX => serde_core::Serializer::serialize_unit_variant(
1268 serializer, "EulerRot", 10u32, "XYX",
1269 ),
1270 EulerRot::XZX => serde_core::Serializer::serialize_unit_variant(
1271 serializer, "EulerRot", 11u32, "XZX",
1272 ),
1273 EulerRot::ZYXEx => serde_core::Serializer::serialize_unit_variant(
1274 serializer, "EulerRot", 12u32, "ZYXEx",
1275 ),
1276 EulerRot::ZXYEx => serde_core::Serializer::serialize_unit_variant(
1277 serializer, "EulerRot", 13u32, "ZXYEx",
1278 ),
1279 EulerRot::YXZEx => serde_core::Serializer::serialize_unit_variant(
1280 serializer, "EulerRot", 14u32, "YXZEx",
1281 ),
1282 EulerRot::YZXEx => serde_core::Serializer::serialize_unit_variant(
1283 serializer, "EulerRot", 15u32, "YZXEx",
1284 ),
1285 EulerRot::XYZEx => serde_core::Serializer::serialize_unit_variant(
1286 serializer, "EulerRot", 16u32, "XYZEx",
1287 ),
1288 EulerRot::XZYEx => serde_core::Serializer::serialize_unit_variant(
1289 serializer, "EulerRot", 17u32, "XZYEx",
1290 ),
1291 EulerRot::ZYZEx => serde_core::Serializer::serialize_unit_variant(
1292 serializer, "EulerRot", 18u32, "ZYZEx",
1293 ),
1294 EulerRot::ZXZEx => serde_core::Serializer::serialize_unit_variant(
1295 serializer, "EulerRot", 19u32, "ZXZEx",
1296 ),
1297 EulerRot::YXYEx => serde_core::Serializer::serialize_unit_variant(
1298 serializer, "EulerRot", 20u32, "YXYEx",
1299 ),
1300 EulerRot::YZYEx => serde_core::Serializer::serialize_unit_variant(
1301 serializer, "EulerRot", 21u32, "YZYEx",
1302 ),
1303 EulerRot::XYXEx => serde_core::Serializer::serialize_unit_variant(
1304 serializer, "EulerRot", 22u32, "XYXEx",
1305 ),
1306 EulerRot::XZXEx => serde_core::Serializer::serialize_unit_variant(
1307 serializer, "EulerRot", 23u32, "XZXEx",
1308 ),
1309 }
1310 }
1311 }
1312
1313 impl<'de> serde_core::Deserialize<'de> for EulerRot {
1314 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1315 where
1316 D: serde_core::Deserializer<'de>,
1317 {
1318 #[allow(clippy::upper_case_acronyms)]
1319 enum Field {
1320 ZYX,
1321 ZXY,
1322 YXZ,
1323 YZX,
1324 XYZ,
1325 XZY,
1326 ZYZ,
1327 ZXZ,
1328 YXY,
1329 YZY,
1330 XYX,
1331 XZX,
1332 ZYXEx,
1333 ZXYEx,
1334 YXZEx,
1335 YZXEx,
1336 XYZEx,
1337 XZYEx,
1338 ZYZEx,
1339 ZXZEx,
1340 YXYEx,
1341 YZYEx,
1342 XYXEx,
1343 XZXEx,
1344 }
1345 struct FieldVisitor;
1346
1347 impl serde_core::de::Visitor<'_> for FieldVisitor {
1348 type Value = Field;
1349 fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1350 core::fmt::Formatter::write_str(formatter, "a variant identifier")
1351 }
1352 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
1353 where
1354 E: serde_core::de::Error,
1355 {
1356 match value {
1357 0u64 => Ok(Field::ZYX),
1358 1u64 => Ok(Field::ZXY),
1359 2u64 => Ok(Field::YXZ),
1360 3u64 => Ok(Field::YZX),
1361 4u64 => Ok(Field::XYZ),
1362 5u64 => Ok(Field::XZY),
1363 6u64 => Ok(Field::ZYZ),
1364 7u64 => Ok(Field::ZXZ),
1365 8u64 => Ok(Field::YXY),
1366 9u64 => Ok(Field::YZY),
1367 10u64 => Ok(Field::XYX),
1368 11u64 => Ok(Field::XZX),
1369
1370 12u64 => Ok(Field::ZYXEx),
1371 13u64 => Ok(Field::ZXYEx),
1372 14u64 => Ok(Field::YXZEx),
1373 15u64 => Ok(Field::YZXEx),
1374 16u64 => Ok(Field::XYZEx),
1375 17u64 => Ok(Field::XZYEx),
1376 18u64 => Ok(Field::ZYZEx),
1377 19u64 => Ok(Field::ZXZEx),
1378 20u64 => Ok(Field::YXYEx),
1379 21u64 => Ok(Field::YZYEx),
1380 22u64 => Ok(Field::XYXEx),
1381 23u64 => Ok(Field::XZXEx),
1382 _ => Err(serde_core::de::Error::invalid_value(
1383 serde_core::de::Unexpected::Unsigned(value),
1384 &"variant index 0 <= i < 24",
1385 )),
1386 }
1387 }
1388 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1389 where
1390 E: serde_core::de::Error,
1391 {
1392 match value {
1393 "ZYX" => Ok(Field::ZYX),
1394 "ZXY" => Ok(Field::ZXY),
1395 "YXZ" => Ok(Field::YXZ),
1396 "YZX" => Ok(Field::YZX),
1397 "XYZ" => Ok(Field::XYZ),
1398 "XZY" => Ok(Field::XZY),
1399 "ZYZ" => Ok(Field::ZYZ),
1400 "ZXZ" => Ok(Field::ZXZ),
1401 "YXY" => Ok(Field::YXY),
1402 "YZY" => Ok(Field::YZY),
1403 "XYX" => Ok(Field::XYX),
1404 "XZX" => Ok(Field::XZX),
1405 "ZYXEx" => Ok(Field::ZYXEx),
1406 "ZXYEx" => Ok(Field::ZXYEx),
1407 "YXZEx" => Ok(Field::YXZEx),
1408 "YZXEx" => Ok(Field::YZXEx),
1409 "XYZEx" => Ok(Field::XYZEx),
1410 "XZYEx" => Ok(Field::XZYEx),
1411 "ZYZEx" => Ok(Field::ZYZEx),
1412 "ZXZEx" => Ok(Field::ZXZEx),
1413 "YXYEx" => Ok(Field::YXYEx),
1414 "YZYEx" => Ok(Field::YZYEx),
1415 "XYXEx" => Ok(Field::XYXEx),
1416 "XZXEx" => Ok(Field::XZXEx),
1417 _ => Err(serde_core::de::Error::unknown_variant(value, VARIANTS)),
1418 }
1419 }
1420 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
1421 where
1422 E: serde_core::de::Error,
1423 {
1424 match value {
1425 b"ZYX" => Ok(Field::ZYX),
1426 b"ZXY" => Ok(Field::ZXY),
1427 b"YXZ" => Ok(Field::YXZ),
1428 b"YZX" => Ok(Field::YZX),
1429 b"XYZ" => Ok(Field::XYZ),
1430 b"XZY" => Ok(Field::XZY),
1431 b"ZYZ" => Ok(Field::ZYZ),
1432 b"ZXZ" => Ok(Field::ZXZ),
1433 b"YXY" => Ok(Field::YXY),
1434 b"YZY" => Ok(Field::YZY),
1435 b"XYX" => Ok(Field::XYX),
1436 b"XZX" => Ok(Field::XZX),
1437 b"ZYXEx" => Ok(Field::ZYXEx),
1438 b"ZXYEx" => Ok(Field::ZXYEx),
1439 b"YXZEx" => Ok(Field::YXZEx),
1440 b"YZXEx" => Ok(Field::YZXEx),
1441 b"XYZEx" => Ok(Field::XYZEx),
1442 b"XZYEx" => Ok(Field::XZYEx),
1443 b"ZYZEx" => Ok(Field::ZYZEx),
1444 b"ZXZEx" => Ok(Field::ZXZEx),
1445 b"YXYEx" => Ok(Field::YXYEx),
1446 b"YZYEx" => Ok(Field::YZYEx),
1447 b"XYXEx" => Ok(Field::XYXEx),
1448 b"XZXEx" => Ok(Field::XZXEx),
1449 _ => {
1450 #[cfg(feature = "std")]
1451 let value = &String::from_utf8_lossy(value);
1452 #[cfg(not(feature = "std"))]
1453 let value =
1454 core::str::from_utf8(value).unwrap_or("\u{fffd}\u{fffd}\u{fffd}");
1455 Err(serde_core::de::Error::unknown_variant(value, VARIANTS))
1456 }
1457 }
1458 }
1459 }
1460 impl<'de> serde_core::Deserialize<'de> for Field {
1461 #[inline]
1462 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1463 where
1464 D: serde_core::Deserializer<'de>,
1465 {
1466 serde_core::Deserializer::deserialize_identifier(deserializer, FieldVisitor)
1467 }
1468 }
1469 struct Visitor<'de> {
1470 marker: core::marker::PhantomData<EulerRot>,
1471 lifetime: core::marker::PhantomData<&'de ()>,
1472 }
1473 impl<'de> serde_core::de::Visitor<'de> for Visitor<'de> {
1474 type Value = EulerRot;
1475 fn expecting(
1476 &self,
1477 __formatter: &mut core::fmt::Formatter<'_>,
1478 ) -> core::fmt::Result {
1479 core::fmt::Formatter::write_str(__formatter, "an EulerRot enum")
1480 }
1481 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
1482 where
1483 A: serde_core::de::EnumAccess<'de>,
1484 {
1485 match serde_core::de::EnumAccess::variant(data)? {
1486 (Field::ZYX, variant) => {
1487 serde_core::de::VariantAccess::unit_variant(variant)?;
1488 Ok(EulerRot::ZYX)
1489 }
1490 (Field::ZXY, variant) => {
1491 serde_core::de::VariantAccess::unit_variant(variant)?;
1492 Ok(EulerRot::ZXY)
1493 }
1494 (Field::YXZ, variant) => {
1495 serde_core::de::VariantAccess::unit_variant(variant)?;
1496 Ok(EulerRot::YXZ)
1497 }
1498 (Field::YZX, variant) => {
1499 serde_core::de::VariantAccess::unit_variant(variant)?;
1500 Ok(EulerRot::YZX)
1501 }
1502 (Field::XYZ, variant) => {
1503 serde_core::de::VariantAccess::unit_variant(variant)?;
1504 Ok(EulerRot::XYZ)
1505 }
1506 (Field::XZY, variant) => {
1507 serde_core::de::VariantAccess::unit_variant(variant)?;
1508 Ok(EulerRot::XZY)
1509 }
1510
1511 (Field::ZYZ, variant) => {
1512 serde_core::de::VariantAccess::unit_variant(variant)?;
1513 Ok(EulerRot::ZYZ)
1514 }
1515 (Field::ZXZ, variant) => {
1516 serde_core::de::VariantAccess::unit_variant(variant)?;
1517 Ok(EulerRot::ZXZ)
1518 }
1519 (Field::YXY, variant) => {
1520 serde_core::de::VariantAccess::unit_variant(variant)?;
1521 Ok(EulerRot::YXY)
1522 }
1523 (Field::YZY, variant) => {
1524 serde_core::de::VariantAccess::unit_variant(variant)?;
1525 Ok(EulerRot::YZY)
1526 }
1527 (Field::XYX, variant) => {
1528 serde_core::de::VariantAccess::unit_variant(variant)?;
1529 Ok(EulerRot::XYX)
1530 }
1531 (Field::XZX, variant) => {
1532 serde_core::de::VariantAccess::unit_variant(variant)?;
1533 Ok(EulerRot::XZX)
1534 }
1535 (Field::ZYXEx, variant) => {
1536 serde_core::de::VariantAccess::unit_variant(variant)?;
1537 Ok(EulerRot::ZYXEx)
1538 }
1539 (Field::ZXYEx, variant) => {
1540 serde_core::de::VariantAccess::unit_variant(variant)?;
1541 Ok(EulerRot::ZXYEx)
1542 }
1543 (Field::YXZEx, variant) => {
1544 serde_core::de::VariantAccess::unit_variant(variant)?;
1545 Ok(EulerRot::YXZEx)
1546 }
1547 (Field::YZXEx, variant) => {
1548 serde_core::de::VariantAccess::unit_variant(variant)?;
1549 Ok(EulerRot::YZXEx)
1550 }
1551 (Field::XYZEx, variant) => {
1552 serde_core::de::VariantAccess::unit_variant(variant)?;
1553 Ok(EulerRot::XYZEx)
1554 }
1555 (Field::XZYEx, variant) => {
1556 serde_core::de::VariantAccess::unit_variant(variant)?;
1557 Ok(EulerRot::XZYEx)
1558 }
1559 (Field::ZYZEx, variant) => {
1560 serde_core::de::VariantAccess::unit_variant(variant)?;
1561 Ok(EulerRot::ZYZEx)
1562 }
1563 (Field::ZXZEx, variant) => {
1564 serde_core::de::VariantAccess::unit_variant(variant)?;
1565 Ok(EulerRot::ZXZEx)
1566 }
1567 (Field::YXYEx, variant) => {
1568 serde_core::de::VariantAccess::unit_variant(variant)?;
1569 Ok(EulerRot::YXYEx)
1570 }
1571 (Field::YZYEx, variant) => {
1572 serde_core::de::VariantAccess::unit_variant(variant)?;
1573 Ok(EulerRot::YZYEx)
1574 }
1575 (Field::XYXEx, variant) => {
1576 serde_core::de::VariantAccess::unit_variant(variant)?;
1577 Ok(EulerRot::XYXEx)
1578 }
1579 (Field::XZXEx, variant) => {
1580 serde_core::de::VariantAccess::unit_variant(variant)?;
1581 Ok(EulerRot::XZXEx)
1582 }
1583 }
1584 }
1585 }
1586 const VARIANTS: &[&str] = &[
1587 "ZYX", "ZXY", "YXZ", "YZX", "XYZ", "XZY", "ZYZ", "ZXZ", "YXY", "YZY", "XYX", "XZX",
1588 "ZYXEx", "ZXYEx", "YXZEx", "YZXEx", "XYZEx", "XZYEx", "ZYZEx", "ZXZEx", "YXYEx",
1589 "YZYEx", "XYXEx", "XZXEx",
1590 ];
1591 serde_core::Deserializer::deserialize_enum(
1592 deserializer,
1593 "EulerRot",
1594 VARIANTS,
1595 Visitor {
1596 marker: core::marker::PhantomData::<EulerRot>,
1597 lifetime: core::marker::PhantomData,
1598 },
1599 )
1600 }
1601 }
1602
1603 #[test]
1604 fn test_euler_rot_serde() {
1605 const PAIRS: [(EulerRot, &str); 24] = [
1606 (EulerRot::ZYX, "\"ZYX\""),
1607 (EulerRot::ZXY, "\"ZXY\""),
1608 (EulerRot::YXZ, "\"YXZ\""),
1609 (EulerRot::YZX, "\"YZX\""),
1610 (EulerRot::XYZ, "\"XYZ\""),
1611 (EulerRot::XZY, "\"XZY\""),
1612 (EulerRot::ZYZ, "\"ZYZ\""),
1613 (EulerRot::ZXZ, "\"ZXZ\""),
1614 (EulerRot::YXY, "\"YXY\""),
1615 (EulerRot::YZY, "\"YZY\""),
1616 (EulerRot::XYX, "\"XYX\""),
1617 (EulerRot::XZX, "\"XZX\""),
1618 (EulerRot::ZYXEx, "\"ZYXEx\""),
1619 (EulerRot::ZXYEx, "\"ZXYEx\""),
1620 (EulerRot::YXZEx, "\"YXZEx\""),
1621 (EulerRot::YZXEx, "\"YZXEx\""),
1622 (EulerRot::XYZEx, "\"XYZEx\""),
1623 (EulerRot::XZYEx, "\"XZYEx\""),
1624 (EulerRot::ZYZEx, "\"ZYZEx\""),
1625 (EulerRot::ZXZEx, "\"ZXZEx\""),
1626 (EulerRot::YXYEx, "\"YXYEx\""),
1627 (EulerRot::YZYEx, "\"YZYEx\""),
1628 (EulerRot::XYXEx, "\"XYXEx\""),
1629 (EulerRot::XZXEx, "\"XZXEx\""),
1630 ];
1631 for (enum_value, enum_string) in PAIRS {
1632 let serialized = serde_json::to_string(&enum_value).unwrap();
1633 assert_eq!(enum_string, serialized);
1634 let deserialized = serde_json::from_str(&serialized).unwrap();
1635 assert_eq!(enum_value, deserialized);
1636 }
1637 }
1638}