slack_rust/chat/
get_permalink.rs1use crate::error::Error;
5use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8
9#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
10pub struct GetPermalinkRequest {
11 pub channel: String,
12 pub message_ts: String,
13}
14
15#[skip_serializing_none]
16#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
17pub struct GetPermalinkResponse {
18 pub ok: bool,
19 pub error: Option<String>,
20 pub response_metadata: Option<ResponseMetadata>,
21 pub permalink: Option<String>,
22}
23
24pub async fn get_permalink<T>(
27 client: &T,
28 param: &GetPermalinkRequest,
29 bot_token: &str,
30) -> Result<GetPermalinkResponse, Error>
31where
32 T: SlackWebAPIClient,
33{
34 let url = get_slack_url("chat.getPermalink");
35 let json = serde_json::to_string(¶m)?;
36
37 client
38 .post_json(&url, &json, bot_token)
39 .await
40 .and_then(|result| {
41 serde_json::from_str::<GetPermalinkResponse>(&result).map_err(Error::SerdeJsonError)
42 })
43}
44
45#[cfg(test)]
46mod test {
47 use super::*;
48 use crate::http_client::MockSlackWebAPIClient;
49
50 #[test]
51 fn convert_request() {
52 let request = GetPermalinkRequest {
53 channel: "53072".to_string(),
54 message_ts: "1234567890.123456".to_string(),
55 };
56 let json = r##"{
57 "channel": "53072",
58 "message_ts": "1234567890.123456"
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::<GetPermalinkRequest>(json).unwrap();
65 assert_eq!(request, s);
66 }
67
68 #[test]
69 fn convert_response() {
70 let response = GetPermalinkResponse {
71 ok: true,
72 permalink: Some(
73 "https://ghostbusters.slack.com/archives/C1H9RESGA/p135854651500008".to_string(),
74 ),
75 ..Default::default()
76 };
77 let json = r##"{
78 "ok": true,
79 "permalink": "https://ghostbusters.slack.com/archives/C1H9RESGA/p135854651500008"
80}"##;
81
82 let j = serde_json::to_string_pretty(&response).unwrap();
83 assert_eq!(json, j);
84
85 let s = serde_json::from_str::<GetPermalinkResponse>(json).unwrap();
86 assert_eq!(response, s);
87 }
88
89 #[async_std::test]
90 async fn test_get_permalink() {
91 let param = GetPermalinkRequest {
92 channel: "53072".to_string(),
93 message_ts: "1234567890.123456".to_string(),
94 };
95
96 let mut mock = MockSlackWebAPIClient::new();
97 mock.expect_post_json().returning(|_, _, _| {
98 Ok(r##"{
99 "ok": true,
100 "permalink": "https://ghostbusters.slack.com/archives/C1H9RESGA/p135854651500008"
101}"##
102 .to_string())
103 });
104
105 let response = get_permalink(&mock, ¶m, &"test_token".to_string())
106 .await
107 .unwrap();
108 let expect = GetPermalinkResponse {
109 ok: true,
110 permalink: Some(
111 "https://ghostbusters.slack.com/archives/C1H9RESGA/p135854651500008".to_string(),
112 ),
113 ..Default::default()
114 };
115
116 assert_eq!(expect, response);
117 }
118}