jomini/
de.rs

1use crate::{binary::Rgb, Error};
2use de::{DeserializeSeed, SeqAccess, Visitor};
3use serde::de;
4
5#[derive(Debug)]
6pub(crate) struct ColorSequence {
7    data: Rgb,
8    idx: usize,
9}
10
11impl ColorSequence {
12    pub(crate) fn new(data: Rgb) -> Self {
13        ColorSequence { data, idx: 0 }
14    }
15}
16
17impl<'de> de::Deserializer<'de> for &'_ mut ColorSequence {
18    type Error = Error;
19
20    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
21    where
22        V: Visitor<'de>,
23    {
24        if self.idx == 1 {
25            visitor.visit_borrowed_str("rgb")
26        } else {
27            visitor.visit_seq(InnerColorSequence::new(self.data))
28        }
29    }
30
31    serde::forward_to_deserialize_any! {
32        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
33        bytes byte_buf option unit unit_struct newtype_struct seq tuple
34        tuple_struct map struct enum identifier ignored_any
35    }
36}
37
38impl<'de> SeqAccess<'de> for ColorSequence {
39    type Error = Error;
40
41    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
42    where
43        T: DeserializeSeed<'de>,
44    {
45        if self.idx >= 2 {
46            Ok(None)
47        } else {
48            self.idx += 1;
49            seed.deserialize(self).map(Some)
50        }
51    }
52}
53
54#[derive(Debug)]
55pub(crate) struct InnerColorSequence {
56    data: Rgb,
57    idx: usize,
58}
59
60impl InnerColorSequence {
61    pub(crate) fn new(data: Rgb) -> Self {
62        InnerColorSequence { data, idx: 0 }
63    }
64
65    fn val(&self) -> u32 {
66        match self.idx {
67            1 => self.data.r,
68            2 => self.data.g,
69            3 => self.data.b,
70            4 => self.data.a.unwrap(),
71            _ => unreachable!(),
72        }
73    }
74}
75
76impl<'de> de::Deserializer<'de> for &'_ mut InnerColorSequence {
77    type Error = Error;
78
79    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
80    where
81        V: Visitor<'de>,
82    {
83        visitor.visit_u32(self.val())
84    }
85
86    serde::forward_to_deserialize_any! {
87        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
88        bytes byte_buf option unit unit_struct newtype_struct seq tuple
89        tuple_struct map struct enum identifier ignored_any
90    }
91}
92
93impl<'de> SeqAccess<'de> for InnerColorSequence {
94    type Error = Error;
95
96    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
97    where
98        T: DeserializeSeed<'de>,
99    {
100        if (self.idx >= 3 && self.data.a.is_none()) || (self.idx >= 4 && self.data.a.is_some()) {
101            Ok(None)
102        } else {
103            self.idx += 1;
104            seed.deserialize(self).map(Some)
105        }
106    }
107}