bobashare_web/views/
filters.rs

1use askama::Result;
2use chrono::TimeDelta;
3use humansize::format_size;
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
14pub fn humanduration(duration: &TimeDelta) -> Result<String> {
15    let duration = *duration;
16    if duration < TimeDelta::try_minutes(1).unwrap() {
17        let seconds = duration.num_seconds();
18        return Ok(format!("{} {}", seconds, pluralize("second", seconds)));
19    }
20    if duration < TimeDelta::try_hours(1).unwrap() {
21        let minutes = duration.num_minutes();
22        return Ok(format!("{} {}", minutes, pluralize("minute", minutes)));
23    }
24    if duration < TimeDelta::try_days(1).unwrap() {
25        let hours = duration.num_hours();
26        return Ok(format!("{} {}", hours, pluralize("hour", hours)));
27    }
28    // using weeks is dumb, let's use days up until a month
29    if duration < TimeDelta::try_days(30).unwrap() {
30        let days = duration.num_days();
31        return Ok(format!("{} {}", days, pluralize("day", days)));
32    }
33    // I think most people would assume a month is about 30 days
34    let months = duration.num_days() / 30;
35    Ok(format!("{} {}", months, pluralize("month", months)))
36    // probably no point going past months
37}
38
39pub fn humansize(size: &u64) -> Result<String> {
40    Ok(format_size(*size, humansize::BINARY))
41}