slack_morphism/models/blocks/
datetime.rs1use crate::SlackTextFormat;
2use chrono::prelude::*;
3
4pub enum SlackDateTimeFormats {
5 DateNum,
6 Date,
7 DateShort,
8 DateLong,
9 DatePretty,
10 DateShortPretty,
11 DateLongPretty,
12 Time,
13 TimeSecs,
14}
15
16#[allow(clippy::to_string_trait_impl)]
17impl ToString for SlackDateTimeFormats {
18 fn to_string(&self) -> String {
19 match self {
20 SlackDateTimeFormats::DateNum => "{date_num}".into(),
21 SlackDateTimeFormats::Date => "{date}".into(),
22 SlackDateTimeFormats::DateShort => "{date_short}".into(),
23 SlackDateTimeFormats::DateLong => "{date_long}".into(),
24 SlackDateTimeFormats::DatePretty => "{date_pretty}".into(),
25 SlackDateTimeFormats::DateShortPretty => "{date_short_pretty}".into(),
26 SlackDateTimeFormats::DateLongPretty => "{date_long_pretty}".into(),
27 SlackDateTimeFormats::Time => "{time}".into(),
28 SlackDateTimeFormats::TimeSecs => "{time_secs}".into(),
29 }
30 }
31}
32
33pub fn fmt_slack_date<TZ: TimeZone>(
34 date: &DateTime<TZ>,
35 token_string: &str,
36 link: Option<&String>,
37) -> String
38where
39 <TZ as chrono::offset::TimeZone>::Offset: std::fmt::Display,
40{
41 let link_part = link
42 .map(|value| format!("^{value}"))
43 .unwrap_or_else(|| "".into());
44 let fallback = date.to_rfc2822();
45 format!(
46 "<!date^{timestamp}^{token_string}{link_part}|{fallback}>",
47 timestamp = date.timestamp(),
48 token_string = token_string,
49 link_part = link_part,
50 fallback = fallback
51 )
52}
53
54impl<TZ: TimeZone> SlackTextFormat for DateTime<TZ>
55where
56 <TZ as chrono::offset::TimeZone>::Offset: std::fmt::Display,
57{
58 fn to_slack_format(&self) -> String {
59 fmt_slack_date(
60 self,
61 SlackDateTimeFormats::DatePretty.to_string().as_str(),
62 None,
63 )
64 }
65}