journal/journal_cli/src/commands/print_experience.rs
2024-11-21 13:58:29 +00:00

74 lines
1.7 KiB
Rust

use std::str::FromStr;
use journal::types::Consumer;
use crate::args::Args;
use crate::display::print_ingestion_log;
use crate::formatting::format_experience_title;
use crate::utils::load_journal;
#[derive(Debug, Clone, clap::Args)]
pub struct PrintExperienceArgs {
#[arg(requires = "journal_file")]
pub experience_title: String,
pub _x: (),
#[arg(long)]
pub substance_filter: Option<Vec<String>>,
#[arg(long, value_delimiter = ',')]
pub consumer_filter: Option<Vec<String>>,
}
pub fn parse_consumer_filter(consumer_filter: Option<Vec<String>>) -> Option<Vec<Consumer>> {
match consumer_filter {
Some(consumer_filter) => {
let mut consumers: Vec<Consumer> = Vec::new();
for consumer in consumer_filter.into_iter() {
let mut consumer_name = consumer.as_str();
if consumer_name.is_empty() {
consumer_name = "default";
}
consumers.push(Consumer::from_str(consumer_name).unwrap());
}
Some(consumers)
}
None => None,
}
}
pub fn print_experience(
global_args: &Args,
args: &PrintExperienceArgs,
) -> Result<(), Box<dyn std::error::Error>> {
let journal = load_journal(
&global_args
.journal_file_args
.psychonaut_export_file
.clone()
.unwrap(),
)
.expect("could not load export data");
let experience = journal
.first_experience_by_title(&args.experience_title)
.expect("could not find experience");
//println!("{:#?}", &experience);
println!("{}", format_experience_title(experience));
let substance_filter = args.substance_filter.clone();
let consumer_filter = parse_consumer_filter(args.consumer_filter.clone());
print_ingestion_log(
&journal,
experience,
substance_filter.as_ref(),
consumer_filter.as_ref(),
);
Ok(())
}