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
16impl ToString for SlackDateTimeFormats {
17    fn to_string(&self) -> String {
18        match self {
19            SlackDateTimeFormats::DateNum => "{date_num}".into(),
20            SlackDateTimeFormats::Date => "{date}".into(),
21            SlackDateTimeFormats::DateShort => "{date_short}".into(),
22            SlackDateTimeFormats::DateLong => "{date_long}".into(),
23            SlackDateTimeFormats::DatePretty => "{date_pretty}".into(),
24            SlackDateTimeFormats::DateShortPretty => "{date_short_pretty}".into(),
25            SlackDateTimeFormats::DateLongPretty => "{date_long_pretty}".into(),
26            SlackDateTimeFormats::Time => "{time}".into(),
27            SlackDateTimeFormats::TimeSecs => "{time_secs}".into(),
28        }
29    }
30}
31
32pub fn fmt_slack_date<TZ: TimeZone>(
33    date: &DateTime<TZ>,
34    token_string: &str,
35    link: Option<&String>,
36) -> String
37where
38    <TZ as chrono::offset::TimeZone>::Offset: std::fmt::Display,
39{
40    let link_part = link
41        .map(|value| format!("^{}", value))
42        .unwrap_or_else(|| "".into());
43    let fallback = date.to_rfc2822();
44    format!(
45        "<!date^{timestamp}^{token_string}{link_part}|{fallback}>",
46        timestamp = date.timestamp(),
47        token_string = token_string,
48        link_part = link_part,
49        fallback = fallback
50    )
51}
52
53impl<TZ: TimeZone> SlackTextFormat for DateTime<TZ>
54where
55    <TZ as chrono::offset::TimeZone>::Offset: std::fmt::Display,
56{
57    fn to_slack_format(&self) -> String {
58        fmt_slack_date(
59            self,
60            SlackDateTimeFormats::DatePretty.to_string().as_str(),
61            None,
62        )
63    }
64}