1use chrono::serde::ts_seconds;
2use chrono::{DateTime, TimeZone, Utc};
3use rsb_derive::Builder;
4use rvstruct::ValueStruct;
5use serde::{Deserialize, Serialize};
6use serde_with::skip_serializing_none;
7use std::hash::Hash;
8use std::*;
9use url::Url;
10
11mod user;
12pub use user::*;
13mod team;
14pub use team::*;
15mod channel;
16pub use channel::*;
17mod reaction;
18pub use reaction::*;
19
20mod bot;
21pub use bot::*;
22
23mod icon;
24pub use icon::*;
25
26mod formatters;
27pub use formatters::*;
28
29#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
30pub struct SlackTs(pub String);
31
32impl SlackTs {
33 pub fn to_date_time(&self) -> Result<DateTime<Utc>, num::ParseIntError> {
34 let parts: Vec<&str> = self.value().split('.').collect();
35 let ts_int: i64 = parts[0].parse()?;
36 Ok(Utc.timestamp_millis(ts_int * 1000))
37 }
38}
39
40#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
41pub struct SlackScheduledMid(pub String);
42
43#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
44pub struct SlackTeamId(pub String);
45
46#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
47pub struct SlackAppId(pub String);
48
49#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
50pub struct SlackChannelId(pub String);
51
52#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
53pub struct SlackClientMessageId(pub String);
54
55impl SlackTextFormat for SlackChannelId {
56 fn to_slack_format(&self) -> String {
57 format!("<#{}>", self.value())
58 }
59}
60
61#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
62pub struct SlackChannelType(pub String);
63
64#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
65pub struct SlackConversationId(pub String);
66
67#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
68pub struct SlackActionId(pub String);
69
70#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
71pub struct SlackActionType(pub String);
72
73#[derive(Debug, Eq, Hash, PartialEq, Clone, Serialize, Deserialize, ValueStruct)]
74pub struct SlackUserId(pub String);
75
76impl SlackTextFormat for SlackUserId {
77 fn to_slack_format(&self) -> String {
78 format!("<@{}>", self.value())
79 }
80}
81
82#[derive(Debug, Eq, Hash, PartialEq, Clone, Serialize, Deserialize, ValueStruct)]
83pub struct SlackBotId(pub String);
84
85#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
86pub struct SlackDateTime(#[serde(with = "ts_seconds")] pub DateTime<Utc>);
87
88#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
89pub struct SlackLocale(pub String);
90
91#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
92pub struct SlackCursorId(pub String);
93
94#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
95pub struct SlackColor(pub String);
96
97#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
98pub struct SlackCallbackId(pub String);
99
100#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
101pub struct SlackTriggerId(pub String);
102
103#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
104pub struct SlackViewId(pub String);
105
106#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
107pub struct SlackCommandId(pub String);
108
109#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
110pub struct SlackClientId(pub String);
111
112#[derive(Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
113pub struct SlackClientSecret(pub String);
114
115impl fmt::Debug for SlackClientSecret {
116 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
117 write!(f, "SlackClientSecret(len:{})", self.value().len())
118 }
119}
120
121#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
122pub struct SlackApiTokenScope(pub String);
123
124#[derive(Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
125pub struct SlackVerificationToken(pub String);
126
127impl fmt::Debug for SlackVerificationToken {
128 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
129 write!(f, "SlackVerificationToken(len:{})", self.value().len())
130 }
131}
132
133#[derive(Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
134pub struct SlackSigningSecret(pub String);
135
136impl fmt::Debug for SlackSigningSecret {
137 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
138 write!(f, "SlackSigningSecret(len:{})", self.value().len())
139 }
140}
141
142#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
143pub struct EmailAddress(pub String);
144
145#[skip_serializing_none]
146#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
147pub struct SlackResponseMetadata {
148 #[serde(with = "serde_with::rust::string_empty_as_none")]
149 pub next_cursor: Option<SlackCursorId>,
150}
151
152#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
153pub enum SlackConversationType {
154 #[serde(rename = "im")]
155 Im,
156 #[serde(rename = "mpim")]
157 Mpim,
158 #[serde(rename = "private_channel")]
159 Private,
160 #[serde(rename = "public_channel")]
161 Public,
162}
163
164impl ToString for SlackConversationType {
165 fn to_string(&self) -> String {
166 match self {
167 SlackConversationType::Im => "im".into(),
168 SlackConversationType::Mpim => "mpim".into(),
169 SlackConversationType::Private => "private_channel".into(),
170 SlackConversationType::Public => "public_channel".into(),
171 }
172 }
173}
174
175#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
176pub struct SlackResponseUrl(pub Url);
177
178#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
179pub struct SlackWebSocketsUrl(pub Url);
180
181impl SlackWebSocketsUrl {
182 pub fn to_debug_url(&self) -> Self {
183 Self(Url::parse(format!("{}&debug_reconnects=true", self.value()).as_str()).unwrap())
184 }
185}
186
187#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
188pub struct SlackTeamUrl(pub Url);
189
190#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
191pub struct SlackUnfurlId(pub String);
192
193#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
194pub struct SlackMimeType(pub String);
195
196#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
197pub struct SlackEmoji(pub String);
198
199impl SlackEmoji {
200 pub const SMILE: &'static str = ":smile:";
201 pub const SPEECH_BALLOON: &'static str = ":speech_balloon:";
202 pub const HEAVY_CHECK_MARK: &'static str = ":heavy_check_mark:";
203}
204
205#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
206pub enum SlackShortcutType {
207 #[serde(rename = "message")]
208 Message,
209 #[serde(rename = "global")]
210 Global,
211}
212
213#[derive(Debug, Eq, PartialEq, Hash, Clone, Serialize, Deserialize, ValueStruct)]
214pub struct SlackEventType(pub String);