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