slack_rust/chat/
get_permalink.rs

1//! Retrieve a permalink URL for a specific extant message.  
2//! See: <https://api.slack.com/methods/chat.getPermalink>
3
4use 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
24/// Retrieve a permalink URL for a specific extant message.  
25/// See: <https://api.slack.com/methods/chat.getPermalink>
26pub 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(&param)?;
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, &param, &"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}