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}