aboutsummaryrefslogtreecommitdiffstats
path: root/crates/rocie-cli/src/handle
diff options
context:
space:
mode:
Diffstat (limited to 'crates/rocie-cli/src/handle')
-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(())
+}