aboutsummaryrefslogtreecommitdiffstats
path: root/crates/rocie-cli/src
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-23 08:33:06 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-23 08:34:45 +0200
commit2dc74d621399be454abbbff892fb46204ddc6e7b (patch)
treef9525527fc09c465d4e2e4a4f665bfd444b889f8 /crates/rocie-cli/src
parentfeat: Provide basic barcode handling support (diff)
downloadserver-2dc74d621399be454abbbff892fb46204ddc6e7b.zip
feat(treewide): Add tests and barcode buying/consuming
Diffstat (limited to 'crates/rocie-cli/src')
-rw-r--r--crates/rocie-cli/src/cli.rs32
-rw-r--r--crates/rocie-cli/src/handle/mod.rs84
-rw-r--r--crates/rocie-cli/src/main.rs1
3 files changed, 102 insertions, 15 deletions
diff --git a/crates/rocie-cli/src/cli.rs b/crates/rocie-cli/src/cli.rs
index 3f2662b..29c284f 100644
--- a/crates/rocie-cli/src/cli.rs
+++ b/crates/rocie-cli/src/cli.rs
@@ -20,6 +20,12 @@ pub(crate) enum Command {
#[command(subcommand)]
command: UnitCommand,
},
+
+ /// Deal with Barcodes
+ Barcode {
+ #[command(subcommand)]
+ command: BarcodeCommand,
+ },
}
#[derive(Subcommand)]
@@ -58,6 +64,32 @@ pub(crate) enum UnitCommand {
}
#[derive(Subcommand)]
+#[expect(variant_size_differences, reason = "It's just a testing cli")]
+pub(crate) enum BarcodeCommand {
+ /// Buy an barcode
+ Buy {
+ /// The numeric value of the barcode
+ #[arg(short, long)]
+ id: u32,
+ },
+
+ /// Consume an barcode
+ Consume {
+ /// The numeric value of the barcode
+ #[arg(short, long)]
+ id: u32,
+
+ /// The amount to consume
+ #[arg(short, long)]
+ amount: u32,
+
+ /// The unit of the consumed amount
+ #[arg(short, long)]
+ unit_id: Uuid,
+ },
+}
+
+#[derive(Subcommand)]
pub(crate) enum ProductCommand {
/// Register a new product
Register {
diff --git a/crates/rocie-cli/src/handle/mod.rs b/crates/rocie-cli/src/handle/mod.rs
index 1d322f8..c39f7b1 100644
--- a/crates/rocie-cli/src/handle/mod.rs
+++ b/crates/rocie-cli/src/handle/mod.rs
@@ -1,10 +1,12 @@
-use crate::cli::{ProductCommand, UnitCommand};
+use crate::cli::{BarcodeCommand, ProductCommand, UnitCommand};
use anyhow::{Context, Result};
use rocie_client::{
apis::{
+ api_get_inventory_api::amount_by_id,
api_get_product_api::{product_by_id, products},
api_get_unit_api::{unit_by_id, units},
+ api_set_barcode_api::{buy_barcode, consume_barcode},
api_set_product_api::{associate_barcode, register_product},
api_set_unit_api::register_unit,
configuration::Configuration,
@@ -46,19 +48,29 @@ pub(crate) async fn product(config: &Configuration, command: ProductCommand) ->
barcode_number,
amount_value,
amount_unit_id,
- } => associate_barcode(
- config,
- product_id.to_string().as_str(),
- Barcode {
- id: i64::from(barcode_number),
- amount: Box::new(UnitAmount {
- unit: amount_unit_id,
- value: i64::from(amount_value),
- }),
- },
- )
- .await
- .context("Failed to associated barcode")?,
+ } => {
+ associate_barcode(
+ config,
+ product_id.to_string().as_str(),
+ Barcode {
+ id: i32::try_from(barcode_number).unwrap(),
+ amount: Box::new(UnitAmount {
+ unit: amount_unit_id,
+ value: i64::from(amount_value),
+ }),
+ },
+ )
+ .await
+ .context("Failed to associated barcode")?;
+
+ let unit = unit_by_id(config, amount_unit_id.to_string().as_str()).await?;
+ let product = product_by_id(config, product_id.to_string().as_str()).await?;
+
+ println!(
+ "Associated barcode ({barcode_number} - {amount_value} {}) with product: {} ",
+ unit.short_name, product.name
+ );
+ }
ProductCommand::List {} => {
let all = products(config)
@@ -68,6 +80,19 @@ pub(crate) async fn product(config: &Configuration, command: ProductCommand) ->
for product in all {
print!("{}: {}", product.name, product.id);
+ {
+ let product_amount = amount_by_id(config, product.id.to_string().as_str())
+ .await
+ .with_context(|| {
+ format!("Failed to get amount of product: {}", product.id)
+ })?;
+
+ let unit =
+ unit_by_id(config, product_amount.amount.unit.to_string().as_str()).await?;
+
+ print!(" available: {} {}", product_amount.amount.value, unit.short_name);
+ }
+
if let Some(description) = product
.description
.expect("Superflous Option wrapping in api")
@@ -77,11 +102,15 @@ pub(crate) async fn product(config: &Configuration, command: ProductCommand) ->
println!();
}
+ if !product.associated_bar_codes.is_empty() {
+ println!(" Barcodes:");
+ }
+
for barcode in product.associated_bar_codes {
let unit = unit_by_id(config, barcode.amount.unit.to_string().as_str()).await?;
println!(
- " - {}: {} {}",
+ " - {}: {} {}",
barcode.id,
barcode.amount.value,
if barcode.amount.value == 1 {
@@ -97,6 +126,31 @@ pub(crate) async fn product(config: &Configuration, command: ProductCommand) ->
Ok(())
}
+pub(crate) async fn barcode(config: &Configuration, command: BarcodeCommand) -> Result<()> {
+ match command {
+ BarcodeCommand::Buy { id } => {
+ buy_barcode(config, i32::try_from(id).unwrap()).await?;
+ }
+ BarcodeCommand::Consume {
+ id,
+ amount,
+ unit_id,
+ } => {
+ consume_barcode(
+ config,
+ i32::try_from(id).unwrap(),
+ UnitAmount {
+ unit: unit_id,
+ value: i64::from(amount),
+ },
+ )
+ .await?;
+ }
+ }
+
+ Ok(())
+}
+
pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result<()> {
match command {
UnitCommand::Register {
diff --git a/crates/rocie-cli/src/main.rs b/crates/rocie-cli/src/main.rs
index ef81ad9..e3188c8 100644
--- a/crates/rocie-cli/src/main.rs
+++ b/crates/rocie-cli/src/main.rs
@@ -17,6 +17,7 @@ async fn main() -> Result<()> {
match args.command {
Command::Product { command } => handle::product(&config, command).await?,
Command::Unit { command } => handle::unit(&config, command).await?,
+ Command::Barcode { command } => handle::barcode(&config, command).await?,
}
Ok(())