1pub mod baidu_pcs_sdk {
2 use getset::Getters;
3 use serde::{Deserialize, Deserializer, Serialize};
4 use serde_json::Value;
5 use std::error::Error;
6
7 pub mod pcs;
8
9 #[path = "pcs_device_auth_impl.rs"]
10 pub mod pcs_device_auth;
11 pub mod pcs_error;
12
13 #[derive(Debug)]
16 pub struct BaiduPcsApp {
17 pub app_key: &'static str,
19 pub app_secret: &'static str,
21 pub app_name: &'static str,
23 pub app_id: Option<&'static str>,
25 }
26
27 #[derive(Serialize, Deserialize, Debug, Getters)]
29 #[getset(get = "pub")]
30 pub struct PcsError {
31 error: String,
32 error_description: String,
33 }
34
35 #[derive(Serialize, Deserialize, Debug)]
38 pub struct PcsApiError {
39 #[serde(alias = "error_code")]
42 errno: i32,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 #[serde(alias = "show_msg")]
46 #[serde(alias = "error_msg")]
47 #[serde(alias = "errmsg")]
48 err_msg: Option<String>,
49 #[serde(deserialize_with = "from_str_or_int", default)]
52 request_id: Option<String>,
53 #[serde(skip)]
54 pub(crate) raw: String,
55 }
56
57 #[derive(Debug, Serialize, Deserialize, Eq, PartialEq)]
58 pub enum AppErrorType {
59 Unknown,
61 Network,
63 Server,
65 Client,
67 }
68
69 #[derive(Debug, Serialize, Deserialize)]
70 pub struct AppError {
71 pub error_type: AppErrorType,
72 pub message: String,
73 pub errno: Option<i64>,
74 }
75
76 #[derive(Debug, Deserialize, Getters)]
77 #[getset(get = "pub with_prefix")]
78 pub struct PcsAccessToken {
79 access_token: String,
81 expires_in: u32,
83 refresh_token: String,
85 scope: String,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 session_secret: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 session_key: Option<String>,
93 #[serde(skip)]
95 born_at: i64,
96 }
97
98 #[derive(Serialize, Deserialize, Getters, Debug, Clone)]
99 #[getset(get = "pub")]
100 pub struct PcsUserInfo {
101 baidu_name: String,
103 netdisk_name: String,
105 avatar_url: String,
107 vip_type: i32,
109 uk: u64,
111 }
112
113 #[derive(Serialize, Deserialize, Debug, Getters)]
114 #[getset(get = "pub")]
115 pub struct PcsDiskQuota {
116 total: u64,
118 expire: bool,
120 used: u64,
122 free: u64,
124 }
125
126 #[derive(Serialize, Deserialize, Debug, Getters)]
127 #[getset(get = "pub")]
128 pub struct PcsCreateFolderResult {
129 fs_id: u64,
131 category: i32,
133 path: String,
135 ctime: i64,
137 mtime: i64,
139 #[serde(alias = "isdir")]
141 is_dir: i32,
142 }
143
144 #[derive(Serialize, Deserialize, Debug)]
145 pub struct PcsFileTask {
146 errno: i32,
147 path: String,
148 task_id: Option<String>,
149 }
150
151 #[derive(Serialize, Deserialize, Debug)]
152 pub struct PcsFileTaskOperationResult {
153 info: Vec<PcsFileTask>,
154 task_id: Option<String>,
155 }
156
157 #[derive(Serialize, Deserialize, Debug, Getters, Clone)]
158 #[getset(get = "pub")]
159 pub struct PcsFileItem {
160 fs_id: u64,
162 path: String,
164 server_filename: String,
166 size: u64,
168 server_mtime: i64,
170 server_ctime: i64,
172 local_mtime: i64,
174 local_ctime: i64,
176 #[serde(alias = "isdir")]
178 is_dir: i32,
179 category: i32,
181 md5: Option<String>,
183 dir_empty: Option<i32>,
185 thumbs: Option<Vec<String>>,
187 }
188
189 #[derive(Serialize, Deserialize, Debug, Getters)]
190 #[getset(get = "pub")]
191 pub struct PcsFileListResult {
192 list: Vec<PcsFileItem>,
193 guid: i64,
194 }
195
196 #[derive(Serialize, Deserialize, Debug, Getters)]
197 #[getset(get = "pub")]
198 pub struct PcsFileUploadResult {
199 path: String,
201 size: u64,
203 ctime: i64,
205 mtime: i64,
207 md5: Option<String>,
209 fs_id: u64,
211 }
212
213 #[derive(Serialize, Deserialize, Debug, Getters)]
214 #[getset(get = "pub")]
215 pub struct UploadServerResult {
216 client_ip: String,
217 host: String,
218 #[serde(deserialize_with = "from_str_or_int", default)]
219 request_id: Option<String>,
220 server_time: i64,
221 #[serde(deserialize_with = "from_str_or_int", default)]
222 sl: Option<String>,
223 servers: Vec<Server>,
224 bak_servers: Vec<Server>,
225 }
226
227 #[derive(Serialize, Deserialize, Debug, Getters)]
228 #[getset(get = "pub")]
229 pub(crate) struct Server {
230 server: String,
231 }
232
233 #[derive(Serialize, Deserialize, Debug, Getters)]
234 #[getset(get = "pub")]
235 pub struct PcsFileSlicePrepareResult {
236 #[serde(default)]
239 path: String,
240 #[serde(alias = "uploadid")]
242 upload_id: String,
243 return_type: i32,
245 block_list: Vec<i32>,
247 }
248 #[derive(Serialize, Deserialize, Debug, Getters)]
249 #[getset(get = "pub")]
250 pub struct PcsFileMetaInfo {
251 category: i32,
253 dlink: Option<String>,
255 filename: String,
257 #[serde(alias = "isdir", rename = "isdir")]
259 is_dir: i32,
260 server_ctime: i64,
262 server_mtime: i64,
264 size: u64,
266 }
267 #[derive(Serialize, Deserialize, Debug, Getters)]
268 #[getset(get = "pub")]
269 pub struct PcsFileMetaResult {
270 list: Vec<PcsFileMetaInfo>,
271 }
272
273 #[derive(Serialize, Deserialize, Debug, Getters)]
286 #[getset(get = "pub")]
287 pub struct PcsFileSearchInfo {
288 category: i32,
289 fs_id: u64,
290 is_dir: i32,
291 local_ctime: i64,
292 local_mtime: i64,
293 server_ctime: i64,
294 server_mtime: i64,
295 md5: Option<String>,
296 size: u64,
297 thumbs: Option<Vec<String>>,
298 }
299 #[derive(Serialize, Deserialize, Debug, Getters)]
300 #[getset(get = "pub")]
301 pub struct PcsFileSearchResult {
302 has_more: i32,
303 list: Vec<PcsFileSearchInfo>,
304 }
305
306 impl BaiduPcsApp {
307 pub fn get_app_key(&self) -> String {
308 self.app_key.to_string()
309 }
310 pub fn get_app_secret(&self) -> String {
311 self.app_secret.to_string()
312 }
313 pub fn get_app_name(&self) -> String {
314 self.app_name.to_string()
315 }
316 }
317 impl Error for AppError {}
318
319 impl PcsAccessToken {
320 pub fn new(access_token: &str, expires_in: u32, refresh_token: &str, scope: &str) -> Self {
321 Self {
322 access_token: access_token.to_string(),
323 expires_in,
324 refresh_token: refresh_token.to_string(),
325 scope: scope.to_string(),
326 session_key: None,
327 session_secret: None,
328 born_at: chrono::Utc::now().timestamp(),
329 }
330 }
331 pub fn is_expired(&self) -> bool {
332 (chrono::Utc::now().timestamp() + 600) > (self.born_at + self.expires_in as i64)
333 }
334
335 pub fn is_need_refresh(&self) -> bool {
336 (chrono::Utc::now().timestamp() + 7 * 24 * 3600)
338 < (self.born_at + self.expires_in as i64)
339 }
340 }
341
342 fn from_str_or_int<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
344 where
345 D: Deserializer<'de>,
346 {
347 let value = Value::deserialize(deserializer);
348 if value.is_err() {
349 return Ok(None);
351 }
352 match value? {
353 Value::String(s) => Ok(Some(s)),
354 Value::Number(n) => Ok(Some(n.to_string())),
355 _ => Ok(None),
356 }
357 }
358
359 #[derive(Serialize, Deserialize, Debug, Getters)]
361 #[getset(get = "pub")]
362 pub struct ShareVerifyResult {
363 data: ShareVerifyData,
364 }
365 #[derive(Serialize, Deserialize, Debug, Getters, Clone)]
366 #[getset(get = "pub")]
367 pub struct ShareVerifyData {
368 spwd: String,
370 }
371
372 #[derive(Serialize, Deserialize, Debug, Getters)]
374 #[getset(get = "pub")]
375 pub struct ShareFileListResult {
376 data: ShareFileListData,
377 }
378 #[derive(Serialize, Deserialize, Debug, Getters, Clone)]
379 #[getset(get = "pub")]
380 pub struct ShareFileListData {
381 #[serde(default)]
383 count: u64,
384 list: Vec<ShareFileInfo>,
386 }
387 #[derive(Serialize, Deserialize, Debug, Getters, Clone)]
388 #[getset(get = "pub")]
389 pub struct ShareFileInfo {
390 category: i32,
392 #[serde(deserialize_with = "from_str_or_int", default)]
394 fsid: Option<String>,
395 #[serde(alias = "isdir", default)]
397 is_dir: i32,
398 server_filename: String,
400 #[serde(default)]
402 path: String,
403 #[serde(default)]
405 size: u64,
406 #[serde(default)]
408 md5: Option<String>,
409 }
410
411 #[derive(Serialize, Deserialize, Debug, Getters)]
413 #[getset(get = "pub")]
414 pub struct ShareDownloadResult {
415 data: ShareDownloadData,
416 }
417 #[derive(Serialize, Deserialize, Debug, Getters, Clone)]
418 #[getset(get = "pub")]
419 pub struct ShareDownloadData {
420 #[serde(default)]
422 dlink: Option<String>,
423 }
424
425 impl PcsUserInfo {
426 pub fn get_user_block_slice_size(&self) -> u64 {
433 match self.vip_type {
438 0 => {
439 4 * 1024 * 1024
441 }
442 1 => {
443 16 * 1024 * 1024
445 }
446 2 => {
447 32 * 1024 * 1024
449 }
450 _ => {
451 4 * 1024 * 1024
453 }
454 }
455 }
456
457 pub fn get_user_max_upload_file_size(&self) -> u64 {
464 match self.vip_type {
465 0 => {
466 4 * 1024 * 1024 * 1024
468 }
469 1 => {
470 10 * 1024 * 1024 * 1024
472 }
473 2 => {
474 20 * 1024 * 1024 * 1024
476 }
477 _ => {
478 4 * 1024 * 1024 * 1024
480 }
481 }
482 }
483 }
484}
485
486pub mod dns;