Cleaned up documentation, refactored FromStr impl, and added Debug impl
for ByteUnit type
This commit is contained in:
parent
9bc0d7e758
commit
6d04507cb7
3 changed files with 26 additions and 62 deletions
|
@ -40,7 +40,7 @@ pub fn parse(s: &str) -> Result<(f64, f64, i8, bool), Error> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn arithmetic(input: (f64, f64, i8, bool)) -> (bool, i64) {
|
pub fn arithmetic<T>(input: (f64, f64, i8, bool)) -> (bool, T) where T: From<i64> {
|
||||||
let iec = input.3;
|
let iec = input.3;
|
||||||
let power_of = input.2;
|
let power_of = input.2;
|
||||||
let multiplier = input.1;
|
let multiplier = input.1;
|
||||||
|
@ -52,5 +52,5 @@ pub fn arithmetic(input: (f64, f64, i8, bool)) -> (bool, i64) {
|
||||||
power += 1;
|
power += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
(iec, value as i64)
|
(iec, T::from(value as i64))
|
||||||
}
|
}
|
||||||
|
|
62
src/lib.rs
62
src/lib.rs
|
@ -26,41 +26,14 @@ simplebyteunit = "0.2.0"
|
||||||
|
|
||||||
Generate a human-readable, formatted ByteUnit:
|
Generate a human-readable, formatted ByteUnit:
|
||||||
|
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
use simplebyteunit::simplebyteunit::*;
|
use simplebyteunit::simplebyteunit::*;
|
||||||
|
|
||||||
let byteunit_var = 500000.to_byteunit(SI);
|
let byteunit_var = 500000.to_byteunit(SI);
|
||||||
|
|
||||||
println!("{byteunit_var}");
|
assert_eq!(byteunit_var.to_string(), "500.00 kB");
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
500 kB
|
|
||||||
````
|
|
||||||
|
|
||||||
## Parsing strings into ByteUnits
|
|
||||||
|
|
||||||
And then you can parse formatted strings back into a ByteUnit
|
|
||||||
|
|
||||||
```rust
|
|
||||||
use simplebyteunit::simplebyteunit::*;
|
|
||||||
|
|
||||||
let byteunit_var: ByteUnit<i64> = "500 kB".into();
|
|
||||||
|
|
||||||
println!("{byteunit_var}");
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
500 kB
|
|
||||||
````
|
|
||||||
|
|
||||||
## Simple arithmetic operations
|
## Simple arithmetic operations
|
||||||
|
|
||||||
Addition, subtraction, multiplication, subtraction, and division are supported on this type.
|
Addition, subtraction, multiplication, subtraction, and division are supported on this type.
|
||||||
|
@ -68,18 +41,10 @@ Addition, subtraction, multiplication, subtraction, and division are supported o
|
||||||
```rust
|
```rust
|
||||||
use simplebyteunit::simplebyteunit::*;
|
use simplebyteunit::simplebyteunit::*;
|
||||||
|
|
||||||
let a: ByteUnit<i64> = ByteUnit::SI(5000000);
|
let a: ByteUnit<i64> = ByteUnit::SI(500000);
|
||||||
let b: ByteUnit<i64> = ByteUnit::SI(5000000);
|
let b: ByteUnit<i64> = ByteUnit::SI(500000);
|
||||||
let byteunit_sum = a + b;
|
|
||||||
|
|
||||||
println!("{byteunit_sum}");
|
assert_eq!(a + b, "1.0 MB".into());
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
1.0 MB
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Equal/and/or operations
|
## Equal/and/or operations
|
||||||
|
@ -91,17 +56,10 @@ use simplebyteunit::simplebyteunit::*;
|
||||||
|
|
||||||
let a: ByteUnit<i64> = "500 KiB".into();
|
let a: ByteUnit<i64> = "500 KiB".into();
|
||||||
let b: ByteUnit<i64> = "500 KiB".into();
|
let b: ByteUnit<i64> = "500 KiB".into();
|
||||||
let byteunit_bool = a == b;
|
|
||||||
|
|
||||||
println!("{byteunit_bool}");
|
|
||||||
|
|
||||||
|
assert_eq!(a == b, true);
|
||||||
```
|
```
|
||||||
|
|
||||||
Output:
|
|
||||||
```shell
|
|
||||||
true
|
|
||||||
````
|
|
||||||
|
|
||||||
Or operations are also supported on this type:
|
Or operations are also supported on this type:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
@ -109,17 +67,9 @@ use simplebyteunit::simplebyteunit::*;
|
||||||
|
|
||||||
let a: ByteUnit<i64> = 5000000.to_byteunit(IEC);
|
let a: ByteUnit<i64> = 5000000.to_byteunit(IEC);
|
||||||
let b: ByteUnit<i64> = 5000000.to_byteunit(IEC);
|
let b: ByteUnit<i64> = 5000000.to_byteunit(IEC);
|
||||||
let byteunit_bool = a >= b;
|
|
||||||
|
|
||||||
println!("{byteunit_bool}");
|
|
||||||
|
|
||||||
|
assert_eq!(a >= b, true);
|
||||||
```
|
```
|
||||||
|
|
||||||
Output:
|
|
||||||
```shell
|
|
||||||
true
|
|
||||||
```
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub mod simplebyteunit;
|
pub mod simplebyteunit;
|
||||||
|
|
|
@ -16,7 +16,7 @@ Fast, stupid simple ByteUnit implementation
|
||||||
Provides a simple way to encapsulate primitives as byteunits.
|
Provides a simple way to encapsulate primitives as byteunits.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::{fmt::{Display, Formatter},
|
use std::{fmt::{Display, Formatter, Debug},
|
||||||
ops::{Mul, Div, Add, Sub}, str::FromStr};
|
ops::{Mul, Div, Add, Sub}, str::FromStr};
|
||||||
use crate::{input, output};
|
use crate::{input, output};
|
||||||
|
|
||||||
|
@ -166,17 +166,31 @@ impl<T> Display for ByteUnit<T> where i64: From<T>, T: Copy {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&str> for ByteUnit<i64> where i64: From<i64>, i64: Copy {
|
/// Debug implementation with a maximum power of 6 (Exa/Exbi)
|
||||||
|
impl<T> Debug for ByteUnit<T> where i64: From<T>, T: Copy {
|
||||||
|
fn fmt(&self, f:&mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
let arithmetic = output::arithmetic(self.value(), MAX);
|
||||||
|
let bytes = arithmetic.1;
|
||||||
|
let index = arithmetic.0;
|
||||||
|
|
||||||
|
match index {
|
||||||
|
B => write!(f, "'{:.0} {}'", bytes, output::prefix(self, index)),
|
||||||
|
_ => write!(f, "'{:.2} {}'", bytes, output::prefix(self, index)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl <T>From<&str> for ByteUnit<T> where i64: From<T>, T: Copy, T: From<i64> {
|
||||||
fn from(value: &str) -> Self {
|
fn from(value: &str) -> Self {
|
||||||
ByteUnit::from_str(value).unwrap()
|
ByteUnit::from_str(value).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for ByteUnit<i64> where i64: From<i64>, i64: Copy {
|
impl <T>FromStr for ByteUnit<T> where i64: From<T>, T: Copy, i64: From<T>, T: From<i64> {
|
||||||
type Err = Error;
|
type Err = Error;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
let input = input::arithmetic(input::parse(s)?);
|
let input = input::arithmetic::<T>(input::parse(s)?);
|
||||||
|
|
||||||
match input.0 {
|
match input.0 {
|
||||||
true => Ok(ByteUnit::IEC(input.1)), false => Ok(ByteUnit::SI(input.1))
|
true => Ok(ByteUnit::IEC(input.1)), false => Ok(ByteUnit::SI(input.1))
|
||||||
|
|
Loading…
Reference in a new issue