114 lines
2.7 KiB
Rust
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(())
|
|
}
|