slack_rust/conversations/
info.rs1use crate::channels::channel::Channel;
2use crate::error::Error;
3use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[skip_serializing_none]
8#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
9pub struct InfoRequest {
10 pub channel: String,
11 pub include_locale: Option<bool>,
12 pub include_num_members: Option<bool>,
13}
14
15#[skip_serializing_none]
16#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
17pub struct InfoResponse {
18 pub ok: bool,
19 pub error: Option<String>,
20 pub response_metadata: Option<ResponseMetadata>,
21 pub channel: Option<Channel>,
22}
23
24pub async fn info<T>(
25 client: &T,
26 param: &InfoRequest,
27 bot_token: &str,
28) -> Result<InfoResponse, Error>
29where
30 T: SlackWebAPIClient,
31{
32 let url = get_slack_url("conversations.info");
33 let json = serde_json::to_string(¶m)?;
34
35 client
36 .post_json(&url, &json, bot_token)
37 .await
38 .and_then(|result| {
39 serde_json::from_str::<InfoResponse>(&result).map_err(Error::SerdeJsonError)
40 })
41}
42#[cfg(test)]
43mod test {
44 use super::*;
45 use crate::channels::channel::{Purpose, Topic};
46 use crate::http_client::MockSlackWebAPIClient;
47
48 #[test]
49 fn convert_request() {
50 let request = InfoRequest {
51 channel: "C1234567890".to_string(),
52 include_locale: Some(true),
53 include_num_members: Some(true),
54 };
55 let json = r##"{
56 "channel": "C1234567890",
57 "include_locale": true,
58 "include_num_members": true
59}"##;
60
61 let j = serde_json::to_string_pretty(&request).unwrap();
62 assert_eq!(json, j);
63
64 let s = serde_json::from_str::<InfoRequest>(json).unwrap();
65 assert_eq!(request, s);
66 }
67
68 #[test]
69 fn convert_response() {
70 let response = InfoResponse {
71 ok: true,
72 channel: Some(Channel {
73 id: Some("C0EAQDV4Z".to_string()),
74 name: Some("endeavor".to_string()),
75 is_channel: Some(true),
76 created: Some(1504554479),
77 creator: Some("U0123456".to_string()),
78 is_archived: Some(false),
79 is_general: Some(false),
80 name_normalized: Some("endeavor".to_string()),
81 is_shared: Some(false),
82 is_org_shared: Some(false),
83 is_member: Some(false),
84 is_private: Some(false),
85 is_mpim: Some(false),
86 last_read: Some("0000000000.000000".to_string()),
87 unread_count: Some(0),
88 unread_count_display: Some(0),
89 topic: Some(Topic {
90 value: Some("".to_string()),
91 creator: Some("".to_string()),
92 last_set: Some(0),
93 }),
94 purpose: Some(Purpose {
95 value: Some("".to_string()),
96 creator: Some("".to_string()),
97 last_set: Some(0),
98 }),
99 previous_names: Some(vec![]),
100 priority: Some(0),
101 ..Default::default()
102 }),
103 ..Default::default()
104 };
105 let json = r##"{
106 "ok": true,
107 "channel": {
108 "id": "C0EAQDV4Z",
109 "name": "endeavor",
110 "is_channel": true,
111 "created": 1504554479,
112 "creator": "U0123456",
113 "is_archived": false,
114 "is_general": false,
115 "name_normalized": "endeavor",
116 "is_shared": false,
117 "is_org_shared": false,
118 "is_member": false,
119 "is_private": false,
120 "is_mpim": false,
121 "last_read": "0000000000.000000",
122 "unread_count": 0,
123 "unread_count_display": 0,
124 "topic": {
125 "value": "",
126 "creator": "",
127 "last_set": 0
128 },
129 "purpose": {
130 "value": "",
131 "creator": "",
132 "last_set": 0
133 },
134 "previous_names": [],
135 "priority": 0
136 }
137}"##;
138
139 let j = serde_json::to_string_pretty(&response).unwrap();
140 assert_eq!(json, j);
141
142 let s = serde_json::from_str::<InfoResponse>(json).unwrap();
143 assert_eq!(response, s);
144 }
145
146 #[async_std::test]
147 async fn test_info() {
148 let param = InfoRequest {
149 channel: "C1234567890".to_string(),
150 include_locale: Some(true),
151 include_num_members: Some(true),
152 };
153
154 let mut mock = MockSlackWebAPIClient::new();
155 mock.expect_post_json().returning(|_, _, _| {
156 Ok(r##"{
157 "ok": true,
158 "channel": {
159 "id": "C1234567890",
160 "name": "endeavor",
161 "is_channel": true,
162 "created": 1504554479,
163 "creator": "U0123456",
164 "is_archived": false,
165 "is_general": false,
166 "name_normalized": "endeavor",
167 "is_shared": false,
168 "is_org_shared": false,
169 "is_member": false,
170 "is_private": false,
171 "is_mpim": false,
172 "last_read": "0000000000.000000",
173 "unread_count": 0,
174 "unread_count_display": 0,
175 "topic": {
176 "value": "",
177 "creator": "",
178 "last_set": 0
179 },
180 "purpose": {
181 "value": "",
182 "creator": "",
183 "last_set": 0
184 },
185 "previous_names": [],
186 "priority": 0
187 }
188}"##
189 .to_string())
190 });
191
192 let response = info(&mock, ¶m, &"test_token".to_string())
193 .await
194 .unwrap();
195 let expect = InfoResponse {
196 ok: true,
197 channel: Some(Channel {
198 id: Some("C1234567890".to_string()),
199 name: Some("endeavor".to_string()),
200 is_channel: Some(true),
201 created: Some(1504554479),
202 creator: Some("U0123456".to_string()),
203 is_archived: Some(false),
204 is_general: Some(false),
205 name_normalized: Some("endeavor".to_string()),
206 is_shared: Some(false),
207 is_org_shared: Some(false),
208 is_member: Some(false),
209 is_private: Some(false),
210 is_mpim: Some(false),
211 last_read: Some("0000000000.000000".to_string()),
212 unread_count: Some(0),
213 unread_count_display: Some(0),
214 topic: Some(Topic {
215 value: Some("".to_string()),
216 creator: Some("".to_string()),
217 last_set: Some(0),
218 }),
219 purpose: Some(Purpose {
220 value: Some("".to_string()),
221 creator: Some("".to_string()),
222 last_set: Some(0),
223 }),
224 previous_names: Some(vec![]),
225 priority: Some(0),
226 ..Default::default()
227 }),
228 ..Default::default()
229 };
230
231 assert_eq!(expect, response);
232 }
233}