codeberg_cli/render/
datetime.rs1use chrono::Datelike;
2use time::{Date, OffsetDateTime, Time, format_description};
3
4pub fn render_datetime_and_info(datetime: &OffsetDateTime) -> String {
5 let days_passed = (OffsetDateTime::now_utc() - *datetime).whole_days();
6 let at_least_one_day_passed = days_passed > 0;
7
8 let extra_info = if at_least_one_day_passed {
9 {
10 let multiple_days_passed = days_passed > 1;
11 let day_word = if multiple_days_passed { "days" } else { "day" };
12 format!(" ({days_passed} {day_word} ago)")
13 }
14 } else {
15 Default::default()
16 };
17 format!(
18 "{}{extra_info}",
19 datetime
20 .format(
21 &format_description::parse("[day].[month].[year]")
22 .expect("invalid DateTime format"),
23 )
24 .expect("Couldn't format DateTime'")
25 )
26}
27
28pub fn render_datetime_regular(datetime: &OffsetDateTime) -> String {
29 datetime
30 .format(
31 &format_description::parse("[day].[month].[year] [hour]:[minute]")
32 .expect("invalid DateTime format"),
33 )
34 .expect("Couldn't format DateTime'")
35}
36
37pub fn ask_datetime(prompt: &str) -> anyhow::Result<OffsetDateTime> {
38 let naive_date = inquire::DateSelect::new(prompt).prompt()?;
39
40 Ok(OffsetDateTime::new_utc(
41 Date::from_ordinal_date(naive_date.year(), naive_date.ordinal() as u16)?,
42 Time::from_hms(12, 0, 0)?,
43 ))
44}