Skip to main content

json_syntax/
visitor.rs

1use smallstr::SmallString;
2
3use crate::{JsonNumber, JsonNumberBuf, JsonObject, JsonValue};
4
5pub trait JsonVisitor {
6	type Output;
7
8	fn visit_null(self) -> Self::Output;
9
10	fn visit_bool(self, value: bool) -> Self::Output;
11
12	fn visit_number(self, value: &JsonNumber) -> Self::Output;
13
14	fn visit_string(self, value: &str) -> Self::Output;
15
16	fn visit_array<I: IntoIterator<Item: JsonVisit>>(self, items: I) -> Self::Output;
17
18	fn visit_object<E: IntoIterator<Item = (K, V)>, K: AsRef<str>, V: JsonVisit>(
19		self,
20		entries: E,
21	) -> Self::Output;
22}
23
24pub trait JsonVisit {
25	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output;
26}
27
28impl<T: JsonVisit> JsonVisit for &T {
29	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
30		T::visit(*self, visitor)
31	}
32}
33
34impl JsonVisit for () {
35	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
36		visitor.visit_null()
37	}
38}
39
40impl JsonVisit for bool {
41	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
42		visitor.visit_bool(*self)
43	}
44}
45
46impl JsonVisit for str {
47	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
48		visitor.visit_string(self)
49	}
50}
51
52impl JsonVisit for String {
53	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
54		visitor.visit_string(self)
55	}
56}
57
58impl<A: smallvec::Array<Item = u8>> JsonVisit for SmallString<A> {
59	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
60		visitor.visit_string(self)
61	}
62}
63
64impl JsonVisit for JsonNumber {
65	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
66		visitor.visit_number(self)
67	}
68}
69
70impl JsonVisit for JsonNumberBuf {
71	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
72		visitor.visit_number(self)
73	}
74}
75
76impl<T: JsonVisit> JsonVisit for [T] {
77	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
78		visitor.visit_array(self)
79	}
80}
81
82impl<T: JsonVisit> JsonVisit for Vec<T> {
83	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
84		visitor.visit_array(self)
85	}
86}
87
88impl JsonVisit for JsonObject {
89	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
90		visitor.visit_object(self)
91	}
92}
93
94impl JsonVisit for JsonValue {
95	fn visit<V: JsonVisitor>(&self, visitor: V) -> V::Output {
96		match self {
97			Self::Null => ().visit(visitor),
98			Self::Boolean(b) => b.visit(visitor),
99			Self::Number(n) => n.visit(visitor),
100			Self::String(s) => s.visit(visitor),
101			Self::Array(a) => a.visit(visitor),
102			Self::Object(o) => o.visit(visitor),
103		}
104	}
105}