1 | #![no_std ]
|
2 | /*!
|
3 | # **Humansize**
|
4 |
|
5 | ## Features
|
6 | Humansize is a humanization library for information size that is:
|
7 | - Simple & convenient to use
|
8 | - Customizable
|
9 | - Supports byte or bit sizes
|
10 | - `no-std`
|
11 | - Optionally non-allocating
|
12 | - Optionally accepts signed values
|
13 |
|
14 | ## How to use it...
|
15 |
|
16 | Add humansize as a dependency to your project's `cargo.toml`:
|
17 | ```toml
|
18 | [dependencies]
|
19 | ...
|
20 | humansize = "2.0.0"
|
21 | ```
|
22 |
|
23 | ### ... to easily format a size:
|
24 |
|
25 | 1. Import the `format_size` function as well as your preferred set of defaults:
|
26 | - `DECIMAL` (SI)
|
27 | - `BINARY` (IEC)
|
28 | - `WINDOWS` (IEC values but SI units)
|
29 | 2. Call `format_size` with an unsigned integer
|
30 |
|
31 | ```rust
|
32 | use humansize::{format_size, DECIMAL};
|
33 |
|
34 | let size = 1_000_000u64;
|
35 | let res: String = format_size(size, DECIMAL);
|
36 |
|
37 | assert_eq!(&res, "1 MB" );
|
38 |
|
39 | ```
|
40 |
|
41 | ### ... to format many sizes:
|
42 | To improve reusability, you can use `create_format`, which returns a formatter function akin to `format_size` but with the options argument curried so it doesn't need to be specified again:
|
43 |
|
44 | ```rust
|
45 | use humansize::{make_format, DECIMAL};
|
46 |
|
47 | let formatter = make_format(DECIMAL);
|
48 |
|
49 | assert_eq!(formatter(1_000_000u64), "1 MB" );
|
50 | assert_eq!(formatter(1_000_000_000u64), "1 GB" );
|
51 | //...
|
52 |
|
53 | ```
|
54 |
|
55 | ### ... to avoid allocation:
|
56 | Specify the `no_alloc` feature flag in your project's `cargo.toml`:
|
57 | ```toml
|
58 | [dependencies]
|
59 | ...
|
60 | humansize = { version = "2.0.0", features = ["no_alloc"] }
|
61 | ```
|
62 | This excludes all allocating code from compilation. You may now use the library's internal `SizeFormatter` struct, which implements `core::fmt::display` so that you can `write!` it to a custom buffer of your choice:
|
63 | ```rust
|
64 | use humansize::{SizeFormatter, DECIMAL};
|
65 |
|
66 | let formatter = SizeFormatter::new(1_000_000usize, DECIMAL);
|
67 | assert_eq!(format!("{}" , formatter), "1 MB" );
|
68 | ```
|
69 | ### ... with the `impl` style API:
|
70 | For stylistic reasons, you may prefer to use the impl-style API of earlier versions of the crate.
|
71 | To do so, specify the `impl-style` feature flag in your project's `cargo.toml`:
|
72 |
|
73 | ```toml
|
74 | [dependencies]
|
75 | ...
|
76 | humansize = { version = "2.0.0", features = ["impl_style"] }
|
77 | ```
|
78 | Enabling this feature makes two methods available:
|
79 | - `format_size` on unsigned integers types
|
80 | - `format_size_i` on signed integer types.
|
81 |
|
82 | To use it, bring the FormatSize trait into scope and call its method on an integer type:
|
83 | ```ignore
|
84 | use humansize::{FormatSize, FormatSizeI DECIMAL};
|
85 |
|
86 | assert_eq!(1_000_000u64.format_size(DECIMAL), "1 MB" );
|
87 | assert_eq!((-1_000_000).format_size_i(DECIMAL), "-1 MB" );
|
88 | ```
|
89 | ### ... to further customize the output:
|
90 | Humansize exports three default option sets:
|
91 | * `Decimal`: kilo = 1000, unit format is `XB`.
|
92 | * `Binary`: kilo = 1024, unit format is `XiB`.
|
93 | * `WINDOWS` (Windows): kilo = 1024, unit format is `XB`.
|
94 |
|
95 | The formatting can be further customized by providing providing your own option set. See the documentation of the `FormatSizeOptions` struct to see all the addressable parameters, and [this example](examples/custom_options.rs) for its usage.
|
96 |
|
97 | ### ... to accept negative values:
|
98 | The solutions presented above only accept unsigned integer types as input (`usize`, `8`, `u16`, `u32` and `u64`). If however accepting negative values is correct for your application, a signed alternative exists for each of them that will accept signed integer types, and format them accordingly if negative:
|
99 |
|
100 | - `format_size` : `format_size_i`
|
101 | - `create_format` : `create_format_i`
|
102 | - `FormatSize` trait : `FormatSizeI` trait
|
103 | - `SizeFormatter` : `ISizeFormatter`
|
104 | ```rust
|
105 | use humansize::{format_size_i, make_format_i, ISizeFormatter, DECIMAL};
|
106 |
|
107 | assert_eq!(&format_size_i(-1_000_000, DECIMAL), "-1 MB" );
|
108 |
|
109 | let signed_formatter = make_format_i(DECIMAL);
|
110 | assert_eq!(&signed_formatter(-1_000_000), "-1 MB" );
|
111 |
|
112 | // With the `impl-style` feature enabled:
|
113 | // use humansize::FormatSizeI;
|
114 | // assert_eq(-1_000_000.format_size(DECIMAL), "-1 MB");
|
115 |
|
116 | let signed_size_formatter = ISizeFormatter::new(-1_000_000, DECIMAL);
|
117 | assert_eq!(format!("{}" , signed_size_formatter), "-1 MB" );
|
118 |
|
119 | ```
|
120 | */
|
121 |
|
122 | #[macro_use ]
|
123 | #[cfg (not(feature = "no_alloc" ))]
|
124 | extern crate alloc;
|
125 | extern crate libm;
|
126 |
|
127 | mod options;
|
128 | pub use options::{BaseUnit, FixedAt, FormatSizeOptions, Kilo, BINARY, DECIMAL, WINDOWS};
|
129 |
|
130 | mod numeric_traits;
|
131 | pub use numeric_traits::{Signed, ToF64, Unsigned};
|
132 |
|
133 | mod scales;
|
134 | mod utils;
|
135 |
|
136 | #[cfg (not(feature = "no_alloc" ))]
|
137 | mod allocating;
|
138 | #[cfg (not(feature = "no_alloc" ))]
|
139 | pub use allocating::*;
|
140 |
|
141 | #[cfg (feature = "impl_style" )]
|
142 | mod impl_style;
|
143 | #[cfg (feature = "impl_style" )]
|
144 | pub use impl_style::{FormatSize, FormatSizeI};
|
145 |
|
146 | mod formatters;
|
147 | pub use formatters::{SizeFormatter, ISizeFormatter};
|
148 | |