1use url::{ParseError as UrlParseError, Url};
2
3use crate::endpoints::{authenticate::AuthenticateEndpoint, authorize::AuthorizeEndpoint};
4
5pub 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 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 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 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}