1pub use oauth1_request::signature_method::HmacSha1 as DefaultSM;
8use oauth1_request::signature_method::SignatureMethod;
9use reqwest::{IntoUrl, Method};
10
11#[cfg(feature = "blocking")]
12use reqwest::blocking::Client as ReqwestClient;
13
14#[cfg(not(feature = "blocking"))]
15use reqwest::Client as ReqwestClient;
16
17use crate::{OAuthParameters, RequestBuilder, SecretsProvider, Signer};
18
19pub trait OAuthClientProvider {
21 fn oauth1<'a, T>(self, secrets: T) -> Client<Signer<'a, T, DefaultSM>>
22 where
23 Self: Sized,
24 T: SecretsProvider + Clone,
25 {
26 self.oauth1_with_params(secrets, OAuthParameters::new())
27 }
28
29 fn oauth1_with_params<'a, TSecrets, TSM>(
30 self,
31 secrets: TSecrets,
32 params: OAuthParameters<'a, TSM>,
33 ) -> Client<Signer<'a, TSecrets, TSM>>
34 where
35 Self: Sized,
36 TSecrets: SecretsProvider + Clone,
37 TSM: SignatureMethod + Clone;
38}
39
40#[derive(Debug)]
42pub struct Client<TSigner> {
43 inner: ReqwestClient,
44 signer: TSigner,
45}
46
47impl OAuthClientProvider for ReqwestClient {
48 fn oauth1_with_params<'a, TSecrets, TSM>(
49 self,
50 secrets: TSecrets,
51 parameters: OAuthParameters<'a, TSM>,
52 ) -> Client<Signer<'a, TSecrets, TSM>>
53 where
54 Self: Sized,
55 TSecrets: SecretsProvider + Clone,
56 TSM: SignatureMethod + Clone,
57 {
58 Client {
59 inner: self,
60 signer: Signer::new(secrets, parameters),
61 }
62 }
63}
64
65impl From<ReqwestClient> for Client<()> {
66 fn from(client: ReqwestClient) -> Self {
67 Client::new_with_client(client)
68 }
69}
70
71impl Client<()> {
72 pub fn new() -> Self {
76 Client {
77 inner: ReqwestClient::new(),
78 signer: (),
79 }
80 }
81
82 pub fn new_with_client(client: ReqwestClient) -> Self {
84 Client {
85 inner: client,
86 signer: (),
87 }
88 }
89}
90
91impl<T> Client<T>
92where
93 T: Clone,
94{
95 pub fn get<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
101 self.request(Method::GET, url)
102 }
103
104 pub fn post<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
110 self.request(Method::POST, url)
111 }
112
113 pub fn put<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
119 self.request(Method::PUT, url)
120 }
121
122 pub fn patch<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
128 self.request(Method::PATCH, url)
129 }
130
131 pub fn delete<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
137 self.request(Method::DELETE, url)
138 }
139
140 pub fn head<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
146 self.request(Method::HEAD, url)
147 }
148
149 pub fn request<U: IntoUrl + Clone>(&self, method: Method, url: U) -> RequestBuilder<T> {
158 RequestBuilder::new(&self.inner, method, url, self.signer.clone())
159 }
160}