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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// Copyright 2026 FastLabs Developers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! This crate provides multiple semantic wrappers and utilities for byte size representations.
//!
//! # Features
//!
//! * `#![no_std]`-capable, no heap allocation, and no runtime dependencies by default.
//! * Generic [`ByteSize`] wrappers over supported unsigned integer base types, with [`BSize`] as
//! the `usize` alias and [`BSize8`], [`BSize16`], [`BSize32`], and [`BSize64`] as shorter aliases
//! for fixed-width base types.
//! * `FromStr` impl for `ByteSize`, allowing for parsing string size representations like "1.5 KiB"
//! and "521 TB".
//! * [`Display`] impl for `ByteSize`, allowing for formatting byte sizes as human-readable strings
//! in both binary (e.g., "1.5 MiB") and decimal (e.g., "1.5 MB") styles.
//! * Optional `serde` support for binary and human-readable format.
//! * Optional `nightly` support for a broader const-friendly API surface powered by nightly-only
//! Rust features.
//!
//! # Nightly
//!
//! With the `nightly` feature enabled on a nightly compiler, this crate can use unstable Rust
//! capabilities such as const trait support. The visible effect is a broader const surface for
//! generic byte-size expressions, including unit helpers and simple transformations over the
//! underlying byte count. Because this follows Rust nightly, exact capabilities may evolve with
//! upstream language features.
//!
//! # Examples
//!
//! Construction using the binary or decimal constant helpers.
//!
//! ```
//! use bsize::BSize;
//!
//! assert!(BSize::kib(4) > BSize::kb(4));
//!
//! let size: BSize = BSize::b(4_096);
//! assert_eq!(size.0, 4_096);
//! ```
//!
//! Parse byte sizes from strings.
//!
//! ```
//! use bsize::BSize64;
//!
//! let size: BSize64 = "1.5 MiB".parse().unwrap();
//!
//! assert_eq!(BSize64::mib(1).map(|bytes| bytes + 512 * 1024), size);
//! ```
//!
//! Display as human-readable string.
//!
//! ```
//! use bsize::BSize;
//! use bsize::DisplayBaseUnit;
//! use bsize::DisplayOptions;
//! use bsize::DisplayScale;
//!
//! assert_eq!("518.0 GiB", BSize::gib(518).display().binary().to_string());
//!
//! assert_eq!("556.2 GB", BSize::gib(518).display().decimal().to_string());
//!
//! let network_units = DisplayOptions::DECIMAL
//! .base_unit(DisplayBaseUnit::Bit)
//! .scale(DisplayScale::Mega);
//! let display = bsize::display(125_000u64).options(|_opts| network_units);
//! assert_eq!("1.0 Mbit", display.to_string());
//! ```
//!
//! Arithmetic operations are supported.
//!
//! ```
//! use bsize::BSize;
//!
//! let plus = BSize::mb(1) + BSize::kb(100);
//! println!("{plus}");
//!
//! let minus = BSize::tb(1) - BSize::gb(4);
//! assert_eq!(BSize::gb(996), minus);
//! ```
//!
//! Arithmetic operations over the underlying types are supported.
//!
//!```
//! use bsize::BSize;
//!
//! let size = BSize::mb(1);
//! let size = size.map(|b| b * 4); // 4x scale
//! println!("{size}");
//! ```
// no-alloc; only used for tests
extern crate alloc;
pub use Display;
pub use DisplayBaseUnit;
pub use DisplayOptions;
pub use DisplayScale;
pub use DisplayUnitSystem;
pub use display;
pub use ParseError;
pub use BaseByteSize;
pub use ExaByteSize;
pub use GigaByteSize;
pub use KiloByteSize;
pub use MegaByteSize;
pub use PetaByteSize;
pub use TeraByteSize;
pub use BSize;
pub use BSize8;
pub use BSize16;
pub use BSize32;
pub use BSize64;
pub use ByteSize;