Skip to main content

bobashare_web/views/
filters.rs

1use ::humansize::format_size;
2use askama::Result;
3use chrono::TimeDelta;
4
5fn pluralize(input: &str, count: i64) -> String {
6    if count == 1 {
7        input.to_string()
8    } else {
9        input.to_string() + "s"
10    }
11}
12
13// TODO: this would be nice and easy to test
14#[askama::filter_fn]
15pub fn humanduration(duration: &TimeDelta, _: &dyn askama::Values) -> Result<String> {
16    let duration = *duration;
17    if duration < TimeDelta::try_minutes(1).unwrap() {
18        let seconds = duration.num_seconds();
19        return Ok(format!("{} {}", seconds, pluralize("second", seconds)));
20    }
21    if duration < TimeDelta::try_hours(1).unwrap() {
22        let minutes = duration.num_minutes();
23        return Ok(format!("{} {}", minutes, pluralize("minute", minutes)));
24    }
25    if duration < TimeDelta::try_days(1).unwrap() {
26        let hours = duration.num_hours();
27        return Ok(format!("{} {}", hours, pluralize("hour", hours)));
28    }
29    // using weeks is dumb, let's use days up until a month
30    if duration < TimeDelta::try_days(30).unwrap() {
31        let days = duration.num_days();
32        return Ok(format!("{} {}", days, pluralize("day", days)));
33    }
34    // I think most people would assume a month is about 30 days
35    let months = duration.num_days() / 30;
36    Ok(format!("{} {}", months, pluralize("month", months)))
37    // probably no point going past months
38}
39
40#[askama::filter_fn]
41pub fn humansize(size: &u64, _: &dyn askama::Values) -> Result<String> {
42    Ok(format_size(*size, ::humansize::BINARY))
43}