json_syntax/
array.rs

1use crate::{code_map::Mapped, CodeMap, Value};
2
3/// Array.
4pub type Array = Vec<Value>;
5
6/// Trait for JSON array types like `Vec<Value>` and `[Value]`.
7pub trait JsonArray {
8	fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm>;
9}
10
11impl JsonArray for [Value] {
12	fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm> {
13		IterMapped {
14			items: self.iter(),
15			code_map,
16			offset: offset + 1,
17		}
18	}
19}
20
21impl JsonArray for Vec<Value> {
22	fn iter_mapped<'m>(&self, code_map: &'m CodeMap, offset: usize) -> IterMapped<'_, 'm> {
23		IterMapped {
24			items: self.iter(),
25			code_map,
26			offset: offset + 1,
27		}
28	}
29}
30
31pub struct IterMapped<'a, 'm> {
32	items: std::slice::Iter<'a, Value>,
33	code_map: &'m CodeMap,
34	offset: usize,
35}
36
37impl<'a, 'm> Iterator for IterMapped<'a, 'm> {
38	type Item = Mapped<&'a Value>;
39
40	fn next(&mut self) -> Option<Self::Item> {
41		self.items.next().map(|item| {
42			let offset = self.offset;
43			self.offset += self.code_map.get(self.offset).unwrap().volume;
44			Mapped::new(offset, item)
45		})
46	}
47}