#arithmetic-operations #kubernetes #cncf

kube_quantity

kube_quantity is a library adding arithmetic operations to the Quantity type from the k8s-openapi crate

12 releases (7 breaking)

0.8.0 Sep 28, 2024
0.7.1 Feb 27, 2024
0.7.0 Sep 9, 2023
0.6.1 May 14, 2023
0.6.0 Mar 27, 2023

#145 in Algorithms

Download history 13/week @ 2024-07-29 17/week @ 2024-08-05 13/week @ 2024-08-12 282/week @ 2024-08-19 459/week @ 2024-08-26 577/week @ 2024-09-02 734/week @ 2024-09-09 528/week @ 2024-09-16 717/week @ 2024-09-23 551/week @ 2024-09-30 478/week @ 2024-10-07 443/week @ 2024-10-14 419/week @ 2024-10-21 918/week @ 2024-10-28 753/week @ 2024-11-04 900/week @ 2024-11-11

3,019 downloads per month
Used in git-remote-k8s

Apache-2.0

56KB
1K SLoC

kube_quantity - Kubernetes Quantity Parser

Crates.io

kube_quantity is a library adding arithmetic operations to the Quantity type from the k8s-openapi crate.

Installation

Run the following Cargo command in your project directory to add the latest stable version:

cargo add kube_quantity

Or add the following line to your Cargo.toml:

[dependencies]
kube_quantity = "0.8.0"

Upgrading

Please check the CHANGELOG when upgrading.

Usage

Parsing of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Parse from &str
let quantity = "1Ki";
let quantity: Result<ParsedQuantity, ParseQuantityError> = quantity.try_into();
assert_eq!(quantity.unwrap().to_string(), "1Ki");

// Parse from a String
let quantity = String::from("2Mi");
let quantity: Result<ParsedQuantity, ParseQuantityError> = quantity.try_into();
assert_eq!(quantity.unwrap().to_string(), "2Mi");

// Parse from a `k8s_openapi` Quantity
let quantity = Quantity("2.5Gi".to_string());
let quantity: Result<ParsedQuantity, ParseQuantityError> = quantity.try_into();
assert_eq!(quantity.unwrap().to_string(), "2.5Gi");

Addition of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("1Ki".to_string()).try_into();
let q2: Result<ParsedQuantity, ParseQuantityError> = Quantity("2Ki".to_string()).try_into();

// Add parsed quantities
let q3: ParsedQuantity = q1.unwrap() + q2.unwrap();
// Convert parsed quantity back into a k8s quantity
let q3: Quantity = q3.into();

assert_eq!(q3.0, "3Ki");
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("4.2Ki".to_string()).try_into();
let q2: Result<ParsedQuantity, ParseQuantityError> = Quantity("2.1Ki".to_string()).try_into();

// Add parsed quantities
let q3: ParsedQuantity = q1.unwrap() + q2.unwrap();
// Convert parsed quantity back into a k8s quantity
let q3: Quantity = q3.into();

assert_eq!(q3.0, "6.3Ki");
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("5M".to_string()).try_into();
let q2: Result<ParsedQuantity, ParseQuantityError> = Quantity("7M".to_string()).try_into();

let mut q1 = q1.unwrap();
q1 += q2.unwrap();

let q1: Quantity = q1.into();

assert_eq!(q1.0, "12M");

Multiplication of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("3k".to_string()).try_into();

// Multiply parsed quantities
let q1: ParsedQuantity = q1.unwrap() * 2;
// Convert parsed quantity back into a k8s quantity
let q2: Quantity = q1.into();

assert_eq!(q2.0, "6k");
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("3k".to_string()).try_into();
let mut q1: ParsedQuantity = q1.unwrap();

// Multiply parsed quantities
q1 *= 2;
// Convert parsed quantity back into a k8s quantity
let q2: Quantity = q1.into();

assert_eq!(q2.0, "6k");

Division of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("4k".to_string()).try_into();

// Multiply parsed quantities
let q1: ParsedQuantity = q1.unwrap() / 2;
// Convert parsed quantity back into a k8s quantity
let q2: Quantity = q1.into();

assert_eq!(q2.0, "2k");
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("3k".to_string()).try_into();
let mut q1: ParsedQuantity = q1.unwrap();

// Multiply parsed quantities
q1 /= 3;
// Convert parsed quantity back into a k8s quantity
let q2: Quantity = q1.into();

assert_eq!(q2.0, "1k");

Subtraction of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("1M".to_string()).try_into();
let q2: Result<ParsedQuantity, ParseQuantityError> = Quantity("500k".to_string()).try_into();

// Subtract parsed quantities
let q3: ParsedQuantity = q1.unwrap() - q2.unwrap();
// Convert parsed quantity back into a k8s quantity
let q3: Quantity = q3.into();

assert_eq!(q3.0, "500k");
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Try parsing k8s quantities
let q1: Result<ParsedQuantity, ParseQuantityError> = Quantity("10G".to_string()).try_into();
let q2: Result<ParsedQuantity, ParseQuantityError> = Quantity("500M".to_string()).try_into();

let mut q1 = q1.unwrap();
q1 -= q2.unwrap();

let q1: Quantity = q1.into();

assert_eq!(q1.0, "9500M");

Comparison of quantities

use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Parse directly from &str
let q1 = "5Ki";
let q1: Result<ParsedQuantity, ParseQuantityError> = q1.try_into();
let q1 = q1.unwrap();
assert_eq!(q1.to_string(), "5Ki");

// Parse from a `k8s_openapi` Quantity
let q2 = Quantity("2.5Gi".to_string());
let q2: Result<ParsedQuantity, ParseQuantityError> = q2.try_into();
let q2 = q2.unwrap();
assert_eq!(q2.to_string(), "2.5Gi");

// Compare byte amount equality
assert!(q1 < q2);
use k8s_openapi::apimachinery::pkg::api::resource::Quantity;
use kube_quantity::{ParseQuantityError, ParsedQuantity};

// Parse directly from &str
let q1 = "1Ki";
let q1: Result<ParsedQuantity, ParseQuantityError> = q1.try_into();
let q1 = q1.unwrap();
assert_eq!(q1.to_string(), "1Ki");

// Parse from a `k8s_openapi` Quantity
let q2 = Quantity("1024".to_string());
let q2: Result<ParsedQuantity, ParseQuantityError> = q2.try_into();
let q2 = q2.unwrap();
assert_eq!(q2.to_string(), "1024");

// Compare byte amount equality
assert_eq!(q1, q2);

License

Apache 2.0 licensed. See LICENSE for details.

Dependencies

~41MB
~663K SLoC