journal/journal_cli/src/commands/psychonaut/import/custom_unit.rs
2024-11-27 19:10:02 +00:00

114 lines
2.7 KiB
Rust

use journal::{
journal::JournalType,
types::{CustomUnit, Dose},
};
use super::{
load_journal_and_export_data,
types::{from_administration_route, from_unix_millis},
PsychonautImportGlobalArgs,
};
pub fn create_or_update_custom_unit(
journal: &mut JournalType,
custom_unit: psychonaut_journal_types::CustomUnit,
) {
let unit = CustomUnit {
id: custom_unit.id,
name: custom_unit.name,
substance_name: custom_unit.substance_name,
unit: custom_unit.unit,
original_unit: custom_unit.original_unit,
dose: {
if custom_unit.estimate_standard_deviation.is_some() {
Dose::new_deviation(
custom_unit.dose.unwrap(),
custom_unit.estimate_standard_deviation.unwrap(),
)
} else if custom_unit.is_estimate && custom_unit.dose.is_some() {
Dose::new_estimate(custom_unit.dose.unwrap())
} else if custom_unit.dose.is_some() {
Dose::new_precise(custom_unit.dose.unwrap())
} else {
Dose::new_unknown()
}
},
administration_route: from_administration_route(custom_unit.administration_route),
creation_time: from_unix_millis(custom_unit.creation_time),
is_archived: custom_unit.is_archived,
};
match journal.get_custom_unit(unit.id) {
Some(custom_unit) => {
println!(
"Updating Custom Unit ID: {} Name: {}",
unit.id, custom_unit.name
);
journal.update_custom_unit(unit.id, unit, false);
}
None => {
println!("Creating Custom Unit ID: {} Name: {}", unit.id, unit.name);
journal.update_custom_unit(unit.id, unit, true);
}
}
}
#[derive(Debug, Clone, clap::Args)]
#[group(args = vec!["id", "name"], required = true, multiple = false)]
pub struct PsychonautImportCustomUnitArgs {
#[command(flatten)]
pub import_global_args: PsychonautImportGlobalArgs,
#[arg(long)]
pub id: Option<i32>,
#[arg(long)]
pub name: Option<String>,
}
pub fn psychonaut_import_custom_unit(
args: &PsychonautImportCustomUnitArgs,
) -> Result<(), Box<dyn std::error::Error>> {
let (mut journal, export_data) = load_journal_and_export_data(&args.import_global_args)?;
match (&args.id, &args.name) {
(Some(id), _) => {
let unit = export_data
.custom_units
.into_iter()
.find(|unit| unit.id == *id);
match unit {
Some(unit) => {
create_or_update_custom_unit(&mut journal, unit);
}
None => {
panic!("Could not find custom unit with ID: {id}")
}
}
}
(_, Some(name)) => {
let unit = export_data
.custom_units
.into_iter()
.find(|unit| unit.name == *name);
match unit {
Some(unit) => {
create_or_update_custom_unit(&mut journal, unit);
}
None => {
panic!("Could not find custom unit with name: {name}")
}
}
}
_ => unreachable!(),
}
journal.save()?;
Ok(())
}