reqwest_oauth1/
secrets.rs

1use std::borrow::Cow;
2
3/// Interface of OAuth secrets provider
4pub trait SecretsProvider {
5    fn get_consumer_key_pair<'a>(&'a self) -> (&'a str, &'a str);
6
7    fn get_token_pair_option<'a>(&'a self) -> Option<(&'a str, &'a str)>;
8
9    fn get_token_option_pair<'a>(&'a self) -> (Option<&'a str>, Option<&'a str>) {
10        self.get_token_pair_option()
11            .map(|s| (Some(s.0), Some(s.1)))
12            .unwrap_or_else(|| (None, None))
13    }
14}
15
16/**
17Represents OAuth secrets including consumer_key, consumer_secret, token, and token_secret.
18The token and token_secret are optional.
19
20# Basic usage
21
22```rust
23use reqwest_oauth1::OAuthClientProvider;
24
25#[cfg(feature = "blocking")]
26use reqwest::blocking::Client as Client;
27
28#[cfg(not(feature = "blocking"))]
29use reqwest::Client;
30
31let consumer_key = "[CONSUMER_KEY]";
32let consumer_secret = "[CONSUMER_SECRET]";
33
34// if you don't have the token and token secret:
35let secrets = reqwest_oauth1::Secrets::new(consumer_key, consumer_secret);
36
37// when you have the access token and secret:
38let access_token = "[ACCESS_TOKEN]";
39let token_secret = "[TOKEN_SECRET]";
40let secrets_with_token = secrets.token(access_token, token_secret);
41
42// use the secret
43let req = Client::new()
44    .oauth1(secrets_with_token)
45    .post("http://example.com/");
46```
47
48*/
49#[derive(Debug, Clone)]
50pub struct Secrets<'a> {
51    consumer_key_secret: (Cow<'a, str>, Cow<'a, str>),
52    token_key_secret: Option<(Cow<'a, str>, Cow<'a, str>)>,
53}
54
55impl<'a> Secrets<'a> {
56    pub fn new<TKey, TSecret>(consumer_key: TKey, consumer_secret: TSecret) -> Self
57    where
58        TKey: Into<Cow<'a, str>>,
59        TSecret: Into<Cow<'a, str>>,
60    {
61        Secrets {
62            consumer_key_secret: (consumer_key.into(), consumer_secret.into()),
63            token_key_secret: None,
64        }
65    }
66
67    pub fn new_with_token<TKey, TSecret, TToken, TTokenSecret>(
68        consumer_key: TKey,
69        consumer_secret: TSecret,
70        token: TToken,
71        token_secret: TTokenSecret,
72    ) -> Self
73    where
74        TKey: Into<Cow<'a, str>>,
75        TSecret: Into<Cow<'a, str>>,
76        TToken: Into<Cow<'a, str>>,
77        TTokenSecret: Into<Cow<'a, str>>,
78    {
79        Secrets {
80            consumer_key_secret: (consumer_key.into(), consumer_secret.into()),
81            token_key_secret: Some((token.into(), token_secret.into())),
82        }
83    }
84
85    pub fn token<TKey, TSecret>(self, token: TKey, token_secret: TSecret) -> Secrets<'a>
86    where
87        TKey: Into<Cow<'a, str>>,
88        TSecret: Into<Cow<'a, str>>,
89    {
90        Secrets {
91            token_key_secret: Some((token.into(), token_secret.into())),
92            ..self
93        }
94    }
95}
96
97impl SecretsProvider for Secrets<'_> {
98    fn get_consumer_key_pair<'a>(&'a self) -> (&'a str, &'a str) {
99        (&self.consumer_key_secret.0, &self.consumer_key_secret.1)
100    }
101
102    fn get_token_pair_option<'a>(&'a self) -> Option<(&'a str, &'a str)> {
103        match &self.token_key_secret {
104            Some((k, s)) => Some((&k, &s)),
105            None => None,
106        }
107    }
108}