oauth1_twitter/
utils.rs

1use url::{ParseError as UrlParseError, Url};
2
3use crate::endpoints::{authenticate::AuthenticateEndpoint, authorize::AuthorizeEndpoint};
4
5//
6pub fn build_authorization_url(
7    is_authenticate: bool,
8    oauth_token: impl AsRef<str>,
9    force_login: Option<bool>,
10    screen_name: Option<&str>,
11) -> Result<Url, UrlParseError> {
12    if is_authenticate {
13        let mut ep = AuthenticateEndpoint::new(oauth_token.as_ref());
14        if let Some(force_login) = force_login {
15            ep = ep.with_force_login(force_login);
16        }
17        if let Some(screen_name) = screen_name {
18            ep = ep.with_screen_name(screen_name);
19        }
20        if let Ok(x) = ep.authorization_url() {
21            return x.parse::<Url>();
22        }
23    } else {
24        let mut ep = AuthorizeEndpoint::new(oauth_token.as_ref());
25        if let Some(force_login) = force_login {
26            ep = ep.with_force_login(force_login);
27        }
28        if let Some(screen_name) = screen_name {
29            ep = ep.with_screen_name(screen_name);
30        }
31        if let Ok(x) = ep.authorization_url() {
32            return x.parse::<Url>();
33        }
34    }
35
36    build_authorization_url_inner(is_authenticate, oauth_token, force_login, screen_name)
37}
38
39fn build_authorization_url_inner(
40    is_authenticate: bool,
41    oauth_token: impl AsRef<str>,
42    force_login: Option<bool>,
43    screen_name: Option<&str>,
44) -> Result<Url, UrlParseError> {
45    let mut url = if is_authenticate {
46        crate::endpoints::authenticate::URL.parse::<Url>()?
47    } else {
48        crate::endpoints::authorize::URL.parse::<Url>()?
49    };
50    url.query_pairs_mut()
51        .append_pair("oauth_token", oauth_token.as_ref());
52    if let Some(force_login) = force_login {
53        url.query_pairs_mut()
54            .append_pair("force_login", force_login.to_string().as_ref());
55    }
56    if let Some(screen_name) = screen_name {
57        url.query_pairs_mut()
58            .append_pair("screen_name", screen_name);
59    }
60    Ok(url)
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn test_build_authorization_url() {
69        //
70        assert_eq!(
71            build_authorization_url(false, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", None, None)
72                .unwrap()
73                .as_str(),
74            "https://api.twitter.com/oauth/authorize?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx"
75        );
76        assert_eq!(
77            build_authorization_url_inner(false, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", None, None)
78                .unwrap()
79                .as_str(),
80            "https://api.twitter.com/oauth/authorize?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx"
81        );
82
83        //
84        assert_eq!(
85            build_authorization_url(false, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", Some(true), Some("xxx"))
86                .unwrap()
87                .as_str(),
88            "https://api.twitter.com/oauth/authorize?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx&force_login=true&screen_name=xxx"
89        );
90        assert_eq!(
91            build_authorization_url_inner(false, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", Some(true), Some("xxx"))
92                .unwrap()
93                .as_str(),
94            "https://api.twitter.com/oauth/authorize?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx&force_login=true&screen_name=xxx"
95        );
96
97        //
98        assert_eq!(
99            build_authorization_url(true, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", None, None)
100                .unwrap()
101                .as_str(),
102            "https://api.twitter.com/oauth/authenticate?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx"
103        );
104        assert_eq!(
105            build_authorization_url_inner(true, "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx", None, None)
106                .unwrap()
107                .as_str(),
108            "https://api.twitter.com/oauth/authenticate?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hxxxxxx"
109        );
110    }
111}