Skip to main content

baidu_netdisk_sdk/user/
mod.rs

1//! User information module
2//!
3//! Provides user-related functionality for Baidu NetDisk
4//!
5//! # Quick Start
6//!
7//! ```
8//! use baidu_netdisk_sdk::BaiduNetDiskClient;
9//!
10//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
11//! let client = BaiduNetDiskClient::builder().build()?;
12//! client.load_token_from_env()?;
13//!
14//! // Get basic user info
15//! let user_info = client.user().get_user_info(None).await?;
16//! println!("User name: {}", user_info.baidu_name);
17//!
18//! // Get real identity with v2 version
19//! let real_user_info = client.user().get_user_info(Some("v2")).await?;
20//! # Ok(())
21//! # }
22//! ```
23use log::{debug, info};
24use serde::Deserialize;
25use std::sync::Arc;
26
27use crate::auth::UserInfo;
28use crate::client::TokenGetter;
29use crate::errors::{NetDiskError, NetDiskResult};
30use crate::http::HttpClient;
31
32/// User client for interacting with user-related APIs
33#[derive(Debug, Clone)]
34pub struct UserClient {
35    http_client: HttpClient,
36    token_getter: Arc<dyn TokenGetter>,
37}
38
39impl UserClient {
40    /// Create a new UserClient instance
41    ///
42    /// Usually you don't need to call this directly - use `BaiduNetDiskClient::user()` instead
43    pub fn new(http_client: HttpClient, token_getter: Arc<dyn TokenGetter>) -> Self {
44        UserClient {
45            http_client,
46            token_getter,
47        }
48    }
49
50    /// Get a reference to the internal HTTP client
51    pub fn http_client(&self) -> &HttpClient {
52        &self.http_client
53    }
54
55    /// Get user information
56    ///
57    /// # Arguments
58    ///
59    /// * `vip_version` - Optional vip_version parameter (set to "v2" to get real user identity)
60    ///
61    /// # Returns
62    ///
63    /// Returns UserInfo containing user details
64    ///
65    /// # Examples
66    ///
67    /// ```
68    /// use baidu_netdisk_sdk::BaiduNetDiskClient;
69    ///
70    /// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
71    /// let client = BaiduNetDiskClient::builder().build()?;
72    /// client.load_token_from_env()?;
73    /// let user_info = client.user().get_user_info(None).await?;
74    /// println!("VIP type: {}", user_info.vip_type);
75    /// # Ok(())
76    /// # }
77    /// ```
78    pub async fn get_user_info(&self, vip_version: Option<&str>) -> NetDiskResult<UserInfo> {
79        let token = self.token_getter.get_token().await?;
80
81        let mut params = vec![("method", "uinfo"), ("access_token", &token.access_token)];
82
83        if let Some(v) = vip_version {
84            params.push(("vip_version", v));
85        }
86
87        debug!("Getting user info with params: {:?}", params);
88
89        let response: UserInfoResponse = self
90            .http_client
91            .get("/rest/2.0/xpan/nas", Some(&params))
92            .await?;
93
94        if response.errno != 0 {
95            return Err(NetDiskError::api_error(response.errno, &response.errmsg));
96        }
97
98        info!("User info retrieved successfully: {}", response.baidu_name);
99
100        Ok(UserInfo {
101            baidu_name: response.baidu_name,
102            netdisk_name: response.netdisk_name,
103            avatar_url: response.avatar_url,
104            vip_type: response.vip_type,
105            uk: response.uk,
106        })
107    }
108}
109
110#[derive(Debug, Deserialize)]
111struct UserInfoResponse {
112    baidu_name: String,
113    netdisk_name: String,
114    avatar_url: String,
115    vip_type: i32,
116    uk: u64,
117    errno: i32,
118    errmsg: String,
119}