use journal::{journal::JSONJournal, types::Consumer}; use crate::{ args::JournalLocation, display::print_ingestion_log, formatting::format_session_title, }; #[derive(Debug, Clone, clap::Args)] #[group(requires = "journal_location")] pub struct PrintSessionArgs { pub session_title: String, #[command(flatten)] pub journal_location: JournalLocation, #[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 = consumer; if consumer.is_empty() { consumer = "default".to_string(); } consumers.push(Consumer::from(consumer.as_str())); } Some(consumers) } None => None, } } pub fn print_session(args: &PrintSessionArgs) -> Result<(), Box<dyn std::error::Error>> { let journal = JSONJournal::load(&args.journal_location.journal_file)?; let session = journal .first_session_by_title(&args.session_title) .expect("could not find session"); //println!("{:#?}", &session); println!("{}", format_session_title(&session)); let substance_filter = args.substance_filter.clone(); let consumer_filter = parse_consumer_filter(args.consumer_filter.clone()); print_ingestion_log( &journal, &session, substance_filter.as_ref(), consumer_filter.as_ref(), ); Ok(()) }