From d45cc8fab35501b6c16f68cac084d861539a3f83 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Wed, 8 Oct 2025 12:01:47 +0200 Subject: feat(crates/rocie-cli): Add support for unit-properties --- crates/rocie-cli/src/cli.rs | 44 +++++++++++++++++++++++++- crates/rocie-cli/src/handle/mod.rs | 65 ++++++++++++++++++++++++++++++++++++-- crates/rocie-cli/src/main.rs | 1 + 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/crates/rocie-cli/src/cli.rs b/crates/rocie-cli/src/cli.rs index 29c284f..a84ab0e 100644 --- a/crates/rocie-cli/src/cli.rs +++ b/crates/rocie-cli/src/cli.rs @@ -15,12 +15,18 @@ pub(crate) enum Command { command: ProductCommand, }, - /// Deal with products + /// Deal with units Unit { #[command(subcommand)] command: UnitCommand, }, + /// Deal with unit properties + UnitProperty { + #[command(subcommand)] + command: UnitPropertyCommand, + }, + /// Deal with Barcodes Barcode { #[command(subcommand)] @@ -50,6 +56,10 @@ pub(crate) enum UnitCommand { /// Optional description of the new unit #[arg(short, long)] description: Option, + + /// The id of the unit property this unit measures. + #[arg(short, long)] + unit_property: Uuid, }, /// Fetch an unit based on id @@ -63,6 +73,34 @@ pub(crate) enum UnitCommand { List {}, } +#[derive(Subcommand)] +pub(crate) enum UnitPropertyCommand { + /// Register a new unit + Register { + /// The name of the new unit property + /// + /// E.g.: + /// - Mass + /// - Volume + #[arg(short = 'n', long)] + name: String, + + /// Optional description of the new unit property + #[arg(short, long)] + description: Option, + }, + + /// Fetch an unit property based on id + GetById { + /// The id of the unit property + #[arg(short, long)] + id: Uuid, + }, + + /// List all available unit properties + List {}, +} + #[derive(Subcommand)] #[expect(variant_size_differences, reason = "It's just a testing cli")] pub(crate) enum BarcodeCommand { @@ -104,6 +142,10 @@ pub(crate) enum ProductCommand { /// Optional parent of the new product #[arg(short, long)] parent: Option, + + /// The id of the unit property this product is measured in. + #[arg(short, long)] + unit_property: Uuid, }, AssociateBarcode { diff --git a/crates/rocie-cli/src/handle/mod.rs b/crates/rocie-cli/src/handle/mod.rs index fc6f137..101f56d 100644 --- a/crates/rocie-cli/src/handle/mod.rs +++ b/crates/rocie-cli/src/handle/mod.rs @@ -1,4 +1,4 @@ -use crate::cli::{BarcodeCommand, ProductCommand, UnitCommand}; +use crate::cli::{BarcodeCommand, ProductCommand, UnitCommand, UnitPropertyCommand}; use anyhow::{Context, Result}; use rocie_client::{ @@ -6,12 +6,17 @@ use rocie_client::{ api_get_inventory_api::amount_by_id, api_get_product_api::{product_by_id, products}, api_get_unit_api::{unit_by_id, units}, + api_get_unit_property_api::{unit_properties, unit_property_by_id}, api_set_barcode_api::{buy_barcode, consume_barcode}, api_set_product_api::{associate_barcode, register_product}, api_set_unit_api::register_unit, + api_set_unit_property_api::register_unit_property, configuration::Configuration, }, - models::{Barcode, BarcodeId, ProductId, UnitAmount, UnitId, UnitStub}, + models::{ + Barcode, BarcodeId, ProductId, UnitAmount, UnitId, UnitPropertyId, UnitPropertyStub, + UnitStub, + }, }; pub(crate) async fn product(config: &Configuration, command: ProductCommand) -> Result<()> { @@ -20,12 +25,16 @@ pub(crate) async fn product(config: &Configuration, command: ProductCommand) -> name, description, parent, + unit_property, } => { let new_id = register_product( config, rocie_client::models::ProductStub { description: Some(description), // TODO: Fix the duplicate option name, + unit_property: UnitPropertyId { + value: unit_property, + }, parent: Some(parent.map(|p| ProductId { value: p })), }, ) @@ -169,6 +178,7 @@ pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result full_name_plural, short_name, description, + unit_property, } => { let new_id = register_unit( config, @@ -177,6 +187,9 @@ pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result full_name_plural, full_name_singular, short_name, + unit_property: UnitPropertyId { + value: unit_property, + }, }, ) .await @@ -184,7 +197,7 @@ pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result println!("Registered new unit with id: {new_id}"); } UnitCommand::List {} => { - let all = units(config).await.context("Failed to get all products")?; + let all = units(config).await.context("Failed to get all units")?; for unit in all { print!("{}: {}", unit.full_name_singular, unit.id); @@ -211,3 +224,49 @@ pub(crate) async fn unit(config: &Configuration, command: UnitCommand) -> Result Ok(()) } + +pub(crate) async fn unit_property( + config: &Configuration, + command: UnitPropertyCommand, +) -> Result<()> { + match command { + UnitPropertyCommand::Register { name, description } => { + let new_id = register_unit_property( + config, + UnitPropertyStub { + description: Some(description), + name, + }, + ) + .await + .context("Failed to register unit property")?; + println!("Registered new unit property with id: {new_id}"); + } + UnitPropertyCommand::List {} => { + let all = unit_properties(config) + .await + .context("Failed to get all unit properties")?; + + for unit_prop in all { + print!("{}: {}", unit_prop.name, unit_prop.id); + + if let Some(description) = unit_prop + .description + .expect("Superflous Option wrapping in api") + { + println!(" ({description})"); + } else { + println!(); + } + } + } + UnitPropertyCommand::GetById { id } => { + let unit = unit_property_by_id(config, UnitPropertyId { value: id }) + .await + .context("Failed to find unit property")?; + println!("Unit property: {} ({})", unit.id, unit.name); + } + } + + Ok(()) +} diff --git a/crates/rocie-cli/src/main.rs b/crates/rocie-cli/src/main.rs index e3188c8..26e0f62 100644 --- a/crates/rocie-cli/src/main.rs +++ b/crates/rocie-cli/src/main.rs @@ -18,6 +18,7 @@ async fn main() -> Result<()> { Command::Product { command } => handle::product(&config, command).await?, Command::Unit { command } => handle::unit(&config, command).await?, Command::Barcode { command } => handle::barcode(&config, command).await?, + Command::UnitProperty { command } => handle::unit_property(&config, command).await?, } Ok(()) -- cgit 1.4.1