2020-12-16 02:40:41 +00:00
|
|
|
include!(concat!(env!("OUT_DIR"), "/templates.rs"));
|
|
|
|
|
2021-01-22 05:42:19 +00:00
|
|
|
mod banner;
|
2020-12-16 02:40:41 +00:00
|
|
|
mod button;
|
|
|
|
mod card;
|
2021-01-06 08:16:50 +00:00
|
|
|
mod file_input;
|
2021-01-22 05:42:19 +00:00
|
|
|
mod icon;
|
|
|
|
mod image;
|
2020-12-16 02:40:41 +00:00
|
|
|
mod input;
|
|
|
|
mod link;
|
2021-01-22 05:42:19 +00:00
|
|
|
mod profile;
|
2021-01-14 04:40:36 +00:00
|
|
|
mod select;
|
2020-12-16 02:40:41 +00:00
|
|
|
mod text_input;
|
2021-01-22 05:42:19 +00:00
|
|
|
mod tile;
|
2020-12-16 02:40:41 +00:00
|
|
|
|
|
|
|
pub use self::{
|
2021-01-22 05:42:19 +00:00
|
|
|
banner::Banner,
|
2020-12-16 02:40:41 +00:00
|
|
|
button::{Button, ButtonKind, LinkKind},
|
|
|
|
card::Card,
|
2021-01-06 08:16:50 +00:00
|
|
|
file_input::FileInput,
|
2021-01-22 05:42:19 +00:00
|
|
|
icon::Icon,
|
|
|
|
image::Image,
|
2020-12-16 02:40:41 +00:00
|
|
|
input::{Input, InputKind},
|
|
|
|
link::Link,
|
2021-01-22 05:42:19 +00:00
|
|
|
profile::Profile,
|
2021-01-14 04:40:36 +00:00
|
|
|
select::Select,
|
2020-12-16 02:40:41 +00:00
|
|
|
text_input::TextInput,
|
2021-01-22 05:42:19 +00:00
|
|
|
tile::Tile,
|
2020-12-16 02:40:41 +00:00
|
|
|
};
|
2021-01-13 04:34:25 +00:00
|
|
|
|
|
|
|
use chrono::{DateTime, Utc};
|
|
|
|
|
|
|
|
fn time_ago_long(time: DateTime<Utc>) -> String {
|
|
|
|
let duration = chrono::Utc::now() - time;
|
|
|
|
if let Some(years) =
|
|
|
|
duration
|
|
|
|
.num_days()
|
|
|
|
.checked_div(365)
|
|
|
|
.and_then(|years| if years > 0 { Some(years) } else { None })
|
|
|
|
{
|
|
|
|
if years == 1 {
|
|
|
|
format!("{} year ago", years)
|
|
|
|
} else {
|
|
|
|
format!("{} years ago", years)
|
|
|
|
}
|
|
|
|
} else if duration.num_weeks() > 0 {
|
|
|
|
if duration.num_weeks() == 1 {
|
|
|
|
format!("{} week ago", duration.num_weeks())
|
|
|
|
} else {
|
|
|
|
format!("{} weeks ago", duration.num_weeks())
|
|
|
|
}
|
|
|
|
} else if duration.num_days() > 0 {
|
|
|
|
if duration.num_days() == 1 {
|
|
|
|
format!("{} day ago", duration.num_days())
|
|
|
|
} else {
|
|
|
|
format!("{} days ago", duration.num_days())
|
|
|
|
}
|
|
|
|
} else if duration.num_hours() > 0 {
|
|
|
|
if duration.num_hours() == 1 {
|
|
|
|
format!("{} hour ago", duration.num_hours())
|
|
|
|
} else {
|
|
|
|
format!("{} hours ago", duration.num_hours())
|
|
|
|
}
|
|
|
|
} else if duration.num_minutes() > 0 {
|
|
|
|
if duration.num_minutes() == 1 {
|
|
|
|
format!("{} minute ago", duration.num_minutes())
|
|
|
|
} else {
|
|
|
|
format!("{} minutes ago", duration.num_minutes())
|
|
|
|
}
|
|
|
|
} else if duration.num_seconds() > 0 {
|
|
|
|
if duration.num_seconds() == 1 {
|
|
|
|
format!("{} second ago", duration.num_seconds())
|
|
|
|
} else {
|
|
|
|
format!("{} seconds ago", duration.num_seconds())
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
"now".to_owned()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn time_ago_short(time: DateTime<Utc>) -> String {
|
|
|
|
let duration = chrono::Utc::now() - time;
|
|
|
|
if let Some(years) =
|
|
|
|
duration
|
|
|
|
.num_days()
|
|
|
|
.checked_div(365)
|
|
|
|
.and_then(|years| if years > 0 { Some(years) } else { None })
|
|
|
|
{
|
|
|
|
format!("{}y", years)
|
|
|
|
} else if duration.num_weeks() > 0 {
|
|
|
|
format!("{}w", duration.num_weeks())
|
|
|
|
} else if duration.num_days() > 0 {
|
|
|
|
format!("{}d", duration.num_days())
|
|
|
|
} else if duration.num_hours() > 0 {
|
|
|
|
format!("{}h", duration.num_hours())
|
|
|
|
} else if duration.num_minutes() > 0 {
|
|
|
|
format!("{}m", duration.num_minutes())
|
|
|
|
} else if duration.num_seconds() > 0 {
|
|
|
|
format!("{}s", duration.num_seconds())
|
|
|
|
} else {
|
|
|
|
"now".to_owned()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn time(time: chrono::DateTime<chrono::Utc>) -> String {
|
|
|
|
time.format("%B %d, %Y, %I:%M %P").to_string()
|
|
|
|
}
|