1use super::*;
8use crate::Either;
9use core::marker::PhantomData;
10
11pub trait Visitor<'de> {
12 type Value;
13 fn visit<D: Decoder<'de>>(self, decoder: D) -> Result<Self::Value, D::Error>;
14
15 #[inline]
16 fn map<F, R>(self, f: F) -> MapVisitor<'de, Self, F, R>
17 where
18 Self: Sized,
19 F: FnOnce(Self::Value) -> R,
20 {
21 MapVisitor {
22 v: self,
23 f,
24 _marker: Default::default(),
25 }
26 }
27
28 #[inline]
29 fn and<A>(self, visitor: A) -> AndVisitor<'de, Self, A>
30 where
31 Self: Sized,
32 A: Visitor<'de>,
33 {
34 AndVisitor {
35 a: self,
36 b: visitor,
37 _marker: Default::default(),
38 }
39 }
40
41 #[inline]
42 fn or<A>(self, visitor: A) -> EitherVisitor<'de, Self, A>
43 where
44 Self: Sized,
45 A: Visitor<'de>,
46 {
47 EitherVisitor {
48 a: self,
49 b: visitor,
50 _marker: Default::default(),
51 }
52 }
53}
54
55#[inline]
57pub fn any<'a, R>() -> AnyVisitor<'a, R> {
58 AnyVisitor(Default::default())
59}
60
61#[inline]
63pub fn from_value<R>(v: R) -> FromValueVisitor<R> {
64 FromValueVisitor(v)
65}
66
67#[derive(Debug)]
68pub struct FromValueVisitor<R>(R);
69
70impl<'de, R> Visitor<'de> for FromValueVisitor<R> {
71 type Value = R;
72
73 #[inline(always)]
74 fn visit<D: Decoder<'de>>(self, _decoder: D) -> Result<Self::Value, D::Error> {
75 Ok(self.0)
76 }
77}
78
79#[derive(Debug)]
80pub struct AnyVisitor<'de, R>(PhantomData<&'de R>);
81
82impl<'de, R: Decode<'de>> Visitor<'de> for AnyVisitor<'de, R> {
83 type Value = R;
84
85 #[inline]
86 fn visit<D: Decoder<'de>>(self, mut decoder: D) -> Result<Self::Value, D::Error> {
87 decoder.decode_any()
88 }
89}
90
91#[derive(Debug)]
92pub struct MapVisitor<'de, V, F, R>
93where
94 V: Visitor<'de>,
95 F: FnOnce(V::Value) -> R,
96{
97 v: V,
98 f: F,
99 _marker: PhantomData<&'de R>,
100}
101
102impl<'de, V, F, R> Visitor<'de> for MapVisitor<'de, V, F, R>
103where
104 V: Visitor<'de>,
105 F: FnOnce(V::Value) -> R,
106{
107 type Value = R;
108 #[inline]
109 fn visit<D: Decoder<'de>>(self, decoder: D) -> Result<Self::Value, D::Error> {
110 let prev = self.v.visit(decoder)?;
111 let v = (self.f)(prev);
112 Ok(v)
113 }
114}
115
116#[derive(Debug)]
117pub struct AndVisitor<'de, A, B>
118where
119 A: Visitor<'de>,
120 B: Visitor<'de>,
121{
122 a: A,
123 b: B,
124 _marker: PhantomData<&'de A>,
125}
126
127impl<'de, A, B> Visitor<'de> for AndVisitor<'de, A, B>
128where
129 A: Visitor<'de>,
130 B: Visitor<'de>,
131{
132 type Value = (A::Value, B::Value);
133 #[inline]
134 fn visit<D: Decoder<'de>>(self, mut decoder: D) -> Result<Self::Value, D::Error> {
135 let a = self.a.visit(&mut decoder)?;
136 let b = self.b.visit(decoder)?;
137 Ok((a, b))
138 }
139}
140
141#[derive(Debug)]
142pub struct EitherVisitor<'de, A, B>
143where
144 A: Visitor<'de>,
145 B: Visitor<'de>,
146{
147 a: A,
148 b: B,
149 _marker: PhantomData<&'de A>,
150}
151
152impl<'de, A, B> Visitor<'de> for EitherVisitor<'de, A, B>
153where
154 A: Visitor<'de>,
155 B: Visitor<'de>,
156{
157 type Value = Either<A::Value, B::Value>;
158 #[inline]
159 fn visit<D: Decoder<'de>>(self, mut decoder: D) -> Result<Self::Value, D::Error> {
160 if let Ok(v) = self.a.visit(&mut decoder) {
161 Ok(Either::Left(v))
162 } else {
163 let v = self.b.visit(decoder)?;
164 Ok(Either::Right(v))
165 }
166 }
167}