modio/
macros.rs

1macro_rules! option {
2    ($(#[$outer:meta])* $name:ident) => {
3        option!($(#[$outer])* $name: Into<String>);
4    };
5    ($(#[$outer:meta])* $name:ident: Into<$T:ty>) => {
6        $(#[$outer])*
7        #[must_use]
8        pub fn $name<T: Into<$T>>(self, value: T) -> Self {
9            Self {
10                $name: Some(value.into()),
11                ..self
12            }
13        }
14    };
15    ($(#[$outer:meta])* $name:ident: $T:ty) => {
16        $(#[$outer])*
17        #[must_use]
18        pub fn $name(self, value: $T) -> Self {
19            Self {
20                $name: Some(value),
21                ..self
22            }
23        }
24    };
25    ($(#[$outer:meta])* $name:ident >> $param:expr) => {
26        $(#[$outer])*
27        #[must_use]
28        pub fn $name<S: Into<String>>(self, value: S) -> Self {
29            let mut params = self.params;
30            params.insert($param, value.into());
31            Self { params }
32        }
33    };
34    ($(#[$outer:meta])* $name:ident: Into<$T:ty> >> $param:expr) => {
35        $(#[$outer])*
36        #[must_use]
37        pub fn $name<T: Into<$T>>(self, value: T) -> Self {
38            let mut params = self.params;
39            params.insert($param, value.into().to_string());
40            Self { params }
41        }
42    };
43    ($(#[$outer:meta])* $name:ident: $T:ty >> $param:expr) => {
44        $(#[$outer])*
45        #[must_use]
46        pub fn $name(self, value: $T) -> Self {
47            let mut params = self.params;
48            params.insert($param, value.to_string());
49            Self { params }
50        }
51    };
52    // This variant prevents the poor macro formatting in auth.rs by rustfmt
53    ($(#[$outer:meta])* $name:ident $T:ty >> $param:expr) => {
54        option!($(#[$outer])* $name: $T >> $param);
55    };
56}
57
58macro_rules! impl_serialize_params {
59    ($T:ty >> $map:ident) => {
60        #[doc(hidden)]
61        impl ::serde::ser::Serialize for $T {
62            fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
63            where
64                S: ::serde::ser::Serializer,
65            {
66                use ::serde::ser::SerializeMap;
67
68                let mut map = serializer.serialize_map(Some(self.$map.len()))?;
69                for (k, v) in &self.$map {
70                    map.serialize_entry(k, v)?;
71                }
72                map.end()
73            }
74        }
75    };
76}