oauth1_request/
util.rs

1mod oauth_parameter;
2mod percent_encoding;
3
4pub use self::oauth_parameter::OAuthParameter;
5pub use self::percent_encoding::{percent_encode, DoublePercentEncode, PercentEncode};
6
7/// Converts from `struct Foo<#[cfg(pred)] T>(T);` to
8/// `#[cfg(pred)] struct Foo<T>(T); #[cfg(not(pred))] struct Foo<>(T);` so that `#[derive]` work
9/// for the struct with older compilers.
10macro_rules! cfg_type_param_hack {
11    (
12        $(#[$attr:meta])*
13        $vis:vis $kw:ident $Name:ident<
14            $($a:lifetime),* $(,)?
15            $($(#[$($cfg:tt)+])? $T:ident $(: $TB:path)? $(= $D:ty)?),* $(,)?
16        > $body:tt $(; $($dummy:tt)?)?
17    ) => {
18        cfg_type_param_hack! {@inner
19            [] [$($(#[$($cfg)+])? $T $(: $TB)? $(= $D)?,)*]
20            $(#[$attr])* $vis $kw $Name<$($a),*> $body $(; $($dummy)?)?
21        }
22    };
23    (@inner
24        [$($accum:tt)*] [#[cfg($pred:meta)] $T:ident $(: $TB:path)? $(= $D:ty)?, $($rest:tt)*]
25        $($item:tt)+
26    ) => {
27        #[cfg($pred)]
28        cfg_type_param_hack! {@inner [$($accum)* $T $(: $TB)? $(= $D)?,] [$($rest)*] $($item)+ }
29        #[cfg(not($pred))]
30        cfg_type_param_hack! {@inner [$($accum)*] [$($rest)*] $($item)+ }
31    };
32    (@inner [$($accum:tt)*] [$T:ident $(: $TB:path)? $(= $D:ty)?, $($rest:tt)*] $($item:tt)+) => {
33        cfg_type_param_hack! {@inner [$($accum)* $T $(: $TB)? $(= $D)?,] [$($rest)*] $($item)+ }
34    };
35    (@inner
36        [$($accum:tt)*] []
37        $(#[$attr:meta])*
38        $vis:vis $kw:ident $Name:ident<$($a:lifetime),*> $body:tt $($semicolon:tt)?
39    ) => {
40        $(#[$attr])*
41        $vis $kw $Name<$($a,)* $($accum)*> $body $($semicolon)?
42    };
43}
44
45/// A macro to replicate `#[feature(doc_auto_cfg)]` behavior.
46// The real `doc_auto_cfg` as of this writing shows feature flags in other crates when re-exporting
47// items from them, which is undesirable.
48// TODO: Remove this macro once the issue is resolved.
49macro_rules! doc_auto_cfg {
50    // Add `#[doc(cfg($pred))]` for each `#[cfg($pred)]`.
51    (@inner $(#[$($accum:tt)+])* { #[cfg($pred:meta)] $($rest:tt)+ }) => {
52        doc_auto_cfg! {@inner
53            $(#[$($accum)+])*
54            #[cfg_attr(docsrs, doc(cfg($pred)))]
55            #[cfg($pred)]
56            { $($rest)+ }
57        }
58    };
59    // Pass through other attributes.
60    (@inner $(#[$($accum:tt)+])* { #[$($attr:tt)+] $($rest:tt)+ }) => {
61        doc_auto_cfg! {@inner
62            $(#[$($accum)+])*
63            #[$($attr)+]
64            { $($rest)+ }
65        }
66    };
67    (@inner $(#[$($accum:tt)+])* { $item:item $($rest:tt)* }) => {
68        doc_coerce_expr! {
69            $(#[$($accum)+])*
70            $item
71        }
72        doc_auto_cfg! {@inner { $($rest)* }}
73    };
74    (@inner {}) => {};
75    ($($arg:tt)*) => {
76        doc_auto_cfg! {@inner { $($arg)* }}
77    };
78}
79
80// Coerce `#[doc = ...]` value into `expr` so that `doc = concat!(...)` works with older compilers.
81macro_rules! doc_coerce_expr {
82    ($(#[$($accum:tt)+])* { #[doc = $doc:expr] $($rest:tt)+ }) => {
83        doc_coerce_expr! {
84            $(#[$($accum)+])*
85            #[doc = $doc]
86            { $($rest)+ }
87        }
88    };
89    ($(#[$($accum:tt)+])* { $item:item $($rest:tt)* }) => {
90        $(#[$($accum)+])*
91        $item
92        doc_coerce_expr! {{ $($rest)* }}
93    };
94    ({}) => {};
95    ($($arg:tt)*) => {
96        doc_coerce_expr! {{ $($arg)* }}
97    };
98}
99
100macro_rules! options {
101    ($(
102        $(#[$attr:meta])*
103        pub struct $O:ident<$lifetime:tt> {
104            $(#[$ctor_attr:meta])* $ctor:ident;
105            $($field:tt)*
106        }
107    )*) => {$(
108        $(#[$attr])*
109        pub struct $O<$lifetime> {
110            $($field)*
111        }
112
113        impl<$lifetime> $O<$lifetime> {
114            $(#[$ctor_attr])*
115            pub fn $ctor() -> Self {
116                Default::default()
117            }
118
119            impl_setters! { $($field)* }
120        }
121    )*};
122}
123
124macro_rules! impl_setters {
125    ($(#[$attr:meta])* $setter:ident: Option<$t:ty>, $($rest:tt)*) => {
126        $(#[$attr])*
127        pub fn $setter(&mut self, $setter: impl Into<Option<$t>>) -> &mut Self {
128            self.$setter = $setter.into();
129            self
130        }
131        impl_setters! { $($rest)* }
132    };
133    ($(#[$attr:meta])* $setter:ident: bool, $($rest:tt)*) => {
134        $(#[$attr])*
135        pub fn $setter(&mut self, $setter: bool) -> &mut Self {
136            self.$setter = $setter;
137            self
138        }
139        impl_setters! { $($rest)* }
140    };
141    ($(#[$attr:meta])* $setter:ident: $t:ty, $($rest:tt)*) => {
142        $(#[$attr])*
143        pub fn $setter(&mut self, $setter: impl Into<Option<$t>>) -> &mut Self {
144            self.$setter = $setter;
145            self
146        }
147        impl_setters! { $($rest)* }
148    };
149    () => {};
150}
151
152impl OAuthParameter {
153    pub fn serialize<S: crate::serializer::Serializer>(self, serializer: &mut S) {
154        match self {
155            OAuthParameter::Callback => serializer.serialize_oauth_callback(),
156            OAuthParameter::ConsumerKey => serializer.serialize_oauth_consumer_key(),
157            OAuthParameter::Nonce => serializer.serialize_oauth_nonce(),
158            OAuthParameter::SignatureMethod => serializer.serialize_oauth_signature_method(),
159            OAuthParameter::Timestamp => serializer.serialize_oauth_timestamp(),
160            OAuthParameter::Token => serializer.serialize_oauth_token(),
161            OAuthParameter::Verifier => serializer.serialize_oauth_verifier(),
162            OAuthParameter::Version => serializer.serialize_oauth_version(),
163            OAuthParameter::None => panic!("called `serialize` on a `OAuthParameter::None`"),
164        }
165    }
166}