openssh_sftp_protocol/
visitor.rs1#![forbid(unsafe_code)]
2
3pub(crate) use std::fmt;
4
5pub(crate) use serde::{
6    de::{Deserializer, SeqAccess, Visitor},
7    Deserialize,
8};
9
10macro_rules! impl_visitor {
11    ($type:ident, $visitor_name: ident, $expecting_msg:expr, $seq_name: ident, $impl:block) => {
12        impl<'de> crate::visitor::Deserialize<'de> for $type {
13            fn deserialize<D: crate::visitor::Deserializer<'de>>(
14                deserializer: D,
15            ) -> Result<Self, D::Error> {
16                struct $visitor_name;
17
18                impl<'de> crate::visitor::Visitor<'de> for $visitor_name {
19                    type Value = $type;
20
21                    fn expecting(
22                        &self,
23                        formatter: &mut crate::visitor::fmt::Formatter,
24                    ) -> crate::visitor::fmt::Result {
25                        write!(formatter, $expecting_msg)
26                    }
27
28                    fn visit_seq<V>(self, $seq_name: V) -> Result<Self::Value, V::Error>
29                    where
30                        V: crate::visitor::SeqAccess<'de>,
31                    {
32                        $impl
33                    }
34                }
35
36                deserializer.deserialize_tuple(u32::MAX as usize, $visitor_name)
38            }
39        }
40    };
41}
42
43pub(crate) use impl_visitor;