journal/journal_cli/src/display.rs
2024-11-25 23:40:36 +00:00

130 lines
3.1 KiB
Rust

use journal::{
journal::JournalType,
types::{
format_dose, Consumer, Dose, Ingestion, IngestionKind, IngestionKinds, Session,
SubstanceIngestion, SustenanceIngestion,
},
};
use crate::formatting::{format_ingestion_time, format_substance_ingestion_roa};
fn print_substance_ingestion(
journal: &JournalType,
ingestion: &Ingestion,
substance_ingestion: &SubstanceIngestion,
) {
let unit = journal.resolve_substance_unit(substance_ingestion).unwrap();
println!(
"Substance|{}|{}|{}|{}|{}",
substance_ingestion.substance_name,
format_dose(&substance_ingestion.dose, &unit),
format_substance_ingestion_roa(substance_ingestion, &unit),
ingestion.consumer,
format_ingestion_time(ingestion)
)
}
fn print_sustenance_ingestion(
journal: &JournalType,
ingestion: &Ingestion,
sustenance_ingestion: &SustenanceIngestion,
) {
let sustenance = journal
.get_sustenance(&sustenance_ingestion.sustenance_id)
.unwrap();
println!(
"Sustenance|{}|{} {}|{}|{}",
sustenance.name,
sustenance_ingestion.amount,
sustenance.unit,
ingestion.consumer,
format_ingestion_time(ingestion)
)
}
pub fn calculate_ingestion_kinds(kind: &mut IngestionKinds) {
//println!("{kind:#?}");
if let IngestionKind::Sustenance(sustenance) = &kind.ingestion {
for kinds in kind.includes.iter_mut() {
match &mut kinds.ingestion {
IngestionKind::Substance(ingestion) => {
ingestion.dose = Dose::new_precise(sustenance.amount) * ingestion.dose.clone();
}
IngestionKind::Sustenance(ingestion) => {
ingestion.amount *= sustenance.amount;
calculate_ingestion_kinds(kinds)
}
IngestionKind::Hydration { amount } => {
*amount = (sustenance.amount * *amount as f64).round() as u64
}
_ => {}
}
}
}
}
pub fn print_ingestion_kinds(
journal: &JournalType,
ingestion: &Ingestion,
kinds: &IngestionKinds,
depth: u64,
) {
for _ in 0..(depth) {
print!(" ");
}
if depth > 0 {
print!("- ");
}
match &kinds.ingestion {
IngestionKind::Unknown => {}
IngestionKind::Substance(substance_ingestion) => {
print_substance_ingestion(journal, ingestion, substance_ingestion);
}
IngestionKind::Sustenance(sustenance_ingestion) => {
print_sustenance_ingestion(journal, ingestion, sustenance_ingestion);
}
IngestionKind::Hydration { amount } => {
println!(
"Hydration|{} ml|{}|{}",
amount,
ingestion.consumer,
format_ingestion_time(ingestion)
)
}
}
for kinds in &kinds.includes {
print_ingestion_kinds(journal, ingestion, kinds, depth + 1);
}
}
pub fn print_ingestion_log(
journal: &JournalType,
session: &Session,
consumer_filter: Option<&Vec<Consumer>>,
) {
let ingestions = journal
.get_session_ingestions(session.id)
.expect("could not find ingestions for session");
for ingestion in ingestions.iter() {
if let Some(consumer_filter) = consumer_filter {
if !consumer_filter.contains(&ingestion.consumer) {
continue;
}
}
let ingestion_kinds = journal
.resolve_ingestion_kind(&ingestion.kind, true)
.unwrap();
println!("{ingestion_kinds:#?}");
print_ingestion_kinds(journal, ingestion, &ingestion_kinds, 0)
}
}