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 ($(#[$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}