rseip_core/codec/decode/
visitor.rs

1// rseip
2//
3// rseip - Ethernet/IP (CIP) in pure Rust.
4// Copyright: 2021, Joylei <leingliu@gmail.com>
5// License: MIT
6
7use 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/// decode any type
56#[inline]
57pub fn any<'a, R>() -> AnyVisitor<'a, R> {
58    AnyVisitor(Default::default())
59}
60
61/// directly returns specified value
62#[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}