From 70c66bfaceee933a26990606d27e861a3f791e7a Mon Sep 17 00:00:00 2001 From: keinsell Date: Wed, 8 Jan 2025 20:44:11 +0100 Subject: [PATCH] refactor command to cli module Moved all files and logic under `command` to a new `cli` module, aligning structure with CLI-specific functionality. Adjusted imports and references accordingly to ensure compatibility. --- Cargo.toml | 1 - docs/assets/log_ingestion_preview.png | Bin 61428 -> 53631 bytes resources/small.flf | 569 ------------------ src/{lib => cli}/formatter.rs | 2 +- .../ingestion/delete_ingestion.rs | 9 +- src/cli/ingestion/list_ingestions.rs | 46 ++ .../ingestion/log_ingestion.rs | 34 +- .../ingestion.rs => cli/ingestion/mod.rs} | 55 +- .../ingestion/update_ingestion.rs | 22 +- src/cli/mod.rs | 128 ++++ .../substance/get_substance.rs | 16 +- src/cli/substance/mod.rs | 62 ++ src/command/ingestion/list_ingestions.rs | 59 -- src/command/ingestion/mod.rs | 41 -- src/command/mod.rs | 6 - src/command/substance/mod.rs | 33 - src/lib/migration/mod.rs | 2 +- src/lib/mod.rs | 4 +- src/main.rs | 131 +--- src/view_model/mod.rs | 2 - src/view_model/substance.rs | 29 - 21 files changed, 325 insertions(+), 926 deletions(-) delete mode 100644 resources/small.flf rename src/{lib => cli}/formatter.rs (97%) rename src/{command => cli}/ingestion/delete_ingestion.rs (79%) create mode 100644 src/cli/ingestion/list_ingestions.rs rename src/{command => cli}/ingestion/log_ingestion.rs (86%) rename src/{view_model/ingestion.rs => cli/ingestion/mod.rs} (54%) rename src/{command => cli}/ingestion/update_ingestion.rs (90%) create mode 100644 src/cli/mod.rs rename src/{command => cli}/substance/get_substance.rs (90%) create mode 100644 src/cli/substance/mod.rs delete mode 100644 src/command/ingestion/list_ingestions.rs delete mode 100644 src/command/ingestion/mod.rs delete mode 100644 src/command/mod.rs delete mode 100644 src/command/substance/mod.rs delete mode 100644 src/view_model/mod.rs delete mode 100644 src/view_model/substance.rs diff --git a/Cargo.toml b/Cargo.toml index 564e0e3c..fce1baf7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,6 @@ date_time_parser = "0.2.0" delegate = "0.13.1" derivative = "2.2.0" directories = { version = "5.0.1" } -figlet-rs = "0.1.5" float-pretty-print = "0.1.1" futures = "0.3.31" hashbrown = "0.15.2" diff --git a/docs/assets/log_ingestion_preview.png b/docs/assets/log_ingestion_preview.png index 34a58b4ff5479294a6b20051b52bd4c74946af6c..000c149a00260ba7bdd7c7ef39f765eb9720c67f 100644 GIT binary patch literal 53631 zcmeFZcT`i`+ckyKG6{HjJfPzT1(3^DWAU!k-gd+&3C{2o}fb>piAxeM< z2vLyUq?ZtCLLiXjTfuXF?|bhb_m4Zi@r`lsc=vEP0_^Ov_OqU6K6B2spBw6Hojk#F zf`NhIr1q^FcNrLt@i8zQY-cVEuAaSCJ4n+E$@oat23ojy91S{`{&hV9AsRfI0pg@xqq>U;HW?%bDks{h$b z+Ct_TO!%Tm>AmdWis;*;(+UUwe5yOncVPe18N2_l1WIw~nCOqLt(CFe`(9qFl96oTa*<_) zh9X6tB&9zy;+jRdsTiD1B9cw@q)?;O)vN22WSj7vu7Famt~(D&C;UF7z_rz zw&s17oBQ}csST^Wy*=Lg=Kc{LCoSM`OghODCl4JuWc%=;2w`hWIDsp+HNtnYISLiJ z_WP?S-dc-C;nN-Ogm ztN+p4%O2A@H8MRtJrOqh)}*^CWGqGbiTxqnE%(rTLlG74>9#oU<-u~ch(GyZ4Z|sE z%~#_&#=|LYer9#0A)G>%DMeAq)nF8SdwW+n7LF#OKMUJV|NN*G758TVxIIT}PsQ^o zp7tDXI)?BV*;)d7tp`7|wmvs>6sFL9$G`xq_Cn1dOSRbfPl~#J zvcv`@(4C%|*0dh+&=#vHwIlPLsh^T zAf%PC2Iu%}y9=}=rQ>|_?-2+R*A#Yga?((Ya|EgM=ejoAT3T+rE|2ume6vRzU?X?s zAneB(Uh{yn%sEf1UAS-oZ_WD8!RI^Pine3bv)3SZ4@_9X?-!F4WlpK|zXw4lg~gvp zoMt|>zo%iA+d#?N@G;rw2c-(=i6quLW}i3LU#|0MSUa&PbaxeOV+RLK8wURD{b2lZ zr>SusjJ=;{xrghM%R2mUO?4>q1X&5*~er>3U(z{_Ess8U;>Wh_g<| z1uE4s=FMO2mUd*2)}Pm@PtX15^4}bbUp#m9{&B%VqPqKywPcoaZg|DI-|AZbR<4Y5 zqTb9#0-Z}yXA2@Dt0P}l?~UpDsz`i(eD&W-b{&#(*}F)t%5`ToxVc#@j**}1KI7&8 zoZ{CA`s#gd<7$QIva4>XFr{ww|GGi#G3?T83NX3$${DEAclb5cpxPjlrGNvT}FQ9>2dDPf2;4pVWcBUUiu-k(Nm21%yIrs@xK}F z{^v9)`O(wv+0(kHJdHNLZBu;kY-i^Q{z5Z0A$!IDx=$}wOwr@3VG%WkK5~mcuFj+n zl#Bki<8wc;l4)-1@%Ye96lLYn;Md3x2xI$iR~dcZqeZGf=13g$B%?qfF~HLBUqDc0 z6%i5PwUq55G`+C!uo%kc%)}c~Fp50^cC%(?%0D*k{_n1SPr2v4mseLy8F?TY-(a3X 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 diff --git a/resources/small.flf b/resources/small.flf deleted file mode 100644 index 901160bf..00000000 --- a/resources/small.flf +++ /dev/null @@ -1,569 +0,0 @@ -flf2a$ 5 4 20 0 16 -Font : Dr. Pepper (after a name in one sig done in this style). -Author: Eero Tamminen, t150315@cc.tut.fi. - -Characters '#' and '&' are lousy and I'm not very satisfied -with the '$' or 't'... Suggestions? - -Explanation of first line: -flf2 - "magic number" for file identifiction -a - should always be `a', for now -$ - the "hardblank" -- prints s a blank, but can't be smushed -5 - height of a character -4 - height of a character, not including descenders -20 - max line length (excluding comment lines) + fudge factor -0 - default smushmode for this font -16 - number of comment lines - -$@ -$@ -$@ -$@ -$@@ - _ @ -| |@ -|_/@ -<_>@ - @@ - _ _@ -|/|/@ - @ - @ - @@ - @ -$_|_|_$@ -$_|_|_$@ - | | @ - @@ - @ - ||_@ -<_-<@ -/__/@ - || @@ - __@ -<>/ /@ - / / @ -/_/<>@ - @@ - _ @ -< > @ -/.\/$@ -\_/\$@ - @@ - _@ -|/@ - @ - @ - @@ - __@ - / /@ -| | @ -| | @ - \_\@@ -__ @ -\ \ @ - | |@ - | |@ -/_/ @@ - @ -_/\_@ -> <@ - \/ @ - @@ - _ @ - _| |_ @ -|_ _|@ - |_| @ - @@ - @ - @ - _@ -|/@ - @@ - @ - ___ @ -|___|@ - @ - @@ - @ - @ - _ @ -<_>@ - @@ - __@ - / /@ - / / @ -/_/ @ - @@ - ___ @ -| |@ -| / |@ -`___'@ - @@ - _ @ -/ |@ -| |@ -|_|@ - @@ - ___ @ -<_ >@ - / / @ -<___>@ - @@ - ____@ -<__ /@ - <_ \@ -<___/@ - @@ - __ @ - /. | @ -/_ .|@ - |_| @ - @@ - ___ @ -| __|@ -`__ \@ -|___/@ - @@ - ___ @ -| __>@ -| . \@ -`___/@ - @@ - ___ @ -|_ |@ - / / @ -/_/ @ - @@ - ___ @ -< . >@ -/ . \@ -\___/@ - @@ - ___ @ -| . |@ -`_ /@ - /_/ @ - @@ - _ @ -<_>@ - _ @ -<_>@ - @@ - _ @ -<_>@ - _ @ -|/ @ - @@ - __@ - / /@ -< < @ - \_\@ - @@ - ___ @ -|___|@ - ___ @ -|___|@ - @@ -__ @ -\ \ @ - > >@ -/_/ @ - @@ - ___ @ -<_. >@ - /_/ @ - <_> @ - @@ - ___ @ -| "|@ -| \_|@ -`___/@ - @@ - ___ @ -| . |@ -| |@ -|_|_|@ - @@ - ___ @ -| . >@ -| . \@ -|___/@ - @@ - ___ @ -| _>@ -| <__@ -`___/@ - @@ - ___ @ -| . \@ -| | |@ -|___/@ - @@ - ___ @ -| __>@ -| _> @ -|___>@ - @@ - ___ @ -| __>@ -| _> @ -|_| @ - @@ - ___ @ -/ _> @ -| <_/\@ -`____/@ - @@ - _ _ @ -| | |@ -| |@ -|_|_|@ - @@ - _ @ -| |@ -| |@ -|_|@ - @@ - _ @ - | |@ -_| |@ -\__/@ - @@ - _ __@ -| / /@ -| \ @ -|_\_\@ - @@ - _ @ -| | @ -| |_ @ -|___|@ - @@ - __ __ @ -| \ \@ -| |@ -|_|_|_|@ - @@ - _ _ @ -| \ |@ -| |@ -|_\_|@ - @@ - ___ @ -| . |@ -| | |@ -`___'@ - @@ - ___ @ -| . \@ -| _/@ -|_| @ - @@ - ___ @ -| . |@ -| | |@ -`___\@ - @@ - ___ @ -| . \@ -| /@ -|_\_\@ - @@ - ___ @ -/ __>@ -\__ \@ -<___/@ - @@ - ___ @ -|_ _|@ - | | @ - |_| @ - @@ - _ _ @ -| | |@ -| ' |@ -`___'@ - @@ - _ _ @ -| | |@ -| ' |@ -|__/ @ - @@ - _ _ _ @ -| | | |@ -| | | |@ -|__/_/ @ - @@ -__ _$@ -\ \/ @ - \ \ @ -_/\_\ @ - @@ - _ _ @ -| | |@ -\ /@ - |_| @ - @@ - ____@ -|_ /@ - / / @ -/___|@ - @@ - ___ @ -| _|@ -| | @ -| |_ @ -|___|@@ -__ @ -\ \ @ - \ \ @ - \_\@ - @@ - ___ @ -|_ |@ - | |@ - _| |@ -|___|@@ - /\ @ -@ - @ - @ - @@ - @ - @ - ___ @ -|___|@ - @@ -_ @ -\|@ - @ - @ - @@ - @ - ___ @ -<_> |@ -<___|@ - @@ - _ @ -| |_ @ -| . \@ -|___/@ - @@ - @ - ___ @ -/ | '@ -\_|_.@ - @@ - _ @ - _| |@ -/ . |@ -\___|@ - @@ - @ - ___ @ -/ ._>@ -\___.@ - @@ - ___ @ -| | '@ -| |- @ -|_| @ - @@ - @ - ___ @ -/ . |@ -\_. |@ -<___'@@ - _ @ -| |_ @ -| . |@ -|_|_|@ - @@ - _ @ -<_>@ -| |@ -|_|@ - @@ - _ @ - <_>@ - | |@ - | |@ -<__'@@ - _ @ -| |__@ -| / /@ -|_\_\@ - @@ - _ @ -| |@ -| |@ -|_|@ - @@ - @ -._ _ _ @ -| ' ' |@ -|_|_|_|@ - @@ - @ -._ _ @ -| ' |@ -|_|_|@ - @@ - @ - ___ @ -/ . \@ -\___/@ - @@ - @ - ___ @ -| . \@ -| _/@ -|_| @@ - @ - ___ @ -/ . |@ -\_ |@ - |_|@@ - @ - _ _ @ -| '_>@ -|_| @ - @@ - @ - ___@ -<_-<@ -/__/@ - @@ - _ @ -$_| |_$@ - | | @ - |_| @ - @@ - @ - _ _ @ -| | |@ -`___|@ - @@ - @ - _ _ @ -| | |@ -|__/ @ - @@ - @ - _ _ _ @ -| | | |@ -|__/_/ @ - @@ - @ -__ @ -\ \/@ -/\_\@ - @@ - @ - _ _ @ -| | |@ -`_. |@ -<___'@@ - @ -.___@ - / /@ -/___@ - @@ - __@ - / /@ -/ | @ -\ | @ - \_\@@ -||@ -||@ -||@ -||@ - @@ -__ @ -\ \ @ - | \@ - | /@ -/_/ @@ - @ - /\/|@ -|/\/ @ - @ - @@ -<>_<>@ -| . |@ -| |@ -|_|_|@ - @@ -<>_<>@ -| . |@ -| | |@ -`___'@ - @@ -<>_<>@ -| | |@ -| ' |@ -`___'@ - @@ - @ -<>_<>@ -`_> |@ -<___|@ - @@ - @ -<>_<>@ -/ . \@ -\___/@ - @@ - @ -<>_<>@ -| | |@ -`___|@ - @@ - ___ @ -| . >@ -| . \@ -| ._/@ -|_| @@ -196 -<>_<>@ -| . |@ -| |@ -|_|_|@ - @@ -214 -<>_<>@ -| . |@ -| | |@ -`___'@ - @@ -220 -<>_<>@ -| | |@ -| ' |@ -`___'@ - @@ -223 - ___ @ -| . >@ -| . \@ -| ._/@ -|_| @@ -228 - @ -<>_<>@ -`_> |@ -<___|@ - @@ -246 - @ -<>_<>@ -/ . \@ -\___/@ - @@ -252 - @ -<>_<>@ -| | |@ -`___|@ - @@ diff --git a/src/lib/formatter.rs b/src/cli/formatter.rs similarity index 97% rename from src/lib/formatter.rs rename to src/cli/formatter.rs index c3367a36..61fa41ed 100644 --- a/src/lib/formatter.rs +++ b/src/cli/formatter.rs @@ -1,4 +1,4 @@ -use crate::OutputFormat; +use crate::cli::OutputFormat; use serde::Serialize; use tabled::Table; use tabled::Tabled; diff --git a/src/command/ingestion/delete_ingestion.rs b/src/cli/ingestion/delete_ingestion.rs similarity index 79% rename from src/command/ingestion/delete_ingestion.rs rename to src/cli/ingestion/delete_ingestion.rs index 6f026ee2..ee28e374 100644 --- a/src/command/ingestion/delete_ingestion.rs +++ b/src/cli/ingestion/delete_ingestion.rs @@ -8,7 +8,8 @@ use sea_orm::EntityTrait; use sea_orm::prelude::async_trait::async_trait; #[derive(Parser, Debug)] -#[command(version, about = "Manage ingestions", long_about)] +#[command(version, about = "Delete selected ingestion", long_about, aliases = vec!["rm", "del", + "remove"])] pub struct DeleteIngestion { #[arg( @@ -16,7 +17,7 @@ pub struct DeleteIngestion value_name = "INGESTION_ID", help = "ID of the ingestion to delete" )] - pub ingestion_identifier: i32, + pub ingestion_id: i32, } #[async_trait] @@ -24,7 +25,7 @@ impl CommandHandler for DeleteIngestion { async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> { - let delete_ingestion = Ingestion::delete_by_id(self.ingestion_identifier) + let delete_ingestion = Ingestion::delete_by_id(self.ingestion_id) .exec(context.database_connection) .await; @@ -38,7 +39,7 @@ impl CommandHandler for DeleteIngestion info!( "Successfully deleted ingestion with ID {}.", - self.ingestion_identifier + self.ingestion_id ); Ok(()) diff --git a/src/cli/ingestion/list_ingestions.rs b/src/cli/ingestion/list_ingestions.rs new file mode 100644 index 00000000..79e7367d --- /dev/null +++ b/src/cli/ingestion/list_ingestions.rs @@ -0,0 +1,46 @@ +use crate::cli::formatter::FormatterVector; +use crate::cli::ingestion::IngestionViewModel; +use crate::lib::CommandHandler; +use crate::lib::Context; +use crate::lib::orm::ingestion; +use crate::lib::orm::prelude::Ingestion; +use clap::Parser; +use sea_orm::EntityTrait; +use sea_orm::QueryOrder; +use sea_orm::QuerySelect; +use sea_orm::prelude::async_trait::async_trait; + +#[derive(Parser, Debug)] +#[command(version, about = "List all ingestions", long_about, aliases = vec!["ls", "get"])] +pub struct ListIngestion +{ + /// Defines the amount of ingestion to display + #[arg(short = 'l', long, default_value_t = 10)] + pub limit: u64, + // TODO: Query order by field +} + +#[async_trait] +impl CommandHandler for ListIngestion +{ + async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> + { + let ingestions = Ingestion::find() + .order_by_desc(ingestion::Column::IngestedAt) + .limit(Some(self.limit)) + .all(context.database_connection) + .await + .map_err(|e| e.to_string()) + .unwrap() + .iter() + .map(|i| IngestionViewModel::from(i.clone())) + .collect(); + + println!( + "{}", + FormatterVector::new(ingestions).format(context.stdout_format) + ); + + Ok(()) + } +} diff --git a/src/command/ingestion/log_ingestion.rs b/src/cli/ingestion/log_ingestion.rs similarity index 86% rename from src/command/ingestion/log_ingestion.rs rename to src/cli/ingestion/log_ingestion.rs index d47304ca..8106a55f 100644 --- a/src/command/ingestion/log_ingestion.rs +++ b/src/cli/ingestion/log_ingestion.rs @@ -1,17 +1,15 @@ +use crate::cli::formatter::Formatter; +use crate::cli::ingestion::IngestionViewModel; +use crate::lib::CommandHandler; +use crate::lib::Context; use crate::lib::dosage::Dosage; -use crate::lib::formatter::Formatter; use crate::lib::orm::ingestion; use crate::lib::orm::prelude::Ingestion; use crate::lib::parse_date_string; use crate::lib::route_of_administration::RouteOfAdministrationClassification; -use crate::lib::CommandHandler; -use crate::lib::Context; -use crate::view_model::ingestion::IngestionViewModel; -use crate::OutputFormat; use chrono::DateTime; use chrono::Local; use clap::Parser; -use log::error; use measurements::Measurement; use miette::IntoDiagnostic; use sea_orm::ActiveModelTrait; @@ -43,9 +41,9 @@ providing insights into the long-term effects of different substances on physica #[derive(Parser, Debug)] #[command( version, - about = "Store information about new ingestion", + about = "Create a new ingestion record", long_about, - aliases = vec!["create", "add"] + aliases = vec!["create", "add", "make", "new", "mk"] )] pub struct LogIngestion { @@ -86,11 +84,16 @@ impl CommandHandler for LogIngestion let pubchem = pubchem::Compound::with_name(&self.substance_name) .title() .into_diagnostic()?; - let created_ingestion = Ingestion::insert(ingestion::ActiveModel { + + let ingestion: IngestionViewModel = Ingestion::insert(ingestion::ActiveModel { id: ActiveValue::default(), substance_name: ActiveValue::Set(pubchem.to_lowercase()), route_of_administration: ActiveValue::Set( - serde_json::to_value(&self.route_of_administration).unwrap().as_str().unwrap().to_string(), + serde_json::to_value(&self.route_of_administration) + .unwrap() + .as_str() + .unwrap() + .to_string(), ), dosage: ActiveValue::Set(self.dosage.as_base_units() as f32), ingested_at: ActiveValue::Set(self.ingestion_date.to_utc().naive_local()), @@ -99,15 +102,10 @@ impl CommandHandler for LogIngestion }) .exec_with_returning(context.database_connection) .await - .into_diagnostic(); - - if let Err(e) = created_ingestion - { - error!("Failed to create ingestion: {}", e); - return Err(e); - } + .into_diagnostic()? + .into(); - println!("{}", IngestionViewModel::from(created_ingestion?).format(context.stdout_format)); + println!("{}", ingestion.format(context.stdout_format)); Ok(()) } diff --git a/src/view_model/ingestion.rs b/src/cli/ingestion/mod.rs similarity index 54% rename from src/view_model/ingestion.rs rename to src/cli/ingestion/mod.rs index 51cc08a9..48feae8d 100644 --- a/src/view_model/ingestion.rs +++ b/src/cli/ingestion/mod.rs @@ -1,20 +1,61 @@ +use crate::lib::CommandHandler; +use crate::lib::Context; +use clap::Parser; +use clap::Subcommand; +use sea_orm::prelude::async_trait::async_trait; + +mod delete_ingestion; +mod list_ingestions; +mod log_ingestion; +mod update_ingestion; + +#[derive(Debug, Subcommand)] +pub enum IngestionCommands +{ + Log(log_ingestion::LogIngestion), + List(list_ingestions::ListIngestion), + Delete(delete_ingestion::DeleteIngestion), + Update(update_ingestion::UpdateIngestion), +} + +#[derive(Debug, Parser)] +pub struct IngestionCommand +{ + #[command(subcommand)] + commands: IngestionCommands, +} + +#[async_trait] +impl CommandHandler for IngestionCommand +{ + async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> + { + match &self.commands + { + | IngestionCommands::Log(log_ingestion) => log_ingestion.handle(context).await, + | IngestionCommands::List(list_ingestions) => list_ingestions.handle(context).await, + | IngestionCommands::Delete(delete_ingestion) => delete_ingestion.handle(context).await, + | IngestionCommands::Update(update_ingestion) => update_ingestion.handle(context).await, + } + } +} + +use crate::cli::formatter::Formatter; use crate::lib::dosage::Dosage; -use crate::lib::formatter::Formatter; use crate::lib::orm::ingestion; use crate::lib::route_of_administration::RouteOfAdministrationClassification; -use chrono::{DateTime, Local, TimeZone}; +use chrono::DateTime; +use chrono::Local; +use chrono::TimeZone; use chrono_humanize::HumanTime; use core::convert::From; use serde::Deserialize; use serde::Serialize; use std::fmt::Debug; -use std::fmt::Display; use tabled::Tabled; use typed_builder::TypedBuilder; -fn display_date(date: &DateTime) -> String { - HumanTime::from(*date).to_string() -} +fn display_date(date: &DateTime) -> String { HumanTime::from(*date).to_string() } #[derive(Debug, Serialize, Deserialize, Tabled, TypedBuilder)] pub struct IngestionViewModel @@ -37,7 +78,7 @@ impl Formatter for IngestionViewModel {} // TODO: Rethink need for view models // Direct implementation of display functions // can be added to domain model which would replace -// view model completly +// view model completely impl From for IngestionViewModel { fn from(model: ingestion::Model) -> Self diff --git a/src/command/ingestion/update_ingestion.rs b/src/cli/ingestion/update_ingestion.rs similarity index 90% rename from src/command/ingestion/update_ingestion.rs rename to src/cli/ingestion/update_ingestion.rs index 4d02a7df..599298bf 100644 --- a/src/command/ingestion/update_ingestion.rs +++ b/src/cli/ingestion/update_ingestion.rs @@ -1,29 +1,27 @@ +use crate::cli::formatter::Formatter; +use crate::cli::ingestion::IngestionViewModel; +use crate::lib::CommandHandler; +use crate::lib::Context; use crate::lib::dosage::Dosage; -use crate::lib::formatter::Formatter; use crate::lib::orm::ingestion; use crate::lib::orm::prelude::Ingestion; use crate::lib::parse_date_string; use crate::lib::route_of_administration::RouteOfAdministrationClassification; -use crate::lib::CommandHandler; -use crate::lib::Context; -use crate::view_model::ingestion::IngestionViewModel; -use crate::view_model::substance::ViewModel; -use crate::OutputFormat; use chrono::DateTime; use chrono::Local; use clap::Parser; use log::info; use measurements::Measurement; -use miette::miette; use miette::IntoDiagnostic; -use sea_orm::prelude::async_trait::async_trait; +use miette::miette; use sea_orm::ActiveModelTrait; use sea_orm::ActiveValue; use sea_orm::EntityTrait; +use sea_orm::prelude::async_trait::async_trait; use std::str::FromStr; #[derive(Parser, Debug)] -#[command(version, about = "Update an existing ingestion")] +#[command(version, about = "Update an existing ingestion", aliases = vec![ "edit"])] pub struct UpdateIngestion { /// ID of the ingestion to update @@ -54,7 +52,6 @@ impl CommandHandler for UpdateIngestion { async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> { - // Attempt to fetch the record by ID if Ingestion::find_by_id(self.ingestion_identifier) .one(context.database_connection) .await @@ -103,7 +100,10 @@ impl CommandHandler for UpdateIngestion self.ingestion_identifier ); - println!("{}", IngestionViewModel::from(updated_record).format(context.stdout_format)); + println!( + "{}", + IngestionViewModel::from(updated_record).format(context.stdout_format) + ); Ok(()) } diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 00000000..0c967824 --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,128 @@ +use crate::cli::ingestion::IngestionCommand; +use crate::cli::substance::SubstanceCommand; +use atty::Stream; +use clap::ColorChoice; +use clap::CommandFactory; +use clap::Parser; +use clap::Subcommand; +use sea_orm::prelude::async_trait::async_trait; + +pub mod formatter; +mod ingestion; +mod substance; + +use crate::lib::CommandHandler; +use crate::lib::Context; +pub use substance::get_substance::GetSubstance; + +fn is_interactive() -> bool { atty::is(Stream::Stdout) } + +#[derive(clap::ValueEnum, Clone, Debug)] +/// The output format specifies how application data is presented: +/// +/// - `Pretty`: Used in interactive shells to display data in a visually +/// appealing table format. +/// - `Json`: Used in non-interactive shells (e.g., scripts or when data is +/// piped) to provide raw JSON for automated parsing. +pub enum OutputFormat +{ + /// Pretty printed tables + Pretty, + /// JSON formatted output + Json, + // TODO: Application may support custom templates like liquidless or smth +} + +impl Default for OutputFormat +{ + fn default() -> Self + { + if is_interactive() + { + OutputFormat::Pretty + } + else + { + OutputFormat::Json + } + } +} + + +fn default_complete_shell() -> clap_complete::Shell +{ + clap_complete::shells::Shell::from_env().unwrap_or(clap_complete::Shell::Bash) +} + +#[derive(Debug, Parser)] +struct GenerateCompletion +{ + /// The shell to generate the completions for + #[arg(value_enum, default_value_t=default_complete_shell())] + shell: clap_complete::Shell, +} + +#[async_trait] +impl CommandHandler for GenerateCompletion +{ + async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> + { + clap_complete::generate( + self.shell, + &mut CLI::command(), + env!("CARGO_BIN_NAME"), + &mut std::io::stdout(), + ); + Ok(()) + } +} + + +#[async_trait] +impl CommandHandler for ApplicationCommands +{ + async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> + { + match self + { + | ApplicationCommands::Ingestion(ingestion_command) => + { + ingestion_command.handle(context).await + } + | ApplicationCommands::Substance(cmd) => cmd.handle(context).await, + | ApplicationCommands::Completions(cmd) => cmd.handle(context).await, + } + } +} + + +#[derive(Subcommand)] +pub enum ApplicationCommands +{ + Ingestion(IngestionCommand), + Substance(SubstanceCommand), + Completions(GenerateCompletion), +} + +/// 🧬 Intelligent dosage tracker application with purpose to monitor +/// supplements, nootropics and psychoactive substances along with their +/// long-term influence on one's mind and body. +#[derive(Parser)] +#[command( + version = env!("CARGO_PKG_VERSION"), + about = "🧬 Intelligent dosage tracker application with purpose to monitor supplements, nootropics and psychoactive substances along with their long-term influence on one's mind and body.", + long_about, + color = ColorChoice::Auto, +)] +pub struct CLI +{ + #[command(subcommand)] + pub command: ApplicationCommands, + + /// Pretty-print or return raw version of data in JSON + #[arg(short, long = "format", value_enum, default_value_t = OutputFormat::default())] + pub format: OutputFormat, + + #[command(flatten)] + verbose: clap_verbosity_flag::Verbosity, +} diff --git a/src/command/substance/get_substance.rs b/src/cli/substance/get_substance.rs similarity index 90% rename from src/command/substance/get_substance.rs rename to src/cli/substance/get_substance.rs index 3998fed4..9f01292b 100644 --- a/src/command/substance/get_substance.rs +++ b/src/cli/substance/get_substance.rs @@ -39,34 +39,29 @@ impl CommandHandler for GetSubstance { async fn handle<'a>(&self, context: Context<'a>) -> Result { - // Step 1: Fetch the substance from the database let db_substance = substance::Entity::find() .filter(substance::Column::Name.contains(self.substance_name.to_lowercase())) .one(context.database_connection) .await .into_diagnostic()?; - // Return an error if substance is not found let db_substance = match db_substance { | Some(substance) => substance, | None => return Err(miette!("Error: Substance not found.")), }; - // Step 2: Fetch routes of administration let routes_of_administration = db_substance .find_related(orm::substance_route_of_administration::Entity) .all(context.database_connection) .await .into_diagnostic()?; - // Create an empty Substance struct let mut substance = crate::lib::substance::Substance { name: db_substance.name, routes_of_administration: crate::lib::substance::RoutesOfAdministration::new(), }; - // Step 3: Resolve detailed data for each route concurrently let db_connection = context.database_connection.clone(); let route_futures = routes_of_administration.into_iter().map(|route| { let db = db_connection.clone(); @@ -80,7 +75,6 @@ impl CommandHandler for GetSubstance phases: Default::default(), }; - // Fetch dosages for the route let dosages = route .find_related(orm::substance_route_of_administration_dosage::Entity) .all(&db) @@ -109,7 +103,6 @@ impl CommandHandler for GetSubstance ); } - // Fetch phases for the route let phases = route .find_related(orm::substance_route_of_administration_phase::Entity) .all(&db) @@ -138,7 +131,6 @@ impl CommandHandler for GetSubstance } }); - // Use `FuturesUnordered` to manage multiple concurrent tasks efficiently let mut route_stream = FuturesUnordered::from_iter(route_futures); while let Some(result) = route_stream.next().await @@ -151,11 +143,10 @@ impl CommandHandler for GetSubstance .routes_of_administration .insert(classification, roa); } - | Err(e) => return Err(e), // Return early on error + | Err(e) => return Err(e), } } - // Print or return the final substance print!("{}", &substance.to_string()); Ok(substance) } @@ -165,8 +156,8 @@ impl CommandHandler for GetSubstance mod tests { use super::*; - use crate::OutputFormat; - use crate::command::GetSubstance; + use crate::cli::GetSubstance; + use crate::cli::OutputFormat; use crate::lib::Context; use crate::lib::DATABASE_CONNECTION; use crate::lib::migrate_database; @@ -179,7 +170,6 @@ mod tests let context = Context { database_connection: &DATABASE_CONNECTION, stdout_format: OutputFormat::Pretty, - is_interactive: false, }; diff --git a/src/cli/substance/mod.rs b/src/cli/substance/mod.rs new file mode 100644 index 00000000..47f20b2e --- /dev/null +++ b/src/cli/substance/mod.rs @@ -0,0 +1,62 @@ +pub mod get_substance; + +use crate::lib::CommandHandler; +use crate::lib::Context; +use clap::Parser; +use clap::Subcommand; +use sea_orm::prelude::async_trait::async_trait; + +#[derive(Debug, Subcommand)] +enum SubstanceCommands +{ + Get(crate::cli::GetSubstance), +} + +#[derive(Debug, Parser)] +pub struct SubstanceCommand +{ + #[command(subcommand)] + commands: SubstanceCommands, +} + +#[async_trait] +impl CommandHandler for SubstanceCommand +{ + async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> + { + match &self.commands + { + | SubstanceCommands::Get(command) => command.handle(context).await.map(|_| ()), + } + } +} + +use crate::cli::formatter::Formatter; +use serde::Deserialize; +use serde::Serialize; +use tabled::Tabled; +use typed_builder::TypedBuilder; + +type SubstanceTable = crate::lib::orm::substance::Model; + +#[derive(Debug, Serialize, Deserialize, Tabled, TypedBuilder)] +pub struct ViewModel +{ + pub id: String, + pub name: String, + pub common_names: String, +} + +impl Formatter for ViewModel {} + +impl From for ViewModel +{ + fn from(model: SubstanceTable) -> Self + { + ViewModel { + id: model.id.clone().chars().take(6).collect(), + name: model.name, + common_names: model.common_names.clone(), + } + } +} diff --git a/src/command/ingestion/list_ingestions.rs b/src/command/ingestion/list_ingestions.rs deleted file mode 100644 index d04d879b..00000000 --- a/src/command/ingestion/list_ingestions.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::lib::formatter::FormatterVector; -use crate::lib::orm::ingestion; -use crate::lib::orm::prelude::Ingestion; -use crate::lib::CommandHandler; -use crate::lib::Context; -use crate::view_model::ingestion::IngestionViewModel; -use crate::view_model::substance::ViewModel; -use async_std::task::block_on; -use clap::Parser; -use log::warn; -use sea_orm::prelude::async_trait::async_trait; -use sea_orm::EntityTrait; -use sea_orm::QueryOrder; -use sea_orm::QuerySelect; - -#[derive(Parser, Debug)] -#[command(version, about = "List all ingestions", long_about)] -pub struct ListIngestion -{ - /// Defines the amount of ingestion to display - #[arg(short = 'l', long, default_value_t = 10)] - pub limit: u64, - // TODO: Query order by field - // TODO: Return format (JSON/Pretty) -} - -#[async_trait] -impl CommandHandler for ListIngestion -{ - async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> - { - let ingestions = block_on(async { - Ingestion::find() - .order_by_desc(ingestion::Column::IngestedAt) - .limit(Some(self.limit)) - .all(context.database_connection) - .await - .map_err(|e| e.to_string()) - }) - .unwrap(); - - if ingestions.is_empty() - { - warn!("No ingestions found."); - return Ok(()); - } - - let view_models: Vec = ingestions - .iter() - .map(|i| IngestionViewModel::from(i.clone())) - .collect(); - - let formatted = FormatterVector::new(view_models).format(context.stdout_format); - - println!("{}", formatted); - - Ok(()) - } -} diff --git a/src/command/ingestion/mod.rs b/src/command/ingestion/mod.rs deleted file mode 100644 index 944f813e..00000000 --- a/src/command/ingestion/mod.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::lib::CommandHandler; -use crate::lib::Context; -use clap::Parser; -use clap::Subcommand; -use sea_orm::prelude::async_trait::async_trait; - -mod delete_ingestion; -mod list_ingestions; -mod log_ingestion; -mod update_ingestion; - -#[derive(Debug, Subcommand)] -pub enum IngestionCommands -{ - Log(log_ingestion::LogIngestion), - List(list_ingestions::ListIngestion), - Delete(delete_ingestion::DeleteIngestion), - Update(update_ingestion::UpdateIngestion), -} - -#[derive(Debug, Parser)] -pub struct IngestionCommand -{ - #[command(subcommand)] - commands: IngestionCommands, -} - -#[async_trait] -impl CommandHandler for IngestionCommand -{ - async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> - { - match &self.commands - { - | IngestionCommands::Log(log_ingestion) => log_ingestion.handle(context).await, - | IngestionCommands::List(list_ingestions) => list_ingestions.handle(context).await, - | IngestionCommands::Delete(delete_ingestion) => delete_ingestion.handle(context).await, - | IngestionCommands::Update(update_ingestion) => update_ingestion.handle(context).await, - } - } -} diff --git a/src/command/mod.rs b/src/command/mod.rs deleted file mode 100644 index e2c7f68a..00000000 --- a/src/command/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod ingestion; -mod substance; - -pub use ingestion::IngestionCommand; -pub use substance::GetSubstance; -pub use substance::SubstanceCommand; diff --git a/src/command/substance/mod.rs b/src/command/substance/mod.rs deleted file mode 100644 index 88dc9429..00000000 --- a/src/command/substance/mod.rs +++ /dev/null @@ -1,33 +0,0 @@ -pub mod get_substance; - -pub use crate::command::substance::get_substance::GetSubstance; -use crate::lib::CommandHandler; -use crate::lib::Context; -use clap::Parser; -use clap::Subcommand; -use sea_orm::prelude::async_trait::async_trait; - -#[derive(Debug, Subcommand)] -enum SubstanceCommands -{ - Get(crate::command::GetSubstance), -} - -#[derive(Debug, Parser)] -pub struct SubstanceCommand -{ - #[command(subcommand)] - commands: SubstanceCommands, -} - -#[async_trait] -impl CommandHandler for SubstanceCommand -{ - async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> - { - match &self.commands - { - | SubstanceCommands::Get(command) => command.handle(context).await.map(|_| ()), - } - } -} diff --git a/src/lib/migration/mod.rs b/src/lib/migration/mod.rs index 211350e2..e8786251 100644 --- a/src/lib/migration/mod.rs +++ b/src/lib/migration/mod.rs @@ -81,7 +81,7 @@ impl MigratorTrait for Migrator M20250108183655UpdateRouteOfAdministrationClassificationValues, "20250108183655_update_route_of_administration_classification_values", "20250108183655_update_route_of_administration_classification_values" - ) + ), ] } } diff --git a/src/lib/mod.rs b/src/lib/mod.rs index bc7cbfe1..9f7fc9fd 100644 --- a/src/lib/mod.rs +++ b/src/lib/mod.rs @@ -1,4 +1,4 @@ -use crate::OutputFormat; +use crate::cli::OutputFormat; use async_std::task::block_on; use chrono::Local; use chrono_english::Dialect; @@ -19,7 +19,6 @@ use std::fmt::Debug; use std::path::PathBuf; pub mod dosage; -pub mod formatter; mod migration; pub mod orm; pub mod route_of_administration; @@ -30,7 +29,6 @@ pub struct Context<'a> { pub database_connection: &'a sea_orm::DatabaseConnection, pub stdout_format: OutputFormat, - pub is_interactive: bool, } #[async_trait] diff --git a/src/main.rs b/src/main.rs index 6f478a51..c84ab2b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,143 +2,19 @@ extern crate chrono; extern crate chrono_english; extern crate date_time_parser; -use atty::Stream; +use crate::cli::CLI; use clap::CommandFactory; use clap::Parser; -use clap::Subcommand; -use clap::command; -use lazy_static::lazy_static; use lib::CommandHandler; use lib::Context; use lib::DATABASE_CONNECTION; use lib::migrate_database; use lib::setup_diagnostics; use lib::setup_logger; -use rust_embed::Embed; -use sea_orm::prelude::async_trait::async_trait; -use std::string::ToString; -mod command; +mod cli; mod lib; -mod view_model; -#[derive(Embed)] -#[folder = "resources/"] -pub struct Resources; - -lazy_static! { - pub static ref FIGFONT: figlet_rs::FIGfont = figlet_rs::FIGfont::from_content( - std::str::from_utf8(&Resources::get("small.flf").unwrap().data).unwrap() - ) - .unwrap(); - static ref FIGURE: figlet_rs::FIGure<'static> = FIGFONT.convert("neuronek").unwrap(); -} - -fn is_interactive() -> bool { atty::is(Stream::Stdout) } - -fn default_output_format() -> OutputFormat -{ - if is_interactive() - { - OutputFormat::Pretty - } - else - { - OutputFormat::Json - } -} - -#[derive(clap::ValueEnum, Clone, Debug)] -/// The output format specifies how application data is presented: -/// -/// - `Pretty`: Used in interactive shells to display data in a visually -/// appealing table format. -/// - `Json`: Used in non-interactive shells (e.g., scripts or when data is -/// piped) to provide raw JSON for automated parsing. -pub enum OutputFormat -{ - /// Pretty printed tables - Pretty, - /// JSON formatted output - Json, - // TODO: Application may support custom templates like liquidless or smth -} - - -#[derive(Parser)] -#[command( - version = env!("CARGO_PKG_VERSION"), - about = "🧬 Intelligent dosage tracker application with purpose to monitor supplements, nootropics and psychoactive substances along with their long-term influence on one's mind and body.", - long_about = FIGURE.to_string() -)] -pub struct CLI -{ - #[command(subcommand)] - pub command: ApplicationCommands, - - /// Pretty-print or return raw version of data in JSON - #[arg(short, long = "format", value_enum, default_value_t = default_output_format())] - pub format: OutputFormat, - - #[command(flatten)] - verbose: clap_verbosity_flag::Verbosity, -} - - -fn default_complete_shell() -> clap_complete::Shell -{ - clap_complete::shells::Shell::from_env().unwrap_or(clap_complete::Shell::Bash) -} - -#[derive(Debug, Parser)] -struct GenerateCompletion -{ - /// The shell to generate the completions for - #[arg(value_enum, default_value_t=default_complete_shell())] - shell: clap_complete::Shell, -} - -#[async_trait] -impl CommandHandler for GenerateCompletion -{ - async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> - { - clap_complete::generate( - self.shell, - &mut CLI::command(), - env!("CARGO_BIN_NAME"), - &mut std::io::stdout(), - ); - Ok(()) - } -} - -#[derive(Subcommand)] -pub enum ApplicationCommands -{ - Ingestion(command::IngestionCommand), - Substance(command::SubstanceCommand), - /// Generate shell completions - Completions(GenerateCompletion), -} - - -#[async_trait] -impl CommandHandler for ApplicationCommands -{ - async fn handle<'a>(&self, context: Context<'a>) -> miette::Result<()> - { - match self - { - | ApplicationCommands::Ingestion(ingestion_command) => - { - ingestion_command.handle(context).await - } - | ApplicationCommands::Substance(cmd) => cmd.handle(context).await, - | ApplicationCommands::Completions(cmd) => cmd.handle(context).await, - } - } -} #[async_std::main] async fn main() -> miette::Result<()> @@ -150,7 +26,7 @@ async fn main() -> miette::Result<()> migrate_database(&DATABASE_CONNECTION).await?; - // TODO: Perform a check of completion scripts existance and update them or + // TODO: Perform a check of completion scripts existence and update them or // install them https://askubuntu.com/a/1188315 // https://github.com/scop/bash-completion#faq // https://apple.github.io/swift-argument-parser/documentation/argumentparser/installingcompletionscripts/ @@ -159,7 +35,6 @@ async fn main() -> miette::Result<()> let context = Context { database_connection: &DATABASE_CONNECTION, stdout_format: cli.format, - is_interactive: is_interactive(), }; cli.command.handle(context).await?; diff --git a/src/view_model/mod.rs b/src/view_model/mod.rs deleted file mode 100644 index 5625e1e7..00000000 --- a/src/view_model/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod ingestion; -pub mod substance; diff --git a/src/view_model/substance.rs b/src/view_model/substance.rs deleted file mode 100644 index 8d941741..00000000 --- a/src/view_model/substance.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::lib::formatter::Formatter; -use serde::Deserialize; -use serde::Serialize; -use tabled::Tabled; -use typed_builder::TypedBuilder; - -type SubstanceTable = crate::lib::orm::substance::Model; - -#[derive(Debug, Serialize, Deserialize, Tabled, TypedBuilder)] -pub struct ViewModel -{ - pub id: String, - pub name: String, - pub common_names: String, -} - -impl Formatter for ViewModel {} - -impl From for ViewModel -{ - fn from(model: SubstanceTable) -> Self - { - ViewModel { - id: model.id.clone().chars().take(6).collect(), - name: model.name, - common_names: model.common_names.clone(), - } - } -}