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(¶ms))
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}