Skip to content

Commit 5f75a14

Browse files
authored
Merge pull request #5 from kaicoh/release/v0.2.2
v0.2.2
2 parents d015b14 + 0cd8ff6 commit 5f75a14

File tree

5 files changed

+196
-1
lines changed

5 files changed

+196
-1
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [0.2.2][] - 2023-03-02
4+
5+
- https://github.com/kaicoh/slack-messaging/pull/6 Add `mrkdwn` and `plain_text` macros.
6+
37
## [0.2.1][] - 2023-02-28
48

59
- https://github.com/kaicoh/slack-messaging/pull/4 Extend Message to be an interaction response.
@@ -12,6 +16,7 @@
1216

1317
- pre-release
1418

19+
[0.2.2]: https://github.com/kaicoh/slack-messaging/releases/v0.2.2
1520
[0.2.1]: https://github.com/kaicoh/slack-messaging/releases/v0.2.1
1621
[0.2.0]: https://github.com/kaicoh/slack-messaging/releases/v0.2.0
1722
[0.1.0]: https://github.com/kaicoh/slack-messaging/releases/v0.1.0

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "slack-messaging"
3-
version = "0.2.1"
3+
version = "0.2.2"
44
authors = ["kaicoh <[email protected]>"]
55
edition = "2021"
66
keywords = ["slack", "messaging", "webhook"]

src/blocks/elements/text.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,42 @@ const TYPE_MRKDWN: &str = "mrkdwn";
66
/// [Text object](https://api.slack.com/reference/block-kit/composition-objects#text)
77
/// representation.
88
///
9+
/// # Example
10+
///
11+
/// ## type plain_text
12+
///
13+
/// ```
14+
/// use slack_messaging::blocks::elements::Text;
15+
/// use serde_json::json;
16+
///
17+
/// let text = Text::plain("Hello, World!");
18+
/// let text_json = serde_json::to_value(text).unwrap();
19+
///
20+
/// let expected = json!({
21+
/// "type": "plain_text",
22+
/// "text": "Hello, World!",
23+
/// "emoji": true
24+
/// });
25+
///
26+
/// assert_eq!(text_json, expected);
27+
/// ```
28+
///
29+
/// ## type mrkdwn
30+
///
31+
/// ```
32+
/// use slack_messaging::blocks::elements::Text;
33+
/// use serde_json::json;
34+
///
35+
/// let text = Text::mrkdwn("Hello, World!");
36+
/// let text_json = serde_json::to_value(text).unwrap();
37+
///
38+
/// let expected = json!({
39+
/// "type": "mrkdwn",
40+
/// "text": "Hello, World!",
41+
/// });
42+
///
43+
/// assert_eq!(text_json, expected);
44+
/// ```
945
#[derive(Debug, Clone, Serialize)]
1046
pub struct Text {
1147
#[serde(rename = "type")]
@@ -149,3 +185,65 @@ impl Text {
149185
}
150186
}
151187
}
188+
189+
impl PartialEq for Text {
190+
fn eq(&self, other: &Self) -> bool {
191+
if self.kind != other.kind || self.text.as_str() != other.text.as_str() {
192+
return false;
193+
}
194+
195+
match self.kind {
196+
TYPE_PLAIN => self.emoji.unwrap_or(false) == other.emoji.unwrap_or(false),
197+
TYPE_MRKDWN => self.verbatim.unwrap_or(false) == other.verbatim.unwrap_or(false),
198+
_ => false,
199+
}
200+
}
201+
}
202+
203+
#[cfg(test)]
204+
mod tests {
205+
use super::*;
206+
207+
#[test]
208+
fn it_equals_with_same_type_and_text() {
209+
let plain_0 = Text::plain("Hello");
210+
let plain_1 = Text::plain("Hello");
211+
212+
let mrkdwn_0 = Text::mrkdwn("Hello");
213+
let mrkdwn_1 = Text::mrkdwn("Hello");
214+
215+
assert_eq!(plain_0, plain_1);
216+
assert_eq!(mrkdwn_0, mrkdwn_1);
217+
218+
assert_ne!(plain_0, mrkdwn_0);
219+
assert_ne!(plain_0, mrkdwn_1);
220+
assert_ne!(plain_1, mrkdwn_0);
221+
assert_ne!(plain_1, mrkdwn_1);
222+
}
223+
224+
#[test]
225+
fn it_compares_emoji_field_when_plain_text() {
226+
let plain_0 = Text::plain("Hello").set_emoji(false);
227+
let plain_1 = Text::plain("Hello");
228+
229+
assert_ne!(plain_0, plain_1);
230+
231+
let plain_0 = Text::plain("Hello").set_emoji(false);
232+
let plain_1 = Text::plain("Hello").set_emoji(false);
233+
234+
assert_eq!(plain_0, plain_1);
235+
}
236+
237+
#[test]
238+
fn it_compares_verbatim_field_when_mrkdwn() {
239+
let mrkdwn_0 = Text::mrkdwn("Hello").set_verbatim(true);
240+
let mrkdwn_1 = Text::mrkdwn("Hello");
241+
242+
assert_ne!(mrkdwn_0, mrkdwn_1);
243+
244+
let mrkdwn_0 = Text::mrkdwn("Hello").set_verbatim(true);
245+
let mrkdwn_1 = Text::mrkdwn("Hello").set_verbatim(true);
246+
247+
assert_eq!(mrkdwn_0, mrkdwn_1);
248+
}
249+
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ pub mod blocks;
111111
/// Format text for slack app. Require `fmt` feature.
112112
#[cfg(feature = "fmt")]
113113
pub mod fmt;
114+
#[macro_use]
115+
mod macros;
114116
mod message;
115117

116118
pub use attachment::Attachment;

src/macros.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/// Constructs `plain_text` [Text](crate::blocks::elements::Text).
2+
///
3+
/// ```
4+
/// use slack_messaging::plain_text;
5+
/// use slack_messaging::blocks::elements::Text;
6+
///
7+
/// let text = plain_text!("Hello, World!");
8+
/// let expected = Text::plain("Hello, World!");
9+
///
10+
/// assert_eq!(text, expected);
11+
///
12+
/// let greet = "Hi";
13+
/// let name = "Tanaka";
14+
///
15+
/// // You can use this like format! macro.
16+
/// let text = plain_text!("{}, {}!", greet, name);
17+
/// let expected = Text::plain("Hi, Tanaka!");
18+
///
19+
/// assert_eq!(text, expected);
20+
/// ```
21+
#[macro_export]
22+
macro_rules! plain_text {
23+
($fmt:expr) => {
24+
$crate::blocks::elements::Text::plain(format!($fmt))
25+
};
26+
($fmt:expr, $($arg:tt)+) => {
27+
$crate::blocks::elements::Text::plain(format!($fmt, $($arg)+))
28+
};
29+
}
30+
31+
/// Constructs `mrkdwn` [Text](crate::blocks::elements::Text).
32+
///
33+
/// ```
34+
/// use slack_messaging::mrkdwn;
35+
/// use slack_messaging::blocks::elements::Text;
36+
///
37+
/// let text = mrkdwn!("Hello, World!");
38+
/// let expected = Text::mrkdwn("Hello, World!");
39+
///
40+
/// assert_eq!(text, expected);
41+
///
42+
/// let greet = "Hi";
43+
/// let name = "Tanaka";
44+
///
45+
/// // You can use this like format! macro.
46+
/// let text = mrkdwn!("{}, {}!", greet, name);
47+
/// let expected = Text::mrkdwn("Hi, Tanaka!");
48+
///
49+
/// assert_eq!(text, expected);
50+
/// ```
51+
#[macro_export]
52+
macro_rules! mrkdwn {
53+
($fmt:expr) => {
54+
$crate::blocks::elements::Text::mrkdwn(format!($fmt))
55+
};
56+
($fmt:expr, $($arg:tt)+) => {
57+
$crate::blocks::elements::Text::mrkdwn(format!($fmt, $($arg)+))
58+
};
59+
}
60+
61+
#[cfg(test)]
62+
mod tests {
63+
use crate::blocks::elements::Text;
64+
65+
#[test]
66+
fn it_works_macro_plain_text_given_expression() {
67+
let text = plain_text!("Hello, Tanaka!");
68+
assert_eq!(text, Text::plain("Hello, Tanaka!"));
69+
}
70+
71+
#[test]
72+
fn it_works_macro_plain_text_given_expression_and_tokens() {
73+
let name = "Tanaka";
74+
let text = plain_text!("Hello, {}!", name);
75+
assert_eq!(text, Text::plain("Hello, Tanaka!"));
76+
}
77+
78+
#[test]
79+
fn it_works_macro_mrkdwn_given_expression() {
80+
let text = mrkdwn!("Hello, Tanaka!");
81+
assert_eq!(text, Text::mrkdwn("Hello, Tanaka!"));
82+
}
83+
84+
#[test]
85+
fn it_works_macro_mrkdwn_given_expression_and_tokens() {
86+
let name = "Tanaka";
87+
let text = mrkdwn!("Hello, {}!", name);
88+
assert_eq!(text, Text::mrkdwn("Hello, Tanaka!"));
89+
}
90+
}

0 commit comments

Comments
 (0)