tcloud_im_api/
response.rs

1use serde::{Serialize, Deserialize};
2
3use crate::error::Error;
4
5pub trait Response<T> {
6    fn parse(self) -> Result<T, Error>;
7}
8
9#[derive(Serialize, Deserialize, Debug)]
10pub struct BaseResponse {
11    #[serde(rename = "ErrorCode")]
12    pub error_code: u32,
13    #[serde(rename = "ErrorInfo")]
14    pub error_info: String,
15    #[serde(rename = "ActionStatus")]
16    pub action_status: String
17}
18
19impl Response<()> for BaseResponse {
20    #[inline]
21    fn parse(self) -> Result<(), Error> {
22        if self.error_code == 0 {
23            Ok(())
24        } else {
25            Err(Error::RemoteError{code: self.error_code, msg: self.error_info})
26        }
27    }
28}
29
30#[derive(Debug, Deserialize)]
31pub struct RespHolder<T> {
32    #[serde(flatten)]
33    error: BaseResponse,
34    #[serde(flatten)]
35    data: Option<T>
36}
37
38impl<T> Response<T> for RespHolder<T> {
39    fn parse(self) -> Result<T, Error> {
40        if self.error.error_code != 0 {
41            Err(Error::RemoteError{
42                code: self.error.error_code,
43                msg: self.error.error_info
44            })
45        } else {
46            Ok(self.data.expect("tcloud return ok with empty body"))
47        }
48    }
49}