blender_armature/action/bone_keyframes/sorted_keyframes/
deserialize.rs

1use std::fmt;
2
3use serde::de::{self, SeqAccess, Visitor};
4use serde::{Deserialize, Deserializer};
5
6use super::SortedKeyframes;
7
8struct SortedKeyframesVisitor;
9
10impl<'de> Deserialize<'de> for SortedKeyframes {
11    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
12    where
13        D: Deserializer<'de>,
14    {
15        deserializer.deserialize_seq(SortedKeyframesVisitor)
16    }
17}
18
19impl<'de> Visitor<'de> for SortedKeyframesVisitor {
20    type Value = SortedKeyframes;
21
22    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
23        formatter.write_str("A of `BoneKeyframe`s")
24    }
25
26    fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
27    where
28        S: SeqAccess<'de>,
29    {
30        let mut keyframes = Vec::with_capacity(1);
31
32        while let Some(value) = seq.next_element()? {
33            keyframes.push(value);
34        }
35
36        Ok(SortedKeyframes::new(keyframes))
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    /// Verify that we can deserialize keyframes
45    #[test]
46    fn deserialize() {
47        let keyframes: SortedKeyframes = serde_yaml::from_str(
48            r#"
49- frame: 5
50  bone: {DualQuat: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
51- frame: 2
52  bone: {DualQuat: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
53"#,
54        )
55        .unwrap();
56
57        assert_eq!(keyframes.0[0].frame(), 2);
58        assert_eq!(keyframes.0[1].frame(), 5);
59    }
60}