vdf_reader/entry/
array.rs1use super::{Entry, Table};
2use crate::entry::Value;
3use crate::error::{ParseStringError, UnknownError};
4use crate::VdfError;
5use serde_core::de::{DeserializeSeed, SeqAccess};
6use serde_core::{Deserialize, Deserializer, Serialize, Serializer};
7use std::ops::{Deref, DerefMut};
8
9#[derive(Clone, PartialEq, Eq, Debug, Default)]
11pub struct Array(Vec<Entry>);
12
13impl Array {
14 pub(crate) fn from_space_separated(str: &str) -> Self {
15 let items = str
16 .split(' ')
17 .filter(|part| !part.is_empty())
18 .map(Value::from)
19 .map(Entry::from)
20 .collect();
21 Array(items)
22 }
23}
24
25impl<'de> Deserialize<'de> for Array {
26 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
27 where
28 D: Deserializer<'de>,
29 {
30 <Vec<Entry>>::deserialize(deserializer).map(Array)
31 }
32}
33
34impl Serialize for Array {
35 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36 where
37 S: Serializer,
38 {
39 self.0.serialize(serializer)
40 }
41}
42
43impl From<Vec<Entry>> for Array {
44 fn from(value: Vec<Entry>) -> Self {
45 Array(value)
46 }
47}
48impl From<Entry> for Array {
49 fn from(value: Entry) -> Self {
50 Array(vec![value])
51 }
52}
53
54impl From<Array> for Entry {
55 fn from(array: Array) -> Self {
56 Entry::Array(array)
57 }
58}
59
60impl Deref for Array {
61 type Target = Vec<Entry>;
62
63 fn deref(&self) -> &Self::Target {
64 &self.0
65 }
66}
67
68impl DerefMut for Array {
69 fn deref_mut(&mut self) -> &mut Self::Target {
70 &mut self.0
71 }
72}
73
74pub(crate) struct ArraySeq {
75 iter: std::vec::IntoIter<Entry>,
76}
77
78impl ArraySeq {
79 pub(crate) fn new(array: Array) -> Self {
80 ArraySeq {
81 iter: array.0.into_iter(),
82 }
83 }
84}
85
86impl<'de> SeqAccess<'de> for ArraySeq {
87 type Error = VdfError;
88
89 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
90 where
91 T: DeserializeSeed<'de>,
92 {
93 let next = match self.iter.next() {
94 Some(next) => next,
95 None => return Ok(None),
96 };
97
98 seed.deserialize(next).map(Some)
99 }
100}
101
102pub(crate) struct TableArraySeq {
103 iter: std::vec::IntoIter<(String, Entry)>,
104 last_key: Option<u64>,
105}
106
107impl TableArraySeq {
108 pub(crate) fn new(table: Table) -> Self {
109 let mut items: Vec<_> = table.into_iter().collect();
111 items.sort_by(|(key_a, _), (key_b, _)| key_a.cmp(key_b));
112 TableArraySeq {
113 iter: items.into_iter(),
114 last_key: None,
115 }
116 }
117}
118
119impl<'de> SeqAccess<'de> for TableArraySeq {
120 type Error = VdfError;
121
122 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
123 where
124 T: DeserializeSeed<'de>,
125 {
126 let (key, next) = match self.iter.next() {
127 Some(next) => next,
128 None => return Ok(None),
129 };
130
131 let key: u64 = key.parse().map_err(|_| {
132 VdfError::ParseString(ParseStringError {
133 ty: "u64",
134 value: key,
135 })
136 })?;
137
138 if let Some(last_key) = self.last_key {
139 let expected_key = last_key + 1;
140 if expected_key != key {
141 return Err(VdfError::Other(UnknownError::from(format!(
142 "Invalid array key {key}, expected {expected_key}"
143 ))));
144 }
145 }
146 self.last_key = Some(key);
147
148 seed.deserialize(next).map(Some)
149 }
150}