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 ($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 test_affine3_serde() {
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!($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_u8 {
800 pub const V1: u8 = 1;
801 pub const V2: u8 = 2;
802 pub const V3: u8 = 3;
803 pub const V4: u8 = 4;
804}
805
806#[cfg(test)]
807mod test_u16 {
808 pub const V1: u16 = 1;
809 pub const V2: u16 = 2;
810 pub const V3: u16 = 3;
811 pub const V4: u16 = 4;
812}
813
814#[cfg(test)]
815mod test_u32 {
816 pub const V1: u32 = 1;
817 pub const V2: u32 = 2;
818 pub const V3: u32 = 3;
819 pub const V4: u32 = 4;
820}
821
822#[cfg(test)]
823mod test_u64 {
824 pub const V1: u64 = 1;
825 pub const V2: u64 = 2;
826 pub const V3: u64 = 3;
827 pub const V4: u64 = 4;
828}
829
830#[cfg(test)]
831mod test_usize {
832 pub const V1: usize = 1;
833 pub const V2: usize = 2;
834 pub const V3: usize = 3;
835 pub const V4: usize = 4;
836}
837
838#[cfg(test)]
839mod test_float {
840 pub const SX0: &str = "[]";
841 pub const SX1: &str = "[1.0]";
842 pub const SX2: &str = "[1.0,2.0]";
843 pub const SX3: &str = "[1.0,2.0,3.0]";
844 pub const SX4: &str = "[1.0,2.0,3.0,4.0]";
845 pub const SX5: &str = "[1.0,2.0,3.0,4.0,5.0]";
846 pub const ST0: &str = "{}";
847}
848
849#[cfg(test)]
850mod test_int {
851 pub const SX0: &str = "[]";
852 pub const SX1: &str = "[1]";
853 pub const SX2: &str = "[1,2]";
854 pub const SX3: &str = "[1,2,3]";
855 pub const SX4: &str = "[1,2,3,4]";
856 pub const SX5: &str = "[1,2,3,4,5]";
857 pub const ST0: &str = "{}";
858}
859
860#[cfg(test)]
861mod test_bool_mask {
862 pub const SX0: &str = "[]";
863 pub const SX1: &str = "[true]";
864 pub const SX2: &str = "[true,true]";
865 pub const SX3: &str = "[true,true,true]";
866 pub const SX4: &str = "[true,true,true,true]";
867 pub const SX5: &str = "[true,true,true,true,true]";
868 pub const ST0: &str = "{}";
869 pub const V1: bool = true;
870 pub const V2: bool = true;
871 pub const V3: bool = true;
872 pub const V4: bool = true;
873}
874
875mod bool {
876 #[cfg(test)]
877 use super::test_bool_mask::*;
878 use crate::{BVec2, BVec3, BVec4};
879 #[cfg(not(feature = "scalar-math"))]
880 use crate::{BVec3A, BVec4A};
881 use core::fmt;
882 use serde_core::{
883 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
884 ser::{Serialize, SerializeTupleStruct, Serializer},
885 };
886
887 impl_serde_vec2!(bool, BVec2);
888 impl_serde_vec3!(bool, BVec3);
889 impl_serde_vec4!(bool, BVec4);
890
891 #[cfg(not(feature = "scalar-math"))]
892 impl Serialize for BVec3A {
893 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
894 where
895 S: Serializer,
896 {
897 let mut state = serializer.serialize_tuple_struct("BVec3A", 3)?;
898 let a: [bool; 3] = (*self).into();
899 state.serialize_field(&a[0])?;
900 state.serialize_field(&a[1])?;
901 state.serialize_field(&a[2])?;
902 state.end()
903 }
904 }
905
906 #[cfg(not(feature = "scalar-math"))]
907 impl<'de> Deserialize<'de> for BVec3A {
908 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
909 where
910 D: Deserializer<'de>,
911 {
912 struct Vec3Visitor;
913
914 impl<'de> Visitor<'de> for Vec3Visitor {
915 type Value = BVec3A;
916
917 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
918 formatter.write_str(concat!("a sequence of 3 ", stringify!($t), "values"))
919 }
920
921 fn visit_seq<V>(self, mut seq: V) -> Result<BVec3A, V::Error>
922 where
923 V: SeqAccess<'de>,
924 {
925 let x = seq
926 .next_element()?
927 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
928 let y = seq
929 .next_element()?
930 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
931 let z = seq
932 .next_element()?
933 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
934 Ok(BVec3A::new(x, y, z))
935 }
936 }
937
938 deserializer.deserialize_tuple_struct(stringify!($vec3), 3, Vec3Visitor)
939 }
940 }
941
942 #[cfg(not(feature = "scalar-math"))]
943 #[test]
944 fn test_bvec3a_serde() {
945 let a = BVec3A::new(V1, V2, V3);
946 let serialized = serde_json::to_string(&a).unwrap();
947 assert_eq!(SX3, serialized);
948 let deserialized = serde_json::from_str(&serialized).unwrap();
949 assert_eq!(a, deserialized);
950 let deserialized = serde_json::from_str::<BVec3A>(SX0);
951 assert!(deserialized.is_err());
952 let deserialized = serde_json::from_str::<BVec3A>(SX1);
953 assert!(deserialized.is_err());
954 let deserialized = serde_json::from_str::<BVec3A>(SX2);
955 assert!(deserialized.is_err());
956 let deserialized = serde_json::from_str::<BVec3A>(SX4);
957 assert!(deserialized.is_err());
958 }
959
960 #[cfg(not(feature = "scalar-math"))]
961 impl Serialize for BVec4A {
962 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
963 where
964 S: Serializer,
965 {
966 let mut state = serializer.serialize_tuple_struct(stringify!(BVec4A), 4)?;
967 let a: [bool; 4] = (*self).into();
968 state.serialize_field(&a[0])?;
969 state.serialize_field(&a[1])?;
970 state.serialize_field(&a[2])?;
971 state.serialize_field(&a[2])?;
972 state.end()
973 }
974 }
975
976 #[cfg(not(feature = "scalar-math"))]
977 impl<'de> Deserialize<'de> for BVec4A {
978 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
979 where
980 D: Deserializer<'de>,
981 {
982 struct Vec4Visitor;
983
984 impl<'de> Visitor<'de> for Vec4Visitor {
985 type Value = BVec4A;
986
987 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
988 formatter.write_str(concat!("a sequence of 4 ", stringify!($t), "values"))
989 }
990
991 fn visit_seq<V>(self, mut seq: V) -> Result<BVec4A, V::Error>
992 where
993 V: SeqAccess<'de>,
994 {
995 let x = seq
996 .next_element()?
997 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
998 let y = seq
999 .next_element()?
1000 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
1001 let z = seq
1002 .next_element()?
1003 .ok_or_else(|| de::Error::invalid_length(2, &self))?;
1004 let w = seq
1005 .next_element()?
1006 .ok_or_else(|| de::Error::invalid_length(3, &self))?;
1007 Ok(BVec4A::new(x, y, z, w))
1008 }
1009 }
1010
1011 deserializer.deserialize_tuple_struct(stringify!(BVec4A), 4, Vec4Visitor)
1012 }
1013 }
1014
1015 #[cfg(not(feature = "scalar-math"))]
1016 #[test]
1017 fn test_bvec4a_serde() {
1018 let a = BVec4A::new(V1, V2, V3, V4);
1019 let serialized = serde_json::to_string(&a).unwrap();
1020 assert_eq!(SX4, serialized);
1021 let deserialized = serde_json::from_str(&serialized).unwrap();
1022 assert_eq!(a, deserialized);
1023 let deserialized = serde_json::from_str::<BVec4A>(SX0);
1024 assert!(deserialized.is_err());
1025 let deserialized = serde_json::from_str::<BVec4A>(SX1);
1026 assert!(deserialized.is_err());
1027 let deserialized = serde_json::from_str::<BVec4A>(SX2);
1028 assert!(deserialized.is_err());
1029 let deserialized = serde_json::from_str::<BVec4A>(SX3);
1030 assert!(deserialized.is_err());
1031 let deserialized = serde_json::from_str::<BVec4A>(SX5);
1032 assert!(deserialized.is_err());
1033 }
1034}
1035
1036mod f32 {
1037 #[cfg(test)]
1038 use super::test_f32::*;
1039 #[cfg(test)]
1040 use super::test_float::*;
1041 use crate::{Affine2, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4};
1042 use core::fmt;
1043 use serde_core::{
1044 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1045 ser::{Serialize, SerializeTupleStruct, Serializer},
1046 };
1047
1048 impl_serde_float_types!(f32, Affine2, Affine3A, Mat2, Mat3, Mat4, Quat, Vec2, Vec3, Vec4);
1049 impl_serde_mat3!(f32, Mat3A, test_mat3a_serde);
1050 impl_serde_vec3!(f32, Vec3A, test_vec3a_serde);
1051}
1052
1053mod f64 {
1054 #[cfg(test)]
1055 use super::test_f64::*;
1056 #[cfg(test)]
1057 use super::test_float::*;
1058 use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4};
1059 use core::fmt;
1060 use serde_core::{
1061 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1062 ser::{Serialize, SerializeTupleStruct, Serializer},
1063 };
1064
1065 impl_serde_float_types!(
1066 f64, DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4
1067 );
1068}
1069
1070mod i8 {
1071 #[cfg(test)]
1072 use super::test_i8::*;
1073 #[cfg(test)]
1074 use super::test_int::*;
1075 use crate::{I8Vec2, I8Vec3, I8Vec4};
1076 use core::fmt;
1077 use serde_core::{
1078 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1079 ser::{Serialize, SerializeTupleStruct, Serializer},
1080 };
1081
1082 impl_serde_vec_types!(i8, I8Vec2, I8Vec3, I8Vec4);
1083}
1084
1085mod i16 {
1086 #[cfg(test)]
1087 use super::test_i16::*;
1088 #[cfg(test)]
1089 use super::test_int::*;
1090 use crate::{I16Vec2, I16Vec3, I16Vec4};
1091 use core::fmt;
1092 use serde_core::{
1093 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1094 ser::{Serialize, SerializeTupleStruct, Serializer},
1095 };
1096
1097 impl_serde_vec_types!(i16, I16Vec2, I16Vec3, I16Vec4);
1098}
1099
1100mod i32 {
1101 #[cfg(test)]
1102 use super::test_i32::*;
1103 #[cfg(test)]
1104 use super::test_int::*;
1105 use crate::{IVec2, IVec3, IVec4};
1106 use core::fmt;
1107 use serde_core::{
1108 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1109 ser::{Serialize, SerializeTupleStruct, Serializer},
1110 };
1111
1112 impl_serde_vec_types!(i32, IVec2, IVec3, IVec4);
1113}
1114
1115mod i64 {
1116 #[cfg(test)]
1117 use super::test_i64::*;
1118 #[cfg(test)]
1119 use super::test_int::*;
1120 use crate::{I64Vec2, I64Vec3, I64Vec4};
1121 use core::fmt;
1122 use serde_core::{
1123 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1124 ser::{Serialize, SerializeTupleStruct, Serializer},
1125 };
1126
1127 impl_serde_vec_types!(i64, I64Vec2, I64Vec3, I64Vec4);
1128}
1129
1130mod u8 {
1131 #[cfg(test)]
1132 use super::test_int::*;
1133 #[cfg(test)]
1134 use super::test_u8::*;
1135 use crate::{U8Vec2, U8Vec3, U8Vec4};
1136 use core::fmt;
1137 use serde_core::{
1138 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1139 ser::{Serialize, SerializeTupleStruct, Serializer},
1140 };
1141
1142 impl_serde_vec_types!(u8, U8Vec2, U8Vec3, U8Vec4);
1143}
1144
1145mod u16 {
1146 #[cfg(test)]
1147 use super::test_int::*;
1148 #[cfg(test)]
1149 use super::test_u16::*;
1150 use crate::{U16Vec2, U16Vec3, U16Vec4};
1151 use core::fmt;
1152 use serde_core::{
1153 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1154 ser::{Serialize, SerializeTupleStruct, Serializer},
1155 };
1156
1157 impl_serde_vec_types!(u16, U16Vec2, U16Vec3, U16Vec4);
1158}
1159
1160mod u32 {
1161 #[cfg(test)]
1162 use super::test_int::*;
1163 #[cfg(test)]
1164 use super::test_u32::*;
1165 use crate::{UVec2, UVec3, UVec4};
1166 use core::fmt;
1167 use serde_core::{
1168 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1169 ser::{Serialize, SerializeTupleStruct, Serializer},
1170 };
1171
1172 impl_serde_vec_types!(u32, UVec2, UVec3, UVec4);
1173}
1174
1175mod u64 {
1176 #[cfg(test)]
1177 use super::test_int::*;
1178 #[cfg(test)]
1179 use super::test_u64::*;
1180 use crate::{U64Vec2, U64Vec3, U64Vec4};
1181 use core::fmt;
1182 use serde_core::{
1183 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1184 ser::{Serialize, SerializeTupleStruct, Serializer},
1185 };
1186
1187 impl_serde_vec_types!(u64, U64Vec2, U64Vec3, U64Vec4);
1188}
1189
1190mod usize {
1191 #[cfg(test)]
1192 use super::test_int::*;
1193 #[cfg(test)]
1194 use super::test_usize::*;
1195 use crate::{USizeVec2, USizeVec3, USizeVec4};
1196 use core::fmt;
1197 use serde_core::{
1198 de::{self, Deserialize, Deserializer, SeqAccess, Visitor},
1199 ser::{Serialize, SerializeTupleStruct, Serializer},
1200 };
1201
1202 impl_serde_vec_types!(usize, USizeVec2, USizeVec3, USizeVec4);
1203}
1204
1205mod euler {
1206 use crate::EulerRot;
1207
1208 impl serde_core::Serialize for EulerRot {
1209 fn serialize<S: serde_core::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1210 match *self {
1211 EulerRot::ZYX => serde_core::Serializer::serialize_unit_variant(
1212 serializer, "EulerRot", 0u32, "ZYX",
1213 ),
1214 EulerRot::ZXY => serde_core::Serializer::serialize_unit_variant(
1215 serializer, "EulerRot", 1u32, "ZXY",
1216 ),
1217 EulerRot::YXZ => serde_core::Serializer::serialize_unit_variant(
1218 serializer, "EulerRot", 2u32, "YXZ",
1219 ),
1220 EulerRot::YZX => serde_core::Serializer::serialize_unit_variant(
1221 serializer, "EulerRot", 3u32, "YZX",
1222 ),
1223 EulerRot::XYZ => serde_core::Serializer::serialize_unit_variant(
1224 serializer, "EulerRot", 4u32, "XYZ",
1225 ),
1226 EulerRot::XZY => serde_core::Serializer::serialize_unit_variant(
1227 serializer, "EulerRot", 5u32, "XZY",
1228 ),
1229 EulerRot::ZYZ => serde_core::Serializer::serialize_unit_variant(
1230 serializer, "EulerRot", 6u32, "ZYZ",
1231 ),
1232 EulerRot::ZXZ => serde_core::Serializer::serialize_unit_variant(
1233 serializer, "EulerRot", 7u32, "ZXZ",
1234 ),
1235 EulerRot::YXY => serde_core::Serializer::serialize_unit_variant(
1236 serializer, "EulerRot", 8u32, "YXY",
1237 ),
1238 EulerRot::YZY => serde_core::Serializer::serialize_unit_variant(
1239 serializer, "EulerRot", 9u32, "YZY",
1240 ),
1241 EulerRot::XYX => serde_core::Serializer::serialize_unit_variant(
1242 serializer, "EulerRot", 10u32, "XYX",
1243 ),
1244 EulerRot::XZX => serde_core::Serializer::serialize_unit_variant(
1245 serializer, "EulerRot", 11u32, "XZX",
1246 ),
1247 EulerRot::ZYXEx => serde_core::Serializer::serialize_unit_variant(
1248 serializer, "EulerRot", 12u32, "ZYXEx",
1249 ),
1250 EulerRot::ZXYEx => serde_core::Serializer::serialize_unit_variant(
1251 serializer, "EulerRot", 13u32, "ZXYEx",
1252 ),
1253 EulerRot::YXZEx => serde_core::Serializer::serialize_unit_variant(
1254 serializer, "EulerRot", 14u32, "YXZEx",
1255 ),
1256 EulerRot::YZXEx => serde_core::Serializer::serialize_unit_variant(
1257 serializer, "EulerRot", 15u32, "YZXEx",
1258 ),
1259 EulerRot::XYZEx => serde_core::Serializer::serialize_unit_variant(
1260 serializer, "EulerRot", 16u32, "XYZEx",
1261 ),
1262 EulerRot::XZYEx => serde_core::Serializer::serialize_unit_variant(
1263 serializer, "EulerRot", 17u32, "XZYEx",
1264 ),
1265 EulerRot::ZYZEx => serde_core::Serializer::serialize_unit_variant(
1266 serializer, "EulerRot", 18u32, "ZYZEx",
1267 ),
1268 EulerRot::ZXZEx => serde_core::Serializer::serialize_unit_variant(
1269 serializer, "EulerRot", 19u32, "ZXZEx",
1270 ),
1271 EulerRot::YXYEx => serde_core::Serializer::serialize_unit_variant(
1272 serializer, "EulerRot", 20u32, "YXYEx",
1273 ),
1274 EulerRot::YZYEx => serde_core::Serializer::serialize_unit_variant(
1275 serializer, "EulerRot", 21u32, "YZYEx",
1276 ),
1277 EulerRot::XYXEx => serde_core::Serializer::serialize_unit_variant(
1278 serializer, "EulerRot", 22u32, "XYXEx",
1279 ),
1280 EulerRot::XZXEx => serde_core::Serializer::serialize_unit_variant(
1281 serializer, "EulerRot", 23u32, "XZXEx",
1282 ),
1283 }
1284 }
1285 }
1286
1287 impl<'de> serde_core::Deserialize<'de> for EulerRot {
1288 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1289 where
1290 D: serde_core::Deserializer<'de>,
1291 {
1292 #[allow(clippy::upper_case_acronyms)]
1293 enum Field {
1294 ZYX,
1295 ZXY,
1296 YXZ,
1297 YZX,
1298 XYZ,
1299 XZY,
1300 ZYZ,
1301 ZXZ,
1302 YXY,
1303 YZY,
1304 XYX,
1305 XZX,
1306 ZYXEx,
1307 ZXYEx,
1308 YXZEx,
1309 YZXEx,
1310 XYZEx,
1311 XZYEx,
1312 ZYZEx,
1313 ZXZEx,
1314 YXYEx,
1315 YZYEx,
1316 XYXEx,
1317 XZXEx,
1318 }
1319 struct FieldVisitor;
1320
1321 impl serde_core::de::Visitor<'_> for FieldVisitor {
1322 type Value = Field;
1323 fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1324 core::fmt::Formatter::write_str(formatter, "a variant identifier")
1325 }
1326 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
1327 where
1328 E: serde_core::de::Error,
1329 {
1330 match value {
1331 0u64 => Ok(Field::ZYX),
1332 1u64 => Ok(Field::ZXY),
1333 2u64 => Ok(Field::YXZ),
1334 3u64 => Ok(Field::YZX),
1335 4u64 => Ok(Field::XYZ),
1336 5u64 => Ok(Field::XZY),
1337 6u64 => Ok(Field::ZYZ),
1338 7u64 => Ok(Field::ZXZ),
1339 8u64 => Ok(Field::YXY),
1340 9u64 => Ok(Field::YZY),
1341 10u64 => Ok(Field::XYX),
1342 11u64 => Ok(Field::XZX),
1343
1344 12u64 => Ok(Field::ZYXEx),
1345 13u64 => Ok(Field::ZXYEx),
1346 14u64 => Ok(Field::YXZEx),
1347 15u64 => Ok(Field::YZXEx),
1348 16u64 => Ok(Field::XYZEx),
1349 17u64 => Ok(Field::XZYEx),
1350 18u64 => Ok(Field::ZYZEx),
1351 19u64 => Ok(Field::ZXZEx),
1352 20u64 => Ok(Field::YXYEx),
1353 21u64 => Ok(Field::YZYEx),
1354 22u64 => Ok(Field::XYXEx),
1355 23u64 => Ok(Field::XZXEx),
1356 _ => Err(serde_core::de::Error::invalid_value(
1357 serde_core::de::Unexpected::Unsigned(value),
1358 &"variant index 0 <= i < 24",
1359 )),
1360 }
1361 }
1362 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1363 where
1364 E: serde_core::de::Error,
1365 {
1366 match value {
1367 "ZYX" => Ok(Field::ZYX),
1368 "ZXY" => Ok(Field::ZXY),
1369 "YXZ" => Ok(Field::YXZ),
1370 "YZX" => Ok(Field::YZX),
1371 "XYZ" => Ok(Field::XYZ),
1372 "XZY" => Ok(Field::XZY),
1373 "ZYZ" => Ok(Field::ZYZ),
1374 "ZXZ" => Ok(Field::ZXZ),
1375 "YXY" => Ok(Field::YXY),
1376 "YZY" => Ok(Field::YZY),
1377 "XYX" => Ok(Field::XYX),
1378 "XZX" => Ok(Field::XZX),
1379 "ZYXEx" => Ok(Field::ZYXEx),
1380 "ZXYEx" => Ok(Field::ZXYEx),
1381 "YXZEx" => Ok(Field::YXZEx),
1382 "YZXEx" => Ok(Field::YZXEx),
1383 "XYZEx" => Ok(Field::XYZEx),
1384 "XZYEx" => Ok(Field::XZYEx),
1385 "ZYZEx" => Ok(Field::ZYZEx),
1386 "ZXZEx" => Ok(Field::ZXZEx),
1387 "YXYEx" => Ok(Field::YXYEx),
1388 "YZYEx" => Ok(Field::YZYEx),
1389 "XYXEx" => Ok(Field::XYXEx),
1390 "XZXEx" => Ok(Field::XZXEx),
1391 _ => Err(serde_core::de::Error::unknown_variant(value, VARIANTS)),
1392 }
1393 }
1394 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
1395 where
1396 E: serde_core::de::Error,
1397 {
1398 match value {
1399 b"ZYX" => Ok(Field::ZYX),
1400 b"ZXY" => Ok(Field::ZXY),
1401 b"YXZ" => Ok(Field::YXZ),
1402 b"YZX" => Ok(Field::YZX),
1403 b"XYZ" => Ok(Field::XYZ),
1404 b"XZY" => Ok(Field::XZY),
1405 b"ZYZ" => Ok(Field::ZYZ),
1406 b"ZXZ" => Ok(Field::ZXZ),
1407 b"YXY" => Ok(Field::YXY),
1408 b"YZY" => Ok(Field::YZY),
1409 b"XYX" => Ok(Field::XYX),
1410 b"XZX" => Ok(Field::XZX),
1411 b"ZYXEx" => Ok(Field::ZYXEx),
1412 b"ZXYEx" => Ok(Field::ZXYEx),
1413 b"YXZEx" => Ok(Field::YXZEx),
1414 b"YZXEx" => Ok(Field::YZXEx),
1415 b"XYZEx" => Ok(Field::XYZEx),
1416 b"XZYEx" => Ok(Field::XZYEx),
1417 b"ZYZEx" => Ok(Field::ZYZEx),
1418 b"ZXZEx" => Ok(Field::ZXZEx),
1419 b"YXYEx" => Ok(Field::YXYEx),
1420 b"YZYEx" => Ok(Field::YZYEx),
1421 b"XYXEx" => Ok(Field::XYXEx),
1422 b"XZXEx" => Ok(Field::XZXEx),
1423 _ => {
1424 #[cfg(feature = "std")]
1425 let value = &String::from_utf8_lossy(value);
1426 #[cfg(not(feature = "std"))]
1427 let value =
1428 core::str::from_utf8(value).unwrap_or("\u{fffd}\u{fffd}\u{fffd}");
1429 Err(serde_core::de::Error::unknown_variant(value, VARIANTS))
1430 }
1431 }
1432 }
1433 }
1434 impl<'de> serde_core::Deserialize<'de> for Field {
1435 #[inline]
1436 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1437 where
1438 D: serde_core::Deserializer<'de>,
1439 {
1440 serde_core::Deserializer::deserialize_identifier(deserializer, FieldVisitor)
1441 }
1442 }
1443 struct Visitor<'de> {
1444 marker: core::marker::PhantomData<EulerRot>,
1445 lifetime: core::marker::PhantomData<&'de ()>,
1446 }
1447 impl<'de> serde_core::de::Visitor<'de> for Visitor<'de> {
1448 type Value = EulerRot;
1449 fn expecting(
1450 &self,
1451 __formatter: &mut core::fmt::Formatter<'_>,
1452 ) -> core::fmt::Result {
1453 core::fmt::Formatter::write_str(__formatter, "an EulerRot enum")
1454 }
1455 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
1456 where
1457 A: serde_core::de::EnumAccess<'de>,
1458 {
1459 match serde_core::de::EnumAccess::variant(data)? {
1460 (Field::ZYX, variant) => {
1461 serde_core::de::VariantAccess::unit_variant(variant)?;
1462 Ok(EulerRot::ZYX)
1463 }
1464 (Field::ZXY, variant) => {
1465 serde_core::de::VariantAccess::unit_variant(variant)?;
1466 Ok(EulerRot::ZXY)
1467 }
1468 (Field::YXZ, variant) => {
1469 serde_core::de::VariantAccess::unit_variant(variant)?;
1470 Ok(EulerRot::YXZ)
1471 }
1472 (Field::YZX, variant) => {
1473 serde_core::de::VariantAccess::unit_variant(variant)?;
1474 Ok(EulerRot::YZX)
1475 }
1476 (Field::XYZ, variant) => {
1477 serde_core::de::VariantAccess::unit_variant(variant)?;
1478 Ok(EulerRot::XYZ)
1479 }
1480 (Field::XZY, variant) => {
1481 serde_core::de::VariantAccess::unit_variant(variant)?;
1482 Ok(EulerRot::XZY)
1483 }
1484
1485 (Field::ZYZ, variant) => {
1486 serde_core::de::VariantAccess::unit_variant(variant)?;
1487 Ok(EulerRot::ZYZ)
1488 }
1489 (Field::ZXZ, variant) => {
1490 serde_core::de::VariantAccess::unit_variant(variant)?;
1491 Ok(EulerRot::ZXZ)
1492 }
1493 (Field::YXY, variant) => {
1494 serde_core::de::VariantAccess::unit_variant(variant)?;
1495 Ok(EulerRot::YXY)
1496 }
1497 (Field::YZY, variant) => {
1498 serde_core::de::VariantAccess::unit_variant(variant)?;
1499 Ok(EulerRot::YZY)
1500 }
1501 (Field::XYX, variant) => {
1502 serde_core::de::VariantAccess::unit_variant(variant)?;
1503 Ok(EulerRot::XYX)
1504 }
1505 (Field::XZX, variant) => {
1506 serde_core::de::VariantAccess::unit_variant(variant)?;
1507 Ok(EulerRot::XZX)
1508 }
1509 (Field::ZYXEx, variant) => {
1510 serde_core::de::VariantAccess::unit_variant(variant)?;
1511 Ok(EulerRot::ZYXEx)
1512 }
1513 (Field::ZXYEx, variant) => {
1514 serde_core::de::VariantAccess::unit_variant(variant)?;
1515 Ok(EulerRot::ZXYEx)
1516 }
1517 (Field::YXZEx, variant) => {
1518 serde_core::de::VariantAccess::unit_variant(variant)?;
1519 Ok(EulerRot::YXZEx)
1520 }
1521 (Field::YZXEx, variant) => {
1522 serde_core::de::VariantAccess::unit_variant(variant)?;
1523 Ok(EulerRot::YZXEx)
1524 }
1525 (Field::XYZEx, variant) => {
1526 serde_core::de::VariantAccess::unit_variant(variant)?;
1527 Ok(EulerRot::XYZEx)
1528 }
1529 (Field::XZYEx, variant) => {
1530 serde_core::de::VariantAccess::unit_variant(variant)?;
1531 Ok(EulerRot::XZYEx)
1532 }
1533 (Field::ZYZEx, variant) => {
1534 serde_core::de::VariantAccess::unit_variant(variant)?;
1535 Ok(EulerRot::ZYZEx)
1536 }
1537 (Field::ZXZEx, variant) => {
1538 serde_core::de::VariantAccess::unit_variant(variant)?;
1539 Ok(EulerRot::ZXZEx)
1540 }
1541 (Field::YXYEx, variant) => {
1542 serde_core::de::VariantAccess::unit_variant(variant)?;
1543 Ok(EulerRot::YXYEx)
1544 }
1545 (Field::YZYEx, variant) => {
1546 serde_core::de::VariantAccess::unit_variant(variant)?;
1547 Ok(EulerRot::YZYEx)
1548 }
1549 (Field::XYXEx, variant) => {
1550 serde_core::de::VariantAccess::unit_variant(variant)?;
1551 Ok(EulerRot::XYXEx)
1552 }
1553 (Field::XZXEx, variant) => {
1554 serde_core::de::VariantAccess::unit_variant(variant)?;
1555 Ok(EulerRot::XZXEx)
1556 }
1557 }
1558 }
1559 }
1560 const VARIANTS: &[&str] = &[
1561 "ZYX", "ZXY", "YXZ", "YZX", "XYZ", "XZY", "ZYZ", "ZXZ", "YXY", "YZY", "XYX", "XZX",
1562 "ZYXEx", "ZXYEx", "YXZEx", "YZXEx", "XYZEx", "XZYEx", "ZYZEx", "ZXZEx", "YXYEx",
1563 "YZYEx", "XYXEx", "XZXEx",
1564 ];
1565 serde_core::Deserializer::deserialize_enum(
1566 deserializer,
1567 "EulerRot",
1568 VARIANTS,
1569 Visitor {
1570 marker: core::marker::PhantomData::<EulerRot>,
1571 lifetime: core::marker::PhantomData,
1572 },
1573 )
1574 }
1575 }
1576
1577 #[test]
1578 fn test_euler_rot_serde() {
1579 const PAIRS: [(EulerRot, &str); 24] = [
1580 (EulerRot::ZYX, "\"ZYX\""),
1581 (EulerRot::ZXY, "\"ZXY\""),
1582 (EulerRot::YXZ, "\"YXZ\""),
1583 (EulerRot::YZX, "\"YZX\""),
1584 (EulerRot::XYZ, "\"XYZ\""),
1585 (EulerRot::XZY, "\"XZY\""),
1586 (EulerRot::ZYZ, "\"ZYZ\""),
1587 (EulerRot::ZXZ, "\"ZXZ\""),
1588 (EulerRot::YXY, "\"YXY\""),
1589 (EulerRot::YZY, "\"YZY\""),
1590 (EulerRot::XYX, "\"XYX\""),
1591 (EulerRot::XZX, "\"XZX\""),
1592 (EulerRot::ZYXEx, "\"ZYXEx\""),
1593 (EulerRot::ZXYEx, "\"ZXYEx\""),
1594 (EulerRot::YXZEx, "\"YXZEx\""),
1595 (EulerRot::YZXEx, "\"YZXEx\""),
1596 (EulerRot::XYZEx, "\"XYZEx\""),
1597 (EulerRot::XZYEx, "\"XZYEx\""),
1598 (EulerRot::ZYZEx, "\"ZYZEx\""),
1599 (EulerRot::ZXZEx, "\"ZXZEx\""),
1600 (EulerRot::YXYEx, "\"YXYEx\""),
1601 (EulerRot::YZYEx, "\"YZYEx\""),
1602 (EulerRot::XYXEx, "\"XYXEx\""),
1603 (EulerRot::XZXEx, "\"XZXEx\""),
1604 ];
1605 for (enum_value, enum_string) in PAIRS {
1606 let serialized = serde_json::to_string(&enum_value).unwrap();
1607 assert_eq!(enum_string, serialized);
1608 let deserialized = serde_json::from_str(&serialized).unwrap();
1609 assert_eq!(enum_value, deserialized);
1610 }
1611 }
1612}