about summary refs log tree commit diff stats
path: root/crates/rocie-cli/src/handle/mod.rs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-06 18:31:40 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-06 18:31:40 +0200
commit1c09b0eb5db415985bfefb52786dbe48d757665e (patch)
treedb1cdbcff8baae9a73fca34e14b52cb8cf7ff230 /crates/rocie-cli/src/handle/mod.rs
parentfeat: Provide basic API frame (diff)
downloadserver-1c09b0eb5db415985bfefb52786dbe48d757665e.zip
feat: Provide basic barcode handling support
Diffstat (limited to 'crates/rocie-cli/src/handle/mod.rs')
-rw-r--r--crates/rocie-cli/src/handle/mod.rs148
1 files changed, 148 insertions, 0 deletions
diff --git a/crates/rocie-cli/src/handle/mod.rs b/crates/rocie-cli/src/handle/mod.rs
new file mode 100644
index 0000000..1d322f8
--- /dev/null
+++ b/crates/rocie-cli/src/handle/mod.rs
@@ -0,0 +1,148 @@
+use crate::cli::{ProductCommand, UnitCommand};
+
+use anyhow::{Context, Result};
+use rocie_client::{
+    apis::{
+        api_get_product_api::{product_by_id, products},
+        api_get_unit_api::{unit_by_id, units},
+        api_set_product_api::{associate_barcode, register_product},
+        api_set_unit_api::register_unit,
+        configuration::Configuration,
+    },
+    models::{Barcode, UnitAmount, UnitStub},
+};
+
+pub(crate) async fn product(config: &Configuration, command: ProductCommand) -> Result<()> {
+    match command {
+        ProductCommand::Register {
+            name,
+            description,
+            parent,
+        } => {
+            let new_id = register_product(
+                config,
+                rocie_client::models::ProductStub {
+                    description: Some(description), // TODO: Fix the duplicate option
+                    name,
+                    parent,
+                },
+            )
+            .await
+            .context("Failed to register new product")?;
+
+            println!("Registered new product with id: {new_id}");
+        }
+
+        ProductCommand::Get { id } => {
+            let product = product_by_id(config, id.to_string().as_str())
+                .await
+                .with_context(|| format!("Failed to get product with id: {id}"))?;
+
+            println!("{product:#?}");
+        }
+
+        ProductCommand::AssociateBarcode {
+            product_id,
+            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")?,
+
+        ProductCommand::List {} => {
+            let all = products(config)
+                .await
+                .context("Failed to get all products")?;
+
+            for product in all {
+                print!("{}: {}", product.name, product.id);
+
+                if let Some(description) = product
+                    .description
+                    .expect("Superflous Option wrapping in api")
+                {
+                    println!(" ({description})");
+                } else {
+                    println!();
+                }
+
+                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 {
+                            unit.full_name_singular
+                        } else {
+                            unit.full_name_plural
+                        }
+                    );
+                }
+            }
+        }
+    }
+    Ok(())
+}
+
+pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result<()> {
+    match command {
+        UnitCommand::Register {
+            full_name_singular,
+            full_name_plural,
+            short_name,
+            description,
+        } => {
+            let new_id = register_unit(
+                config,
+                UnitStub {
+                    description: Some(description),
+                    full_name_plural,
+                    full_name_singular,
+                    short_name,
+                },
+            )
+            .await
+            .context("Failed to register unit")?;
+            println!("Registered new unit with id: {new_id}");
+        }
+        UnitCommand::List {} => {
+            let all = units(config).await.context("Failed to get all products")?;
+
+            for unit in all {
+                print!("{}: {}", unit.full_name_singular, unit.id);
+
+                if let Some(description) =
+                    unit.description.expect("Superflous Option wrapping in api")
+                {
+                    println!(" ({description})");
+                } else {
+                    println!();
+                }
+            }
+        }
+        UnitCommand::GetById { id } => {
+            let unit = unit_by_id(config, id.to_string().as_str())
+                .await
+                .context("Failed to find unit")?;
+            println!(
+                "Unit: {} ({},{},{})",
+                unit.id, unit.full_name_singular, unit.full_name_plural, unit.short_name
+            );
+        }
+    }
+
+    Ok(())
+}