1use serde::Deserialize;
2
3use crate::{Timestamp, enums::Category, serde::empty_string_as_none};
4
5#[derive(Debug, Deserialize, PartialEq)]
6#[serde(rename_all = "camelCase")]
7pub struct Resp<T> {
8 pub ret_code: i64,
9 pub ret_msg: String,
10 pub result: T,
11 pub time: Option<Timestamp>,
12 pub ret_ext_info: Option<RetExtInfo>,
13}
14
15#[derive(Debug, Deserialize, PartialEq)]
16#[serde(rename_all = "camelCase")]
17pub struct APIErrorResponse {
18 pub ret_code: i64,
19 pub ret_msg: String,
20}
21
22#[derive(Debug, PartialEq)]
23pub struct Response<T> {
24 pub result: T,
25 pub time: Option<Timestamp>,
26 pub headers: Headers,
27 pub ret_ext_info: Option<RetExtInfo>,
29}
30
31#[derive(Debug, Deserialize, PartialEq)]
32#[serde(rename_all = "camelCase")]
33pub struct CursorPagination<T> {
34 pub category: Option<Category>,
35 #[serde(default, deserialize_with = "empty_string_as_none")]
36 pub next_page_cursor: Option<String>,
37 pub list: Vec<T>,
38}
39
40#[derive(Debug, Deserialize, PartialEq)]
41#[serde(rename_all = "camelCase")]
42pub struct List<T> {
43 pub list: Vec<T>,
44}
45
46#[derive(Debug, PartialEq)]
47pub struct Headers {
48 pub ret_code: Option<i32>,
49 pub trace_id: Option<String>,
50 pub time_now: Option<Timestamp>,
51 pub api_limit: Option<u64>,
52 pub api_limit_status: Option<u64>,
53 pub api_limit_reset_timestamp: Option<Timestamp>,
54}
55
56impl Headers {
57 pub fn is_ret_code_ok(&self) -> bool {
58 match self.ret_code {
59 Some(code) => code == 0,
60 None => false,
61 }
62 }
63}
64
65#[derive(Debug, Deserialize, PartialEq)]
66pub struct BatchItemResult {
67 pub code: i64,
68 pub msg: String,
69}
70
71#[derive(Debug, Default, Deserialize, PartialEq)]
74pub struct RetExtInfo {
75 #[serde(default)]
76 pub list: Vec<BatchItemResult>,
77}
78
79#[derive(Debug, Deserialize, PartialEq)]
82pub struct EmptyResult {}