File size: 1,725 Bytes
cd872f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
pub mod error;
pub mod health;
pub mod config;
pub mod userinfo;

use config::ConfigData;

use serde::Serialize;

#[derive(Serialize)]
pub enum ApiStatus {
    #[serde(rename = "healthy")]
    Healthy,
    #[serde(rename = "success")]
    Success,
    #[serde(rename = "error")]
    Error,
    #[serde(rename = "failed")]
    Failed,
}

// #[derive(Serialize)]
// #[serde(untagged)]
// pub enum ApiResponse {
//     HealthCheck(HealthCheckResponse),
//     ConfigData(NormalResponse<ConfigData>),
//     Error(ErrorResponse),
// }

// impl ApiResponse {
//     pub fn to_string(&self) -> String {
//         serde_json::to_string(self).unwrap()
//     }
// }

#[derive(Serialize)]
pub struct NormalResponse<T> {
    pub status: ApiStatus,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<T>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
}

impl std::fmt::Display for NormalResponse<ConfigData> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", serde_json::to_string(self).unwrap())
    }
}

#[derive(Serialize)]
pub struct NormalResponseNoData {
    pub status: ApiStatus,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
}

#[derive(Serialize)]
pub struct ErrorResponse {
    // status -> 成功 / 失败
    pub status: ApiStatus,
    // HTTP 请求的状态码
    #[serde(skip_serializing_if = "Option::is_none")]
    pub code: Option<u16>,
    // HTTP 请求的错误码
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,
    // 错误详情
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
}