aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared/src
diff options
context:
space:
mode:
authorLibravatar youmouse <maklins08@.gmail.com>2018-11-16 18:55:36 +0100
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2018-11-16 20:25:41 +0100
commit768c571f9d8be06ad6dae4b961fcf7070e73edbd (patch)
treeebed494cbb91a7bccc0859a4d28f2d6970c12bdf /askama_shared/src
parentc7fe975b27f35202365b7b30f1262b99ed3af271 (diff)
downloadaskama-768c571f9d8be06ad6dae4b961fcf7070e73edbd.tar.gz
askama-768c571f9d8be06ad6dae4b961fcf7070e73edbd.tar.bz2
askama-768c571f9d8be06ad6dae4b961fcf7070e73edbd.zip
Add filesizeformat filter
Diffstat (limited to 'askama_shared/src')
-rw-r--r--askama_shared/src/filters/mod.rs19
-rw-r--r--askama_shared/src/lib.rs1
2 files changed, 19 insertions, 1 deletions
diff --git a/askama_shared/src/filters/mod.rs b/askama_shared/src/filters/mod.rs
index 35166ff..672c5b3 100644
--- a/askama_shared/src/filters/mod.rs
+++ b/askama_shared/src/filters/mod.rs
@@ -12,6 +12,7 @@ pub use self::json::json;
use askama_escape::MarkupDisplay;
use error::Error::Fmt;
+use humansize::{file_size_opts, FileSize};
use num_traits::cast::NumCast;
use num_traits::Signed;
use std::fmt;
@@ -22,12 +23,13 @@ use super::Result;
// Askama or should refer to a local `filters` module. It should contain all the
// filters shipped with Askama, even the optional ones (since optional inclusion
// in the const vector based on features seems impossible right now).
-pub const BUILT_IN_FILTERS: [&str; 21] = [
+pub const BUILT_IN_FILTERS: [&str; 22] = [
"abs",
"capitalize",
"center",
"e",
"escape",
+ "filesizeformat",
"format",
"indent",
"into_f64",
@@ -77,6 +79,12 @@ where
escape(i)
}
+/// Returns adequate string representation (in KB, ..) of number of bytes
+pub fn filesizeformat(b: usize) -> Result<String> {
+ b.file_size(file_size_opts::DECIMAL)
+ .map_err(|_| Fmt(fmt::Error))
+}
+
/// Formats arguments according to the specified format
///
/// The first argument to this filter must be a string literal (as in normal
@@ -268,6 +276,15 @@ mod tests {
use std::f64::INFINITY;
#[test]
+ fn test_filesizeformat() {
+ assert_eq!(filesizeformat(0).unwrap(), "0 B");
+ assert_eq!(filesizeformat(999).unwrap(), "999 B");
+ assert_eq!(filesizeformat(1000).unwrap(), "1 KB");
+ assert_eq!(filesizeformat(1023).unwrap(), "1.02 KB");
+ assert_eq!(filesizeformat(1024).unwrap(), "1.02 KB");
+ }
+
+ #[test]
fn test_linebreaks() {
assert_eq!(
linebreaks(&"Foo\nBar Baz").unwrap(),
diff --git a/askama_shared/src/lib.rs b/askama_shared/src/lib.rs
index 9e2ba6c..a8839fa 100644
--- a/askama_shared/src/lib.rs
+++ b/askama_shared/src/lib.rs
@@ -1,6 +1,7 @@
#![cfg_attr(feature = "cargo-clippy", allow(unused_parens))]
extern crate askama_escape;
+extern crate humansize;
extern crate num_traits;
extern crate serde;
#[macro_use]