use log::{debug, info};
use serde::Deserialize;
use crate::auth::{AccessToken, UserInfo};
use crate::errors::{NetDiskError, NetDiskResult};
use crate::http::HttpClient;
#[derive(Debug, Clone)]
pub struct UserClient {
http_client: HttpClient,
}
impl UserClient {
pub fn new(http_client: HttpClient) -> Self {
UserClient { http_client }
}
pub async fn get_user_info(
&self,
access_token: &AccessToken,
vip_version: Option<&str>,
) -> NetDiskResult<UserInfo> {
let mut params = vec![
("method", "uinfo"),
("access_token", &access_token.access_token),
];
if let Some(v) = vip_version {
params.push(("vip_version", v));
}
debug!("Getting user info with params: {:?}", params);
let response: UserInfoResponse = self
.http_client
.get("/rest/2.0/xpan/nas", Some(¶ms))
.await?;
if response.errno != 0 {
return Err(NetDiskError::api_error(response.errno, &response.errmsg));
}
info!("User info retrieved successfully: {}", response.baidu_name);
Ok(UserInfo {
baidu_name: response.baidu_name,
netdisk_name: response.netdisk_name,
avatar_url: response.avatar_url,
vip_type: response.vip_type,
uk: response.uk,
})
}
}
#[derive(Debug, Deserialize)]
struct UserInfoResponse {
baidu_name: String,
netdisk_name: String,
avatar_url: String,
vip_type: i32,
uk: u64,
errno: i32,
errmsg: String,
}