# Human Bandwidth
[](https://github.com/stack-rs/human-bandwidth)
[](https://crates.io/crates/human-bandwidth)
[](https://docs.rs/human-bandwidth)
[](https://github.com/stack-rs/human-bandwidth/blob/main/LICENSE)
A library providing human-readable format parsing and formatting for [bandwidth](https://crates.io/crates/bandwidth).
Enable `serde` feature for serde integration.
**MSRV**: 1.60
## Examples
More detailed usage can be found on [documentation](https://docs.rs/human-bandwidth).
For parsing and formatting:
```rust
use bandwidth::Bandwidth;
use human_bandwidth::Bandwidth;
fn main() {
// Parse bandwidth from human-readable string
// ------------------------------------------
// Parse bandwidth from integer format
assert_eq!(parse_bandwidth("9Tbps 420Gbps"), Ok(Bandwidth::new(9420, 0)));
assert_eq!(parse_bandwidth("32Mbps"), Ok(Bandwidth::new(0, 32_000_000)));
// Parse bandwidth from decimal format
assert_eq!(parse_bandwidth("150.024kbps"), Ok(Bandwidth::new(0, 150_024)));
// The fractional part less than 1bps will always be ignored
assert_eq!(parse_bandwidth("150.02456kbps"), Ok(Bandwidth::new(0, 150_024)));
// Format bandwidth to human-readable string
// -----------------------------------------
// By default, the bandwidth will be formatted to
// the highest unit possible in decimal format
let val1 = Bandwidth::new(9420, 0);
assert_eq!(format_bandwidth(val1).to_string(), "9.42Tbps");
let val2 = Bandwidth::new(0, 32_000_000);
assert_eq!(format_bandwidth(val2).to_string(), "32Mbps");
// To format bandwidth in integer format, enable the `display-integer` feature
let val1 = Bandwidth::new(9420, 0);
assert_eq!(format_bandwidth(val1).to_string(), "9Tbps 420Gbps");
let val2 = Bandwidth::new(0, 32_000_000);
assert_eq!(format_bandwidth(val2).to_string(), "32Mbps");
}
```
To integrate with `serde`:
```rust
use serde::{Serialize, Deserialize};
use bandwidth::Bandwidth;
#[derive(Serialize, Deserialize)]
struct Foo {
#[serde(with = "human_bandwidth::serde")]
bandwidth: Bandwidth,
}
fn main () {
let json = r#"{"bandwidth": "1kbps"}"#;
let foo = serde_json::from_str::<Foo>(json).unwrap();
assert_eq!(foo.bandwidth, Bandwidth::from_kbps(1));
let reverse = serde_json::to_string(&foo).unwrap();
assert_eq!(reverse, r#"{"bandwidth":"1kbps"}"#)
}
```
## Maintainer
[@BobAnkh](https://github.com/BobAnkh)
## How to contribute
You should follow our [Code of Conduct](/CODE_OF_CONDUCT.md).
See [CONTRIBUTING GUIDELINES](/CONTRIBUTING.md) for contributing conventions.
Make sure to pass all the tests before submitting your code.
### Contributors
## LICENSE
[Apache-2.0](LICENSE) © stack-rs
## Credits
- [humantime](https://github.com/tailhook/humantime)
- [humantime-serde](https://github.com/jean-airoldie/humantime-serde)