oauth1_request/
request.rs1pub mod parameter_list;
4
5pub use self::parameter_list::ParameterList;
6
7use core::fmt::Display;
8
9use crate::serializer::{Serializer, SerializerExt};
10use crate::util::OAuthParameter;
11
12pub trait Request {
21 fn serialize<S>(&self, serializer: S) -> S::Output
24 where
25 S: Serializer;
26}
27
28#[cfg_attr(feature = "alloc", doc = " ```edition2021")]
44#[cfg_attr(not(feature = "alloc"), doc = " ```edition2021,ignore")]
45#[derive(Debug, Clone, Copy, Default)]
62pub struct AssertSorted<I> {
63 inner: I,
64}
65
66impl<'a, R> Request for &'a R
67where
68 R: Request + ?Sized,
69{
70 fn serialize<S>(&self, serializer: S) -> S::Output
71 where
72 S: Serializer,
73 {
74 (**self).serialize(serializer)
75 }
76}
77
78impl<'a, R> Request for &'a mut R
79where
80 R: Request + ?Sized,
81{
82 fn serialize<S>(&self, serializer: S) -> S::Output
83 where
84 S: Serializer,
85 {
86 (**self).serialize(serializer)
87 }
88}
89
90impl Request for () {
92 fn serialize<S>(&self, mut serializer: S) -> S::Output
93 where
94 S: Serializer,
95 {
96 serializer.serialize_oauth_parameters();
97 serializer.end()
98 }
99}
100
101impl<R: Request> Request for Option<R> {
102 fn serialize<S>(&self, mut serializer: S) -> S::Output
103 where
104 S: Serializer,
105 {
106 if let Some(ref this) = *self {
107 this.serialize(serializer)
108 } else {
109 serializer.serialize_oauth_parameters();
110 serializer.end()
111 }
112 }
113}
114
115impl<I, K, V> AssertSorted<I>
116where
117 I: Clone + Iterator<Item = (K, V)>,
118 K: AsRef<str>,
119 V: Display,
120{
121 pub fn new<J>(iterator: J) -> Self
123 where
124 J: IntoIterator<Item = (K, V), IntoIter = I>,
125 {
126 AssertSorted {
127 inner: iterator.into_iter(),
128 }
129 }
130}
131
132impl<I, K, V> Request for AssertSorted<I>
133where
134 I: Clone + Iterator<Item = (K, V)>,
135 K: AsRef<str>,
136 V: Display,
137{
138 fn serialize<S>(&self, mut serializer: S) -> S::Output
139 where
140 S: Serializer,
141 {
142 let mut next_param = OAuthParameter::default();
143
144 for (k, v) in self.inner.clone() {
145 let k = k.as_ref();
146 while next_param < *k {
147 next_param.serialize(&mut serializer);
148 next_param = next_param.next();
149 }
150 serializer.serialize_parameter(k, v);
151 }
152
153 while next_param != OAuthParameter::None {
154 next_param.serialize(&mut serializer);
155 next_param = next_param.next();
156 }
157
158 serializer.end()
159 }
160}