nson/
array.rs

1use std::fmt;
2use std::ops::{Deref, DerefMut};
3use std::iter::FromIterator;
4use std::convert::Into;
5use std::io::{Write, Read, Cursor};
6
7use crate::value::Value;
8use crate::message::Message;
9use crate::message_id::MessageId;
10use crate::encode::{encode_array, encode_value, write_u32, EncodeResult};
11use crate::decode::{decode_array, DecodeResult};
12
13#[derive(Clone, PartialEq, Default, Eq)]
14pub struct Array {
15    inner: Vec<Value>
16}
17
18impl Array {
19    pub fn new() -> Array {
20        Array {
21            inner: Vec::new()
22        }
23    }
24
25    pub fn with_capacity(capacity: usize) -> Array {
26        Array {
27            inner: Vec::with_capacity(capacity)
28        }
29    }
30
31    pub fn from_vec(vec: Vec<Value>) -> Array {
32        Array {
33            inner: vec
34        }
35    }
36
37    pub fn len(&self) -> usize {
38        self.inner.len()
39    }
40
41    pub fn is_empty(&self) -> bool {
42        self.inner.is_empty()
43    }
44
45    pub fn push(&mut self, value: impl Into<Value>) {
46        self.inner.push(value.into());
47    }
48
49    pub fn push_value(&mut self, value: Value) {
50        self.inner.push(value);
51    }
52
53    pub fn inner(&self) -> &Vec<Value> {
54        &self.inner
55    }
56
57    pub fn as_mut_inner(&mut self) -> &mut Vec<Value> {
58        &mut self.inner
59    }
60
61    pub fn into_inner(self) -> Vec<Value> {
62        self.inner
63    }
64
65    pub fn iter(&self) -> std::slice::Iter<'_, Value> {
66        self.into_iter()
67    }
68
69    pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, Value> {
70        self.into_iter()
71    }
72
73    pub fn encode(&self, writer: &mut impl Write) -> EncodeResult<()> {
74        encode_array(writer, self)
75    }
76
77    pub fn decode(reader: &mut impl Read) -> DecodeResult<Array> {
78        decode_array(reader)
79    }
80
81    pub fn to_bytes(&self) -> EncodeResult<Vec<u8>> {
82        let len = self.bytes_size();
83
84        let mut buf = Vec::with_capacity(len);
85        write_u32(&mut buf, len as u32)?;
86
87        for val in self.iter() {
88            buf.write_all(&[val.element_type() as u8])?;
89
90            encode_value(&mut buf, val)?;
91        }
92
93        buf.write_all(&[0])?;
94
95        Ok(buf)
96    }
97
98    pub fn from_bytes(slice: &[u8]) -> DecodeResult<Array> {
99        let mut reader = Cursor::new(slice);
100        decode_array(&mut reader)
101    }
102
103    pub fn bytes_size(&self) -> usize {
104        4 + self.iter().map(|v| v.bytes_size() + 1).sum::<usize>() + 1
105    }
106}
107
108impl fmt::Debug for Array {
109    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
110        write!(f, "{:?}", self.inner)
111    }
112}
113
114impl Deref for Array {
115    type Target = Vec<Value>;
116    fn deref(&self) -> &Vec<Value> {
117        &self.inner
118    }
119}
120
121impl DerefMut for Array {
122    fn deref_mut(&mut self) -> &mut Vec<Value> {
123        &mut self.inner
124    }
125}
126
127impl AsRef<Vec<Value>> for Array {
128    fn as_ref(&self) -> &Vec<Value> {
129        &self.inner
130    }
131}
132
133macro_rules! array_from_impls {
134    ($($T:ty)+) => {
135        $(
136            impl From<Vec<$T>> for Array {
137                fn from(vec: Vec<$T>) -> Array {
138                    vec.into_iter().map(Into::into).collect()
139                }
140            }
141        )+
142    }
143}
144
145array_from_impls! {
146    f32 f64 i32 i64 u32 u64 &str String &String Array
147    Message bool Vec<u8> Vec<Vec<u8>> MessageId
148}
149
150impl IntoIterator for Array {
151    type Item = Value;
152    type IntoIter = std::vec::IntoIter<Value>;
153
154    fn into_iter(self) -> Self::IntoIter {
155        self.inner.into_iter()
156    }
157}
158
159impl<'a> IntoIterator for &'a Array {
160    type Item = &'a Value;
161    type IntoIter = std::slice::Iter<'a, Value>;
162
163    fn into_iter(self) -> Self::IntoIter {
164        self.inner.iter()
165    }
166}
167
168impl<'a> IntoIterator for &'a mut Array {
169    type Item = &'a mut Value;
170    type IntoIter = std::slice::IterMut<'a, Value>;
171
172    fn into_iter(self) -> Self::IntoIter {
173        self.inner.iter_mut()
174    }
175}
176
177impl FromIterator<Value> for Array {
178    fn from_iter<I: IntoIterator<Item=Value>>(iter: I) -> Self {
179        let mut array = Array::new();
180
181        for i in iter {
182            array.push(i);
183        }
184
185        array
186    }
187}
188
189#[cfg(test)]
190mod test {
191    use crate::Array;
192
193    #[test]
194    fn to_vec() {
195        let mut array = Array::new();
196
197        array.push(123);
198        array.push("haha");
199
200        let vec = array.to_bytes().unwrap();
201
202        let array2 = Array::from_bytes(&vec).unwrap();
203
204        assert_eq!(array, array2);
205    }
206}