1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//! Human-friendly display library.
//!
//! This module provides a convenient, uniform way to display various types of quantities
//! in approximate, human-readable format.  For example:
//!
//! ```
//! # use friendly::bytes;
//! let kb = format!("{}", bytes(13200));
//! assert_eq!(kb.as_str(), "12.89 KiB")
//! ```
//!
//! The various functions provide quick ways to wrap values and types in the appropriate
//! objects to facilitate their display. Types such as [Quantity] then provide methods to
//! further customize this presentation.
//!
//! ## Features
//!
//! This crate supports some features:
//!
//! - `chrono` — enables support for types from the Chrono crate (currently just [chrono::Duration])

pub mod scale;
pub mod sigfig;
pub mod quantity;
pub mod temporal;

pub use quantity::Quantity;
pub use scale::{Scale};
pub use temporal::{duration, seconds};

use quantity::QVal;

/// Display a number of bytes.
///
/// By default, this uses binary prefixes:
///
/// ```
/// # use friendly::bytes;
/// let kb = format!("{}", bytes(13200));
/// assert_eq!(kb.as_str(), "12.89 KiB")
/// ```
///
/// You can also use decimal prefixes:
///
/// ```
/// # use friendly::bytes;
/// # use friendly::scale::*;
/// let kb = format!("{}", bytes(13200).scale(Decimal::AUTO));
/// assert_eq!(kb.as_str(), "13.20 kB")
/// ```
pub fn bytes<V: QVal>(val: V) -> Quantity<V, scale::Binary> {
  Quantity::binary(val).suffix("B")
}

/// An ordinary auto-scaled value.
pub fn scalar<V: QVal>(val: V) -> Quantity<V, scale::Decimal> {
  Quantity::decimal(val)
}