tcloud_im_api/
response.rs1use 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}