| 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 | |