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}