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;