1use crate::*;
2
3#[derive(Deserialize, Debug, Hash)]
4struct TestLoginAnswerSuccess {
5 stat: String,
6 user: UserData,
7}
8
9#[derive(Deserialize, Debug, Hash)]
10#[serde(untagged)]
11enum TestLoginAnswer {
12 Ok(TestLoginAnswerSuccess),
13 Err(FlickrError),
14}
15
16impl Resultable<UserData, Box<dyn Error>> for TestLoginAnswer {
17 fn to_result(self) -> Result<UserData, Box<dyn Error>> {
18 match self {
19 TestLoginAnswer::Ok(TestLoginAnswerSuccess { stat: _, user }) => Ok(user),
20 TestLoginAnswer::Err(e) => Err(Box::new(e)),
21 }
22 }
23}
24
25#[derive(Deserialize, Debug, Hash)]
27pub struct UserData {
28 pub id: String,
29 #[serde(deserialize_with = "deserialize_content")]
30 pub username: String,
31}
32
33impl TestRequestBuilder {
34 pub async fn login(&self) -> Result<UserData, Box<dyn Error>> {
37 let mut params = vec![
38 ("method", "flickr.test.login".into()),
39 ("format", "json".into()),
40 ("nojsoncallback", "1".into()),
41 ];
42
43 oauth::build_request(
44 oauth::RequestTarget::Get(URL_API),
45 &mut params,
46 &self.handle.key,
47 self.handle.token.as_ref(),
48 );
49
50 let url = reqwest::Url::parse_with_params(URL_API, ¶ms)?;
51 let request = self.handle.client.get(url).send().await?;
52 let login: TestLoginAnswer = request.json().await?;
53
54 login.to_result()
55 }
56}