From 544bd2ea087a50ab5e6f516a238d0f2e97394a4b Mon Sep 17 00:00:00 2001 From: keinsell Date: Fri, 3 Jan 2025 22:05:56 +0100 Subject: [PATCH] format floats in dosage strings Use correct approach into formatting float values during converting them to strings with up-scaling to complete values. --- Cargo.toml | 2 ++ src/lib/dosage.rs | 20 +++++++++++++++++--- src/view_model/ingestion.rs | 6 +++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cb117ffe..c0cf8159 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,8 @@ chrono-english = "0.1.7" clap-verbosity-flag = "3.0.1" clap_complete = "4.5.40" atty = "0.2.14" +ryu = "1.0.18" +float-pretty-print = "0.1.1" [dependencies.sea-orm-migration] version = "1.1.0" features = [ diff --git a/src/lib/dosage.rs b/src/lib/dosage.rs index c1ebedc3..4c692e69 100644 --- a/src/lib/dosage.rs +++ b/src/lib/dosage.rs @@ -1,11 +1,11 @@ -use measurements::Mass; +use clap::builder::TypedValueParser; +use float_pretty_print::PrettyPrintFloat; +use measurements::{Mass, Measurement}; use miette::IntoDiagnostic; use std::str::FromStr; pub type Dosage = Mass; -// TODO: This is not what it's meant to be, there is a still work needed on sane -// approach to automatic scaling of units. /// Function will take human-readable input as representation of mass of /// substance that was ingested (also referred as Dosage) pub fn parse_dosage(input: &str) -> miette::Result @@ -13,6 +13,14 @@ pub fn parse_dosage(input: &str) -> miette::Result Mass::from_str(input).into_diagnostic() } +pub fn format_dosage(input: &Dosage) -> miette::Result { + let suggested_unit = input.get_appropriate_units(); + let float = format!("{:4.4}", PrettyPrintFloat(suggested_unit.1)); + let unit = suggested_unit.0; + Ok(format!("{} {}", float.trim_start(), unit)) +} + + #[cfg(test)] mod tests { @@ -28,4 +36,10 @@ mod tests Mass::from_micrograms(100f64) ) } + + #[test] + fn test_print_dosage() { + let dosage = Mass::from_grams(0.1); + assert_eq!(format_dosage(&dosage).unwrap(), "100 mg"); + } } diff --git a/src/view_model/ingestion.rs b/src/view_model/ingestion.rs index d94a2380..70d2aa37 100644 --- a/src/view_model/ingestion.rs +++ b/src/view_model/ingestion.rs @@ -1,6 +1,8 @@ +use crate::lib::dosage::format_dosage; use crate::lib::dosage::Dosage; use crate::lib::orm::ingestion; use crate::lib::output::Formatter; +use core::convert::From; use measurements::Measurement; use serde::Deserialize; use serde::Serialize; @@ -26,11 +28,13 @@ impl From for ViewModel { fn from(model: ingestion::Model) -> Self { + let dosage = Dosage::from_base_units(model.dosage.into()); + Self::builder() .id(model.id) .substance_name(model.substance_name) .route(model.route_of_administration) - .dosage(Dosage::from_base_units(model.dosage as f64).to_string()) + .dosage(format_dosage(&dosage).unwrap()) .ingested_at(model.ingested_at.to_string()) .build() }