slack_morphism/models/blocks/
datetime.rs

1use 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}